From ba378f5b148ac349b0167d17f458b850711e6907 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 14:21:04 -0400 Subject: [PATCH 01/64] add updated cloud problem --- src/ShockCloud/cloud.cpp | 883 ++++++++++++++++++++++++++++++--------- tests/ShockCloud_32.in | 58 +++ 2 files changed, 747 insertions(+), 194 deletions(-) create mode 100644 tests/ShockCloud_32.in diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index 9fd6e54c7..f4697d08d 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -6,7 +6,9 @@ /// \file cloud.cpp /// \brief Implements a shock-cloud problem with radiative cooling. /// + #include +#include #include #include "AMReX.H" @@ -15,154 +17,127 @@ #include "AMReX_BLassert.H" #include "AMReX_FabArray.H" #include "AMReX_Geometry.H" +#include "AMReX_GpuContainers.H" #include "AMReX_GpuDevice.H" +#include "AMReX_GpuQualifiers.H" #include "AMReX_IntVect.H" +#include "AMReX_MFParallelFor.H" #include "AMReX_MultiFab.H" #include "AMReX_ParallelContext.H" #include "AMReX_ParallelDescriptor.H" +#include "AMReX_ParmParse.H" #include "AMReX_REAL.H" +#include "AMReX_Reduce.H" #include "AMReX_SPACE.H" #include "AMReX_TableData.H" #include "AMReX_iMultiFab.H" +#include "CloudyCooling.hpp" +#include "ODEIntegrate.hpp" #include "RadhydroSimulation.hpp" -#include "cloud.hpp" +#include "fundamental_constants.H" #include "hydro_system.hpp" #include "radiation_system.hpp" +#include "cloud.hpp" + using amrex::Real; +using namespace amrex::literals; struct ShockCloud { }; // dummy type to allow compile-type polymorphism via template specialization -constexpr double seconds_in_year = 3.154e7; +constexpr double parsec_in_cm = 3.086e18; // cm == 1 pc +constexpr double solarmass_in_g = 1.99e33; // g == 1 Msun +constexpr double keV_in_ergs = 1.60218e-9; // ergs == 1 keV +constexpr double m_H = C::m_p; // mass of hydrogen atom -template <> struct quokka::EOS_Traits { +template <> struct HydroSystem_Traits { static constexpr double gamma = 5. / 3.; // default value - static constexpr double mean_molecular_weight = 1.0; - static constexpr double boltzmann_constant = C::k_B; -}; - -template <> struct Physics_Traits { - // cell-centred - static constexpr bool is_hydro_enabled = true; - static constexpr bool is_chemistry_enabled = false; - static constexpr int numMassScalars = 0; // number of mass scalars - static constexpr int numPassiveScalars = numMassScalars + 0; // number of passive scalars - static constexpr bool is_radiation_enabled = false; - // face-centred - static constexpr bool is_mhd_enabled = false; -}; - -template <> struct SimulationData { - std::unique_ptr> table_data; + // if true, reconstruct e_int instead of pressure + static constexpr bool reconstruct_eint = true; + static constexpr int nscalars = 3; // number of passive scalars }; -constexpr Real Tgas0 = 1.0e7; // K -constexpr Real nH0 = 1.0e-4; // cm^-3 -constexpr Real nH1 = 1.0e-1; // cm^-3 -constexpr Real R_cloud = 5.0 * 3.086e18; // cm [5 pc] -constexpr Real M0 = 2.0; // Mach number of shock +// temperature floor +AMREX_GPU_MANAGED static Real T_floor = NAN; -constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 -constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 -constexpr Real rho1 = nH1 * (C::m_p + C::m_e); - -// perturbation parameters -const int kmin = 0; -const int kmax = 16; -Real const A = 0.05 / kmax; +// Cloud parameters (set inside problem_main()) +AMREX_GPU_MANAGED static Real rho0 = NAN; +AMREX_GPU_MANAGED static Real rho1 = NAN; +AMREX_GPU_MANAGED static Real P0 = NAN; +AMREX_GPU_MANAGED static Real R_cloud = NAN; // cloud-tracking variables needed for Dirichlet boundary condition AMREX_GPU_MANAGED static Real rho_wind = 0; AMREX_GPU_MANAGED static Real v_wind = 0; AMREX_GPU_MANAGED static Real P_wind = 0; AMREX_GPU_MANAGED static Real delta_vx = 0; +static Real delta_x = 0; -template <> void RadhydroSimulation::preCalculateInitialConditions() -{ - // generate random phases - amrex::Array tlo{kmin, kmin, kmin}; - amrex::Array thi{kmax, kmax, kmax}; - userData_.table_data = std::make_unique>(tlo, thi); - - amrex::TableData h_table_data(tlo, thi, amrex::The_Pinned_Arena()); - auto const &h_table = h_table_data.table(); - - // Initialize data on the hostcd - // 64-bit Mersenne Twister (do not use 32-bit version for sampling doubles!) - std::mt19937_64 rng(1); // NOLINT - std::uniform_real_distribution sample_phase(0., 2.0 * M_PI); - for (int j = tlo[0]; j <= thi[0]; ++j) { - for (int i = tlo[1]; i <= thi[1]; ++i) { - for (int k = tlo[2]; k <= thi[2]; ++k) { - h_table(i, j, k) = sample_phase(rng); - } - } - } - - // Copy data to GPU memory - userData_.table_data->copy(h_table_data); - amrex::Gpu::streamSynchronize(); -} +static bool enable_cooling = true; +static bool sharp_cloud_edge = false; +static bool do_frame_shift = true; -template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) +template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid) { - // set initial conditions - amrex::GpuArray const dx = grid_elem.dx_; - amrex::GpuArray prob_lo = grid_elem.prob_lo_; - amrex::GpuArray prob_hi = grid_elem.prob_hi_; - const amrex::Box &indexRange = grid_elem.indexRange_; - const amrex::Array4 &state_cc = grid_elem.array_; - auto const &phase_table = userData_.table_data->const_table(); - - Real const Lx = (prob_hi[0] - prob_lo[0]); - Real const Ly = (prob_hi[1] - prob_lo[1]); - Real const Lz = (prob_hi[2] - prob_lo[2]); + amrex::GpuArray dx = grid.dx_; + amrex::GpuArray prob_lo = grid.prob_lo_; + amrex::GpuArray prob_hi = grid.prob_hi_; Real const x0 = prob_lo[0] + 0.5 * (prob_hi[0] - prob_lo[0]); - Real const y0 = prob_lo[1] + 0.8 * (prob_hi[1] - prob_lo[1]); + Real const y0 = prob_lo[1] + 0.5 * (prob_hi[1] - prob_lo[1]); Real const z0 = prob_lo[2] + 0.5 * (prob_hi[2] - prob_lo[2]); + auto tables = cloudyTables_.const_tables(); + const bool sharp_cloud_edge = ::sharp_cloud_edge; + + const amrex::Box &indexRange = grid.indexRange_; + auto const &state = grid.array_; + amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { - Real const x = prob_lo[0] + (i + static_cast(0.5)) * dx[0]; - Real const y = prob_lo[1] + (j + static_cast(0.5)) * dx[1]; - Real const z = prob_lo[2] + (k + static_cast(0.5)) * dx[2]; + Real const x = prob_lo[0] + (i + Real(0.5)) * dx[0]; + Real const y = prob_lo[1] + (j + Real(0.5)) * dx[1]; + Real const z = prob_lo[2] + (k + Real(0.5)) * dx[2]; Real const R = std::sqrt(std::pow(x - x0, 2) + std::pow(y - y0, 2) + std::pow(z - z0, 2)); - // compute perturbations - Real delta_rho = 0; - for (int ki = kmin; ki < kmax; ++ki) { - for (int kj = kmin; kj < kmax; ++kj) { - for (int kk = kmin; kk < kmax; ++kk) { - if ((ki == 0) && (kj == 0) && (kk == 0)) { - continue; - } - Real const kx = 2.0 * M_PI * static_cast(ki) / Lx; - Real const ky = 2.0 * M_PI * static_cast(kj) / Lx; - Real const kz = 2.0 * M_PI * static_cast(kk) / Lx; - delta_rho += A * std::sin(x * kx + y * ky + z * kz + phase_table(ki, kj, kk)); - } + Real rho = NAN; + Real C = NAN; + + if (sharp_cloud_edge) { + if (R < R_cloud) { + rho = rho1; // cloud density + C = 1.0; // concentration is unity inside the cloud + } else { + rho = rho0; // background density + C = 0.0; // concentration is zero outside the cloud } + } else { + const Real h_smooth = R_cloud / 20.; + const Real ramp = 0.5 * (1. - std::tanh((R - R_cloud) / h_smooth)); + rho = ramp * (rho1 - rho0) + rho0; + C = ramp * 1.0; // concentration is unity inside the cloud } - AMREX_ALWAYS_ASSERT(delta_rho > -1.0); - Real rho = rho0 * (1.0 + delta_rho); // background density - if (R < R_cloud) { - rho = rho1 * (1.0 + delta_rho); // cloud density - } + AMREX_ALWAYS_ASSERT(rho > 0.); + AMREX_ALWAYS_ASSERT(C >= 0.); + AMREX_ALWAYS_ASSERT(C <= 1.); + Real const xmom = 0; Real const ymom = 0; Real const zmom = 0; - Real const Eint = (quokka::EOS_Traits::gamma - 1.) * P0; + Real const Eint = P0 / (HydroSystem::gamma_ - 1.); Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - state_cc(i, j, k, HydroSystem::density_index) = rho; - state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; - state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; - state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; - state_cc(i, j, k, HydroSystem::energy_index) = Egas; - state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; + state(i, j, k, RadSystem::gasDensity_index) = rho; + state(i, j, k, RadSystem::x1GasMomentum_index) = xmom; + state(i, j, k, RadSystem::x2GasMomentum_index) = ymom; + state(i, j, k, RadSystem::x3GasMomentum_index) = zmom; + state(i, j, k, RadSystem::gasEnergy_index) = Egas; + state(i, j, k, RadSystem::gasInternalEnergy_index) = Eint; + state(i, j, k, RadSystem::scalar0_index) = C; + state(i, j, k, RadSystem::scalar0_index + 1) = C * rho; // cloud partial density + state(i, j, k, RadSystem::scalar0_index + 2) = (1.0 - C) * rho; // non-cloud partial density }); } @@ -172,133 +147,653 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBou const Real /*time*/, const amrex::BCRec * /*bcr*/, int /*bcomp*/, int /*orig_comp*/) { - auto [i, j, k] = iv.dim3(); + auto [i, j, k] = iv.toArray(); amrex::Box const &box = geom.Domain(); - const auto &domain_lo = box.loVect3d(); - const auto &domain_hi = box.hiVect3d(); - const int jhi = domain_hi[1]; - - if (j >= jhi) { - // x2 upper boundary -- constant - // compute downstream shock conditions from rho0, P0, and M0 - constexpr Real gamma = quokka::EOS_Traits::gamma; - constexpr Real rho2 = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); - constexpr Real P2 = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); - Real const v2 = -M0 * std::sqrt(gamma * P2 / rho2); - - Real const rho = rho2; - Real const xmom = 0; - Real const ymom = rho2 * v2; + const auto &domain_lo = box.loVect(); + const int ilo = domain_lo[0]; + + const Real delta_vx = ::delta_vx; + const Real v_wind = ::v_wind; + const Real rho_wind = ::rho_wind; + const Real P_wind = ::P_wind; + + if (i < ilo) { + // x1 lower boundary -- constant + Real const vx = v_wind - delta_vx; + Real const rho = rho_wind; + Real const xmom = rho_wind * vx; + Real const ymom = 0; Real const zmom = 0; - Real const Eint = (gamma - 1.) * P2; + Real const Eint = P_wind / (HydroSystem::gamma_ - 1.); Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - consVar(i, j, k, HydroSystem::density_index) = rho; - consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; - consVar(i, j, k, HydroSystem::x2Momentum_index) = ymom; - consVar(i, j, k, HydroSystem::x3Momentum_index) = zmom; - consVar(i, j, k, HydroSystem::energy_index) = Egas; - consVar(i, j, k, HydroSystem::internalEnergy_index) = Eint; + consVar(i, j, k, RadSystem::gasDensity_index) = rho; + consVar(i, j, k, RadSystem::x1GasMomentum_index) = xmom; + consVar(i, j, k, RadSystem::x2GasMomentum_index) = ymom; + consVar(i, j, k, RadSystem::x3GasMomentum_index) = zmom; + consVar(i, j, k, RadSystem::gasEnergy_index) = Egas; + consVar(i, j, k, RadSystem::gasInternalEnergy_index) = Eint; + consVar(i, j, k, RadSystem::scalar0_index) = 0; + consVar(i, j, k, RadSystem::scalar0_index + 1) = 0; // cloud partial density + consVar(i, j, k, RadSystem::scalar0_index + 2) = rho; // non-cloud partial density } } -template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp_cc_in) const +#if 0 +template <> +void HydroSystem::EnforceInternalEnergyFloor(amrex::Real const internalEnergyFloor, + amrex::MultiFab &state_mf, + SimulationData const &userData) { - // compute derived variables and save in 'mf' - if (dname == "temperature") { - const int ncomp = ncomp_cc_in; - auto tables = cloudyTables_.const_tables(); + // prevent negative internal energy + const Real gamma = HydroSystem::gamma_; + auto tables = userData.cloudyTables.const_tables(); + auto const &state = state_mf.arrays(); + + amrex::ParallelFor(state_mf, [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + const amrex::Real rho = state[bx](i, j, k, density_index); + const amrex::Real Eint = state[bx](i, j, k, internalEnergy_index); + const amrex::Real Eint_min = ComputeEgasFromTgas(rho, T_floor, gamma, tables); + + // reset Eint if less than internalEnergyFloor + if (Eint < Eint_min) { + state[bx](i, j, k, internalEnergy_index) = Eint_min; + } + }); +} +#endif - for (amrex::MFIter iter(mf); iter.isValid(); ++iter) { - const amrex::Box &indexRange = iter.validbox(); - auto const &output = mf.array(iter); - auto const &state = state_new_cc_[lev].const_array(iter); - - amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const x1Mom = state(i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state(i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state(i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const Tgas = quokka::cooling::ComputeTgasFromEgas(rho, Eint, quokka::EOS_Traits::gamma, tables); - - output(i, j, k, ncomp) = Tgas; +template <> void RadhydroSimulation::computeAfterTimestep() +{ + const amrex::Real dt_coarse = dt_[0]; + + // perform Galilean transformation (velocity shift to center-of-mass frame) + if (::do_frame_shift) { + + // N.B. must weight by passive scalar of cloud, since the background has + // non-negligible momentum! + int nc = 1; // number of components in temporary MF + int ng = 0; // number of ghost cells in temporary MF + amrex::MultiFab temp_mf(boxArray(0), DistributionMap(0), nc, ng); + + // compute x-momentum + amrex::MultiFab::Copy(temp_mf, state_new_cc_[0], HydroSystem::x1Momentum_index, 0, nc, ng); + amrex::MultiFab::Multiply(temp_mf, state_new_cc_[0], HydroSystem::scalar0_index, 0, nc, ng); + const Real xmom = temp_mf.sum(0); + + // compute cloud mass within simulation box + amrex::MultiFab::Copy(temp_mf, state_new_cc_[0], HydroSystem::density_index, 0, nc, ng); + amrex::MultiFab::Multiply(temp_mf, state_new_cc_[0], HydroSystem::scalar0_index, 0, nc, ng); + const Real cloud_mass = temp_mf.sum(0); + + // compute center-of-mass velocity of the cloud + const Real vx_cm = xmom / cloud_mass; + + // save cumulative position, velocity offsets in simulationMetadata_ + const Real delta_x_prev = ::delta_x; // std::get(simulationMetadata_["delta_x"]); + const Real delta_vx_prev = ::delta_vx; // std::get(simulationMetadata_["delta_vx"]); + const Real delta_x = delta_x_prev + dt_coarse * delta_vx_prev; + const Real delta_vx = delta_vx_prev + vx_cm; + // simulationMetadata_["delta_x"] = delta_x; + // simulationMetadata_["delta_vx"] = delta_vx; + ::delta_vx = delta_vx; + + const Real v_wind = ::v_wind; + amrex::Print() << "[Cloud Tracking] Delta x = " << (delta_x / parsec_in_cm) << " pc," + << " Delta vx = " << (delta_vx / 1.0e5) << " km/s," + << " Inflow velocity = " << ((v_wind - delta_vx) / 1.0e5) << " km/s\n"; + + // If we are moving faster than the wind, we should abort the simulation. + // (otherwise, the boundary conditions become inconsistent.) + AMREX_ALWAYS_ASSERT(delta_vx < v_wind); + + // subtract center-of-mass y-velocity on each level + // N.B. must update both y-momentum *and* energy! + for (int lev = 0; lev <= finest_level; ++lev) { + auto const &mf = state_new_cc_[lev]; + auto const &state = state_new_cc_[lev].arrays(); + amrex::ParallelFor(mf, [=] AMREX_GPU_DEVICE(int box, int i, int j, int k) noexcept { + Real rho = state[box](i, j, k, HydroSystem::density_index); + Real xmom = state[box](i, j, k, HydroSystem::x1Momentum_index); + Real ymom = state[box](i, j, k, HydroSystem::x2Momentum_index); + Real zmom = state[box](i, j, k, HydroSystem::x3Momentum_index); + Real E = state[box](i, j, k, HydroSystem::energy_index); + Real KE = 0.5 * (xmom * xmom + ymom * ymom + zmom * zmom) / rho; + Real Eint = E - KE; + Real new_xmom = xmom - rho * vx_cm; + Real new_KE = 0.5 * (new_xmom * new_xmom + ymom * ymom + zmom * zmom) / rho; + + state[box](i, j, k, HydroSystem::x1Momentum_index) = new_xmom; + state[box](i, j, k, HydroSystem::energy_index) = Eint + new_KE; }); } + amrex::Gpu::streamSynchronizeAll(); } } -template <> void RadhydroSimulation::ErrorEst(int lev, amrex::TagBoxArray &tags, Real /*time*/, int /*ngrow*/) +template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp_in) const { - // tag cells for refinement - const Real eta_threshold = 0.1; // gradient refinement threshold - const Real q_min = std::sqrt(rho0 * rho1); // minimum density for refinement + // compute derived variables and save in 'mf' + + if (dname == "temperature") { + const int ncomp = ncomp_in; + auto tables = cloudyTables_.const_tables(); + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + Real rho = state[bx](i, j, k, HydroSystem::density_index); + Real x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + output[bx](i, j, k, ncomp) = Tgas; + }); + + } else if (dname == "nH") { + const int ncomp = ncomp_in; + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); - for (amrex::MFIter mfi(state_new_cc_[lev]); mfi.isValid(); ++mfi) { - const amrex::Box &box = mfi.validbox(); - const auto state = state_new_cc_[lev].const_array(mfi); - const auto tag = tags.array(mfi); - const int nidx = HydroSystem::density_index; + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + Real rho = state[bx](i, j, k, HydroSystem::density_index); + Real nH = (quokka::cooling::cloudy_H_mass_fraction * rho) / m_H; + output[bx](i, j, k, ncomp) = nH; + }); + + } else if (dname == "pressure") { + const int ncomp = ncomp_in; + auto tables = cloudyTables_.const_tables(); + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + Real rho = state[bx](i, j, k, HydroSystem::density_index); + Real x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + Real mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); + Real ndens = rho / (mu * m_H); + output[bx](i, j, k, ncomp) = ndens * Tgas; // [K cm^-3] + }); + + } else if (dname == "entropy") { + const int ncomp = ncomp_in; + auto tables = cloudyTables_.const_tables(); + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + Real rho = state[bx](i, j, k, HydroSystem::density_index); + Real x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + Real mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); + Real ndens = rho / (mu * m_H); + Real K_cgs = C::k_B * Tgas * std::pow(ndens, -2. / 3.); // ergs cm^2 + Real K_keV_cm2 = K_cgs / keV_in_ergs; // convert to units of keV cm^2 + output[bx](i, j, k, ncomp) = K_keV_cm2; + }); - amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { - Real const q = state(i, j, k, nidx); + } else if (dname == "mass") { + const int ncomp = ncomp_in; + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + auto const dx = geom[lev].CellSizeArray(); + const Real dvol = dx[0] * dx[1] * dx[2]; - Real const q_xplus = state(i + 1, j, k, nidx); - Real const q_xminus = state(i - 1, j, k, nidx); - Real const q_yplus = state(i, j + 1, k, nidx); - Real const q_yminus = state(i, j - 1, k, nidx); - Real const q_zplus = state(i, j, k + 1, nidx); - Real const q_zminus = state(i, j, k - 1, nidx); + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + Real rho = state[bx](i, j, k, HydroSystem::density_index); + output[bx](i, j, k, ncomp) = rho * dvol; + }); - Real const del_x = std::max(std::abs(q_xplus - q), std::abs(q - q_xminus)); - Real const del_y = std::max(std::abs(q_yplus - q), std::abs(q - q_yminus)); - Real const del_z = std::max(std::abs(q_zplus - q), std::abs(q - q_zminus)); + } else if (dname == "cloud_fraction") { + const int ncomp = ncomp_in; + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); - Real const gradient_indicator = std::max({del_x, del_y, del_z}) / q; + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + // cloud partial density + Real rho_cloud = state[bx](i, j, k, HydroSystem::scalar0_index + 1); + // non-cloud partial density + Real rho_bg = state[bx](i, j, k, HydroSystem::scalar0_index + 2); - if ((gradient_indicator > eta_threshold) && (q > q_min)) { - tag(i, j, k) = amrex::TagBox::SET; - } + // NOTE: rho_cloud + rho_bg only equals hydro rho up to truncation error! + output[bx](i, j, k, ncomp) = rho_cloud / (rho_cloud + rho_bg); + }); + + } else if (dname == "cooling_length") { + const int ncomp = ncomp_in; + auto tables = cloudyTables_.const_tables(); + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + // compute cooling length in parsec + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const l_cool = ComputeCoolingLength(rho, Eint, HydroSystem::gamma_, tables); + output[bx](i, j, k, ncomp) = l_cool / parsec_in_cm; + }); + + } else if (dname == "lab_velocity_x") { + const int ncomp = ncomp_in; + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + const Real delta_vx = ::delta_vx; + + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + // compute observer velocity in km/s + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const vx = x1Mom / rho; + Real const vx_lab = vx + delta_vx; + output[bx](i, j, k, ncomp) = vx_lab / 1.0e5; // km/s + }); + + } else if (dname == "velocity_mag") { + const int ncomp = ncomp_in; + auto const &output = mf.arrays(); + auto const &state = state_new_cc_[lev].const_arrays(); + + amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + // compute simulation-frame |v| in km/s + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real const v1 = x1Mom / rho; + Real const v2 = x2Mom / rho; + Real const v3 = x3Mom / rho; + output[bx](i, j, k, ncomp) = std::sqrt(v1 * v1 + v2 * v2 + v3 * v3) / 1.0e5; // km/s }); } + amrex::Gpu::streamSynchronize(); } -auto problem_main() -> int +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto ComputeCellTemp(int i, int j, int k, amrex::Array4 const &state, amrex::Real gamma, + quokka::cooling::cloudyGpuConstTables const &tables) { - // Problem parameters - const double CFL_number = 0.25; - const double max_time = 2.0e6 * seconds_in_year; // 2 Myr - const int max_timesteps = 1e5; + // return cell temperature + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const x1Mom = state(i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state(i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state(i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + return ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); +} - // Problem initialization - constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; - amrex::Vector BCs_cc(ncomp_cc); - for (int n = 0; n < ncomp_cc; ++n) { - BCs_cc[n].setLo(0, amrex::BCType::int_dir); // periodic - BCs_cc[n].setHi(0, amrex::BCType::int_dir); +#if 0 +template <> auto RadhydroSimulation::ComputeStatistics() -> std::map +{ + // compute scalar statistics + std::map stats; + + // save time + const Real t_cc = std::get(simulationMetadata_["t_cc"]); + const Real time = tNew_[0]; + stats["t_over_tcc"] = time / t_cc; + + // save cloud position, velocity + const Real dx_cgs = std::get(simulationMetadata_["delta_x"]); + const Real dvx_cgs = std::get(simulationMetadata_["delta_vx"]); + const Real v_wind = ::v_wind; + + stats["delta_x"] = dx_cgs / parsec_in_cm; // pc + stats["delta_vx"] = dvx_cgs / 1.0e5; // km/s + stats["inflow_vx"] = (v_wind - dvx_cgs) / 1.0e5; // km/s + + // save total simulation mass + const Real sim_mass = amrex::volumeWeightedSum(amrex::GetVecOfConstPtrs(state_new_cc_), + HydroSystem::density_index, geom, ref_ratio); + const Real sim_partialcloud_mass = amrex::volumeWeightedSum( + amrex::GetVecOfConstPtrs(state_new_cc_), HydroSystem::scalar0_index + 1, geom, ref_ratio); + const Real sim_partialwind_mass = amrex::volumeWeightedSum( + amrex::GetVecOfConstPtrs(state_new_cc_), HydroSystem::scalar0_index + 2, geom, ref_ratio); + + stats["sim_mass"] = sim_mass / solarmass_in_g; + stats["sim_partialcloud_mass"] = sim_partialcloud_mass / solarmass_in_g; + stats["sim_partialwind_mass"] = sim_partialwind_mass / solarmass_in_g; + + // compute cloud mass according to temperature threshold + auto tables = userData_.cloudyTables.const_tables(); + + const Real M_cl_1e4 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (T < 1.0e4) ? rho : 0.0; + return result; + }); + const Real M_cl_8000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (T < 8000.) ? rho : 0.0; + return result; + }); + const Real M_cl_9000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (T < 9000.) ? rho : 0.0; + return result; + }); + const Real M_cl_11000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (T < 1.1e4) ? rho : 0.0; + return result; + }); + const Real M_cl_12000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (T < 1.2e4) ? rho : 0.0; + return result; + }); + + stats["cloud_mass_1e4"] = M_cl_1e4 / solarmass_in_g; + stats["cloud_mass_8000"] = M_cl_8000 / solarmass_in_g; + stats["cloud_mass_9000"] = M_cl_9000 / solarmass_in_g; + stats["cloud_mass_11000"] = M_cl_11000 / solarmass_in_g; + stats["cloud_mass_12000"] = M_cl_12000 / solarmass_in_g; + + const Real origM_cl_1e4 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const result = (T < 1.0e4) ? rho_cloud : 0.0; + return result; + }); + const Real origM_cl_8000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const result = (T < 8000.) ? rho_cloud : 0.0; + return result; + }); + const Real origM_cl_9000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const result = (T < 9000.) ? rho_cloud : 0.0; + return result; + }); + const Real origM_cl_11000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const result = (T < 1.1e4) ? rho_cloud : 0.0; + return result; + }); + const Real origM_cl_12000 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const result = (T < 1.2e4) ? rho_cloud : 0.0; + return result; + }); + + stats["cloud_mass_1e4_original"] = origM_cl_1e4 / solarmass_in_g; + stats["cloud_mass_8000_original"] = origM_cl_8000 / solarmass_in_g; + stats["cloud_mass_9000_original"] = origM_cl_9000 / solarmass_in_g; + stats["cloud_mass_11000_original"] = origM_cl_11000 / solarmass_in_g; + stats["cloud_mass_12000_original"] = origM_cl_12000 / solarmass_in_g; + + // compute cloud mass according to passive scalar threshold + const Real M_cl_scalar_01 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const C = state(i, j, k, HydroSystem::scalar0_index); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (C > 0.1) ? rho : 0.0; + return result; + }); + const Real M_cl_scalar_01_09 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const C = state(i, j, k, HydroSystem::scalar0_index); + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = ((C > 0.1) && (C < 0.9)) ? rho : 0.0; + return result; + }); + + stats["cloud_mass_scalar_01"] = M_cl_scalar_01 / solarmass_in_g; + stats["cloud_mass_scalar_01_09"] = M_cl_scalar_01_09 / solarmass_in_g; + + // compute cloud mass according to cloud fraction threshold + const Real M_cl_fraction_01 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const rho_bg = state(i, j, k, HydroSystem::scalar0_index + 2); + Real const C_frac = rho_cloud / (rho_cloud + rho_bg); + + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = (C_frac > 0.1) ? rho : 0.0; + return result; + }); + const Real M_cl_fraction_01_09 = computeVolumeIntegral( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + Real const rho_bg = state(i, j, k, HydroSystem::scalar0_index + 2); + Real const C_frac = rho_cloud / (rho_cloud + rho_bg); + + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const result = ((C_frac > 0.1) && (C_frac < 0.9)) ? rho : 0.0; + return result; + }); + + stats["cloud_mass_fraction_01"] = M_cl_fraction_01 / solarmass_in_g; + stats["cloud_mass_fraction_01_09"] = M_cl_fraction_01_09 / solarmass_in_g; + + return stats; +} +#endif - BCs_cc[n].setLo(1, amrex::BCType::foextrap); // extrapolate - BCs_cc[n].setHi(1, amrex::BCType::ext_dir); // Dirichlet +#if 0 +template <> +auto RadhydroSimulation::ComputeProjections(const int dir) const + -> std::unordered_map> +{ + std::unordered_map> proj; + + // compute (total) density projection + proj["nH"] = computePlaneProjection( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + Real rho = state(i, j, k, HydroSystem::density_index); + return (quokka::cooling::cloud_H_mass_fraction * rho) / m_H; + }, + dir); + + // compute cloud partial density projection + proj["nH_cloud"] = computePlaneProjection( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + // partial cloud density + Real rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); + return (quokka::cooling::cloud_H_mass_fraction * rho_cloud) / m_H; + }, + dir); + + // compute non-cloud partial density projection + proj["nH_wind"] = computePlaneProjection( + [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { + // partial wind density + Real rho_wind = state(i, j, k, HydroSystem::scalar0_index + 2); + return (quokka::cooling::cloud_H_mass_fraction * rho_wind) / m_H; + }, + dir); + + return proj; +} +#endif - BCs_cc[n].setLo(2, amrex::BCType::int_dir); - BCs_cc[n].setHi(2, amrex::BCType::int_dir); - } +template <> void RadhydroSimulation::ErrorEst(int lev, amrex::TagBoxArray &tags, Real /*time*/, int /*ngrow*/) +{ + // tag cells for refinement + const int Ncells_per_lcool = 10; + + amrex::GpuArray dx = geom[lev].CellSizeArray(); + const Real min_dx = std::min({AMREX_D_DECL(dx[0], dx[1], dx[2])}); + const Real resolved_length = static_cast(Ncells_per_lcool) * min_dx; + + auto tables = cloudyTables_.const_tables(); + const auto state = state_new_cc_[lev].const_arrays(); + const auto tag = tags.arrays(); + + amrex::ParallelFor(state_new_cc_[lev], [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const l_cool = ComputeCoolingLength(rho, Eint, HydroSystem::gamma_, tables); + + if (l_cool < resolved_length) { + tag[bx](i, j, k) = amrex::TagBox::SET; + } + }); + amrex::Gpu::streamSynchronize(); +} - RadhydroSimulation sim(BCs_cc); +auto problem_main() -> int +{ + // Problem initialization + constexpr int nvars = RadhydroSimulation::nvarTotal_cc_; + amrex::Vector boundaryConditions(nvars); + for (int n = 0; n < nvars; ++n) { + boundaryConditions[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet + boundaryConditions[n].setHi(0, amrex::BCType::foextrap); // extrapolate + + boundaryConditions[n].setLo(1, amrex::BCType::int_dir); // periodic + boundaryConditions[n].setHi(1, amrex::BCType::int_dir); - // Standard PPM gives unphysically enormous temperatures when used for - // this problem (e.g., ~1e14 K or higher), but can be fixed by - // reconstructing the temperature instead of the pressure - sim.reconstructionOrder_ = 3; // PLM - sim.densityFloor_ = 1.0e-2 * rho0; // density floor (to prevent vacuum) + boundaryConditions[n].setLo(2, amrex::BCType::int_dir); + boundaryConditions[n].setHi(2, amrex::BCType::int_dir); + } - sim.cflNumber_ = CFL_number; - sim.maxTimesteps_ = max_timesteps; + RadhydroSimulation sim(boundaryConditions); + + // Read problem parameters + // set global variables (read-only after setting them here) + amrex::ParmParse pp; + Real nH_bg = NAN; + Real nH_cloud = NAN; + Real P_over_k = NAN; + Real M0 = NAN; + int enable_cooling = 1; // default (0 = off, 1, = on) + + // enable cooling? + pp.query("enable_cooling", enable_cooling); + ::enable_cooling = enable_cooling == 1; + + // use a sharp cloud edge? + int sharp_cloud_edge = 0; + pp.query("sharp_cloud_edge", sharp_cloud_edge); + ::sharp_cloud_edge = sharp_cloud_edge == 1; + + // do frame shifting to follow cloud center-of-mass? + int do_frame_shift = 1; + pp.query("do_frame_shift", do_frame_shift); + ::do_frame_shift = do_frame_shift == 1; + + // background gas H number density + pp.query("nH_bg", nH_bg); // cm^-3 + + // cloud H number density + pp.query("nH_cloud", nH_cloud); // cm^-3 + + // background gas pressure + pp.query("P_over_k", P_over_k); // K cm^-3 + + // cloud radius + pp.query("R_cloud_pc", ::R_cloud); // pc + ::R_cloud *= parsec_in_cm; // convert to cm + + // (pre-shock) Mach number + // (N.B. *not* the same as Mach_wind!) + pp.query("Mach_shock", M0); // dimensionless + + // gas temperature floor + pp.query("T_floor", ::T_floor); // K + + // compute background pressure + // (pressure equilibrium should hold *before* the shock enters the box) + ::P0 = P_over_k * C::k_B; // erg cm^-3 + amrex::Print() << fmt::format("Pressure = {} K cm^-3\n", P_over_k); + + // compute mass density of background, cloud + ::rho0 = nH_bg * m_H / quokka::cooling::cloudy_H_mass_fraction; // g cm^-3 + ::rho1 = nH_cloud * m_H / quokka::cooling::cloudy_H_mass_fraction; // g cm^-3 + + AMREX_ALWAYS_ASSERT(!std::isnan(::rho0)); + AMREX_ALWAYS_ASSERT(!std::isnan(::rho1)); + AMREX_ALWAYS_ASSERT(!std::isnan(::P0)); + + // check temperature of cloud, background + constexpr Real gamma = HydroSystem::gamma_; + auto tables = sim.cloudyTables_.const_tables(); + const Real Eint_bg = ::P0 / (gamma - 1.); + const Real Eint_cl = ::P0 / (gamma - 1.); + const Real T_bg = ComputeTgasFromEgas(rho0, Eint_bg, gamma, tables); + const Real T_cl = ComputeTgasFromEgas(rho1, Eint_cl, gamma, tables); + amrex::Print() << fmt::format("T_bg = {} K\n", T_bg); + amrex::Print() << fmt::format("T_cl = {} K\n", T_cl); + + // compute shock jump conditions from rho0, P0, and M0 + const Real v_pre = M0 * std::sqrt(gamma * P0 / rho0); + const Real rho_post = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); + const Real v_post = v_pre * (rho0 / rho_post); + const Real v_wind = v_pre - v_post; + + const Real P_post = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); + const Real Eint_post = P_post / (gamma - 1.); + const Real T_post = ComputeTgasFromEgas(rho_post, Eint_post, gamma, tables); + amrex::Print() << fmt::format("T_wind = {} K\n", T_post); + + ::v_wind = v_wind; // set global variables + ::rho_wind = rho_post; + ::P_wind = P_post; + amrex::Print() << fmt::format("v_wind = {} km/s (v_pre = {}, v_post = {})\n", v_wind / 1.0e5, v_pre / 1.0e5, v_post / 1.0e5); + + // compute cloud-crushing time + const Real chi = rho1 / rho0; + const Real t_cc = std::sqrt(chi) * R_cloud / v_wind; + amrex::Print() << fmt::format("t_cc = {} kyr\n", t_cc / (1.0e3 * 3.15e7)); + amrex::Print() << std::endl; + + // compute maximum simulation time + const double max_time = 20.0 * t_cc; + + // set simulation parameters + sim.reconstructionOrder_ = 3; // PPM for hydro + sim.densityFloor_ = 1.0e-3 * rho0; // density floor (to prevent vacuum) sim.stopTime_ = max_time; - sim.plotfileInterval_ = 100; - sim.checkpointInterval_ = 2000; + +#if 0 + // set metadata + sim.simulationMetadata_["delta_x"] = 0._rt; + sim.simulationMetadata_["delta_vx"] = 0._rt; + sim.simulationMetadata_["rho_wind"] = rho_wind; + sim.simulationMetadata_["v_wind"] = v_wind; + sim.simulationMetadata_["P_wind"] = P_wind; + sim.simulationMetadata_["M0"] = M0; + sim.simulationMetadata_["t_cc"] = t_cc; +#endif // Set initial conditions sim.setInitialConditions(); @@ -307,6 +802,6 @@ auto problem_main() -> int sim.evolve(); // Cleanup and exit - int const status = 0; + int status = 0; return status; } diff --git a/tests/ShockCloud_32.in b/tests/ShockCloud_32.in new file mode 100644 index 000000000..28bb9a49d --- /dev/null +++ b/tests/ShockCloud_32.in @@ -0,0 +1,58 @@ +# ***************************************************************** +# Problem size and geometry +# ***************************************************************** +geometry.prob_lo = 0.0 0.0 0.0 +geometry.prob_hi = 2.4688e+21 6.172e+20 6.172e+20 # 800 x 200 x 200 pc +geometry.is_periodic = 0 0 0 + +# ***************************************************************** +# VERBOSITY +# ***************************************************************** +amr.v = 1 # verbosity in Amr + +# ***************************************************************** +# Resolution and refinement +# ***************************************************************** +amr.n_cell = 64 16 16 +amr.max_level = 0 # number of levels = max_level + 1 +amr.blocking_factor_x = 64 +amr.blocking_factor_y = 16 +amr.blocking_factor_z = 16 # grid size must be divisible by this +amr.max_grid_size = 64 + +# ***************************************************************** +# Quokka options +# ***************************************************************** +do_reflux = 1 +do_subcycle = 1 + +grackle_data_file = "../extern/cooling_tables/isrf_1000Go_grains.h5" +derived_vars = pressure entropy nH temperature cooling_length + cloud_fraction lab_velocity_x mass velocity_mag +projection.dirs = x z + +cfl = 0.3 +sharp_cloud_edge = 1 +do_frame_shift = 0 +enable_cooling = 0 + +max_walltime = 6:00:00 +max_timesteps = 5000 + +plotfile_interval = 100 +checkpoint_interval = 5000 +ascent_interval = 10 +projection_interval = -1 +statistics_interval = 10 + +T_floor = 100.0 # K + +nH_bg = 0.003356403333 # cm^-3 +nH_cloud = 0.003356403333 # cm^-3 +P_over_k = 1.304005e+04 # K cm^-3 + +R_cloud_pc = 16.09084149928867 # pc +Mach_shock = 1.05 + +Erad_initial_Habing = 1 # G_0 +Erad_incident_Habing = 1000 # G_0 From d22dad7c0adcf7792becd2e01f7c8e1ddfcac8b7 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 14:25:21 -0400 Subject: [PATCH 02/64] add coolinglength and mmw functions --- src/CloudyCooling.hpp | 54 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/CloudyCooling.hpp b/src/CloudyCooling.hpp index ae5aca447..e8219554d 100644 --- a/src/CloudyCooling.hpp +++ b/src/CloudyCooling.hpp @@ -20,6 +20,7 @@ #include "GrackleDataReader.hpp" #include "Interpolate2D.hpp" #include "ODEIntegrate.hpp" +#include "fundamental_constants.H" #include "hydro_system.hpp" #include "radiation_system.hpp" #include "root_finding.hpp" @@ -303,6 +304,59 @@ template void computeCooling(amrex::MultiFab &mf, const Rea } } + +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto +ComputeCoolingLength(double rho, double Egas, double gamma, + cloudyGpuConstTables const &tables) -> Real { + // convert (rho, Egas) to cooling length + + // 1. convert Egas (internal gas energy) to temperature + const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); + + // 2. compute cooling time + // interpolate cooling rates from Cloudy tables + const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species + const Real nH = rhoH / (C::m_p + C::m_e); + const Real log_nH = std::log10(nH); + const Real log_T = std::log10(Tgas); + + const double logPrimCool = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.primCool); + const double logMetalCool = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.metalCool); + const double LambdaCool = FastMath::pow10(logPrimCool) + FastMath::pow10(logMetalCool); + + const double Edot = (rhoH * rhoH) * LambdaCool; + // compute cooling time + const Real t_cool = Egas / Edot; + + // 3. compute cooling length c_s t_cool + // compute mu from mu(T) table + const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, + tables.log_Tgas, tables.meanMolWeight); + const Real c_s = std::sqrt(gamma * C::k_B * Tgas / (mu * (C::m_p + C::m_e))); + + // cooling length + return c_s * t_cool; +} + +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto +ComputeMMW(double rho, double Egas, double gamma, + cloudyGpuConstTables const &tables) -> Real { + // convert (rho, Egas) to dimensionless mean molecular weight + + // 1. convert Egas (internal gas energy) to temperature + const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); + + // 2. compute mu from mu(T) table + const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species + const Real nH = rhoH / (C::m_p + C::m_e); + const Real log_nH = std::log10(nH); + const Real log_T = std::log10(Tgas); + const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, + tables.log_Tgas, tables.meanMolWeight); + return mu; +} + + void readCloudyData(std::string &grackle_hdf5_file, cloudy_tables &cloudyTables); } // namespace quokka::cooling From 838fc5c8396d32991d51c1a407a3d95171a5deea Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 14:42:08 -0400 Subject: [PATCH 03/64] fix cloud problem --- src/ShockCloud/cloud.cpp | 32 ++++++++++++++++++-------------- tests/ShockCloud_32.in | 27 +++++++++++---------------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index f4697d08d..a6a3854ae 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -33,6 +33,7 @@ #include "AMReX_iMultiFab.H" #include "CloudyCooling.hpp" +#include "EOS.hpp" #include "ODEIntegrate.hpp" #include "RadhydroSimulation.hpp" #include "fundamental_constants.H" @@ -50,17 +51,22 @@ struct ShockCloud { constexpr double parsec_in_cm = 3.086e18; // cm == 1 pc constexpr double solarmass_in_g = 1.99e33; // g == 1 Msun constexpr double keV_in_ergs = 1.60218e-9; // ergs == 1 keV -constexpr double m_H = C::m_p; // mass of hydrogen atom - -template <> struct HydroSystem_Traits { - static constexpr double gamma = 5. / 3.; // default value - // if true, reconstruct e_int instead of pressure - static constexpr bool reconstruct_eint = true; - static constexpr int nscalars = 3; // number of passive scalars +constexpr double m_H = C::m_p + C::m_e; // mass of hydrogen atom + +template <> struct Physics_Traits { + static constexpr bool is_hydro_enabled = true; + static constexpr bool is_chemistry_enabled = false; + static constexpr int numMassScalars = 0; + static constexpr int numPassiveScalars = numMassScalars + 3; + static constexpr bool is_radiation_enabled = false; + static constexpr bool is_mhd_enabled = false; }; -// temperature floor -AMREX_GPU_MANAGED static Real T_floor = NAN; +template <> struct quokka::EOS_Traits { + static constexpr double gamma = 5./3.; + static constexpr double mean_molecular_weight = C::m_u; + static constexpr double boltzmann_constant = C::k_B; +}; // Cloud parameters (set inside problem_main()) AMREX_GPU_MANAGED static Real rho0 = NAN; @@ -126,7 +132,7 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quok Real const xmom = 0; Real const ymom = 0; Real const zmom = 0; - Real const Eint = P0 / (HydroSystem::gamma_ - 1.); + Real const Eint = P0 / (quokka::EOS_Traits::gamma - 1.); Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); state(i, j, k, RadSystem::gasDensity_index) = rho; @@ -695,9 +701,9 @@ auto problem_main() -> int Real nH_cloud = NAN; Real P_over_k = NAN; Real M0 = NAN; - int enable_cooling = 1; // default (0 = off, 1, = on) // enable cooling? + int enable_cooling = 1; // default (0 = off, 1, = on) pp.query("enable_cooling", enable_cooling); ::enable_cooling = enable_cooling == 1; @@ -728,9 +734,6 @@ auto problem_main() -> int // (N.B. *not* the same as Mach_wind!) pp.query("Mach_shock", M0); // dimensionless - // gas temperature floor - pp.query("T_floor", ::T_floor); // K - // compute background pressure // (pressure equilibrium should hold *before* the shock enters the box) ::P0 = P_over_k * C::k_B; // erg cm^-3 @@ -780,6 +783,7 @@ auto problem_main() -> int const double max_time = 20.0 * t_cc; // set simulation parameters + sim.reconstructionOrder_ = 3; // PPM for hydro sim.densityFloor_ = 1.0e-3 * rho0; // density floor (to prevent vacuum) sim.stopTime_ = max_time; diff --git a/tests/ShockCloud_32.in b/tests/ShockCloud_32.in index 28bb9a49d..a36aa7423 100644 --- a/tests/ShockCloud_32.in +++ b/tests/ShockCloud_32.in @@ -3,7 +3,7 @@ # ***************************************************************** geometry.prob_lo = 0.0 0.0 0.0 geometry.prob_hi = 2.4688e+21 6.172e+20 6.172e+20 # 800 x 200 x 200 pc -geometry.is_periodic = 0 0 0 +geometry.is_periodic = 0 1 1 # ***************************************************************** # VERBOSITY @@ -26,16 +26,6 @@ amr.max_grid_size = 64 do_reflux = 1 do_subcycle = 1 -grackle_data_file = "../extern/cooling_tables/isrf_1000Go_grains.h5" -derived_vars = pressure entropy nH temperature cooling_length - cloud_fraction lab_velocity_x mass velocity_mag -projection.dirs = x z - -cfl = 0.3 -sharp_cloud_edge = 1 -do_frame_shift = 0 -enable_cooling = 0 - max_walltime = 6:00:00 max_timesteps = 5000 @@ -44,15 +34,20 @@ checkpoint_interval = 5000 ascent_interval = 10 projection_interval = -1 statistics_interval = 10 +derived_vars = pressure entropy nH temperature cooling_length \ + cloud_fraction lab_velocity_x mass velocity_mag +projection.dirs = x z + +hydro.cfl = 0.3 +sharp_cloud_edge = 1 +do_frame_shift = 0 -T_floor = 100.0 # K +cooling.enabled = 1 +cooling.grackle_data_file = "../extern/grackle_data_files/input/CloudyData_UVB=HM2012.h5" +temperature_floor = 100 nH_bg = 0.003356403333 # cm^-3 nH_cloud = 0.003356403333 # cm^-3 P_over_k = 1.304005e+04 # K cm^-3 - R_cloud_pc = 16.09084149928867 # pc Mach_shock = 1.05 - -Erad_initial_Habing = 1 # G_0 -Erad_incident_Habing = 1000 # G_0 From 65e35d07c19a78d0a96404f3fe902ea855a3c68a Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 14:47:39 -0400 Subject: [PATCH 04/64] update param file --- tests/ShockCloud_32.in | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/ShockCloud_32.in b/tests/ShockCloud_32.in index a36aa7423..af6e1cd7a 100644 --- a/tests/ShockCloud_32.in +++ b/tests/ShockCloud_32.in @@ -23,29 +23,23 @@ amr.max_grid_size = 64 # ***************************************************************** # Quokka options # ***************************************************************** +cfl = 0.3 do_reflux = 1 do_subcycle = 1 - max_walltime = 6:00:00 max_timesteps = 5000 - -plotfile_interval = 100 checkpoint_interval = 5000 +plotfile_interval = 100 ascent_interval = 10 -projection_interval = -1 -statistics_interval = 10 derived_vars = pressure entropy nH temperature cooling_length \ cloud_fraction lab_velocity_x mass velocity_mag -projection.dirs = x z - -hydro.cfl = 0.3 -sharp_cloud_edge = 1 -do_frame_shift = 0 cooling.enabled = 1 cooling.grackle_data_file = "../extern/grackle_data_files/input/CloudyData_UVB=HM2012.h5" temperature_floor = 100 +sharp_cloud_edge = 1 +do_frame_shift = 0 nH_bg = 0.003356403333 # cm^-3 nH_cloud = 0.003356403333 # cm^-3 P_over_k = 1.304005e+04 # K cm^-3 From 9490fb7223ca9e47c4fd98bc1727947c756a60f9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 18:50:42 +0000 Subject: [PATCH 05/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/CloudyCooling.hpp | 74 ++++++++++++++++++---------------------- src/ShockCloud/cloud.cpp | 4 +-- 2 files changed, 36 insertions(+), 42 deletions(-) diff --git a/src/CloudyCooling.hpp b/src/CloudyCooling.hpp index e8219554d..37b97c814 100644 --- a/src/CloudyCooling.hpp +++ b/src/CloudyCooling.hpp @@ -304,58 +304,52 @@ template void computeCooling(amrex::MultiFab &mf, const Rea } } +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto ComputeCoolingLength(double rho, double Egas, double gamma, cloudyGpuConstTables const &tables) -> Real +{ + // convert (rho, Egas) to cooling length -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto -ComputeCoolingLength(double rho, double Egas, double gamma, - cloudyGpuConstTables const &tables) -> Real { - // convert (rho, Egas) to cooling length - - // 1. convert Egas (internal gas energy) to temperature - const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); + // 1. convert Egas (internal gas energy) to temperature + const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); - // 2. compute cooling time - // interpolate cooling rates from Cloudy tables - const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species - const Real nH = rhoH / (C::m_p + C::m_e); - const Real log_nH = std::log10(nH); - const Real log_T = std::log10(Tgas); + // 2. compute cooling time + // interpolate cooling rates from Cloudy tables + const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species + const Real nH = rhoH / (C::m_p + C::m_e); + const Real log_nH = std::log10(nH); + const Real log_T = std::log10(Tgas); const double logPrimCool = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.primCool); const double logMetalCool = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.metalCool); const double LambdaCool = FastMath::pow10(logPrimCool) + FastMath::pow10(logMetalCool); - const double Edot = (rhoH * rhoH) * LambdaCool; - // compute cooling time - const Real t_cool = Egas / Edot; + const double Edot = (rhoH * rhoH) * LambdaCool; + // compute cooling time + const Real t_cool = Egas / Edot; - // 3. compute cooling length c_s t_cool - // compute mu from mu(T) table - const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, - tables.log_Tgas, tables.meanMolWeight); - const Real c_s = std::sqrt(gamma * C::k_B * Tgas / (mu * (C::m_p + C::m_e))); + // 3. compute cooling length c_s t_cool + // compute mu from mu(T) table + const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.meanMolWeight); + const Real c_s = std::sqrt(gamma * C::k_B * Tgas / (mu * (C::m_p + C::m_e))); - // cooling length - return c_s * t_cool; + // cooling length + return c_s * t_cool; } -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto -ComputeMMW(double rho, double Egas, double gamma, - cloudyGpuConstTables const &tables) -> Real { - // convert (rho, Egas) to dimensionless mean molecular weight - - // 1. convert Egas (internal gas energy) to temperature - const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); - - // 2. compute mu from mu(T) table - const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species - const Real nH = rhoH / (C::m_p + C::m_e); - const Real log_nH = std::log10(nH); - const Real log_T = std::log10(Tgas); - const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, - tables.log_Tgas, tables.meanMolWeight); - return mu; -} +AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto ComputeMMW(double rho, double Egas, double gamma, cloudyGpuConstTables const &tables) -> Real +{ + // convert (rho, Egas) to dimensionless mean molecular weight + // 1. convert Egas (internal gas energy) to temperature + const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); + + // 2. compute mu from mu(T) table + const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species + const Real nH = rhoH / (C::m_p + C::m_e); + const Real log_nH = std::log10(nH); + const Real log_T = std::log10(Tgas); + const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.meanMolWeight); + return mu; +} void readCloudyData(std::string &grackle_hdf5_file, cloudy_tables &cloudyTables); diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index a6a3854ae..42d505e3e 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -51,7 +51,7 @@ struct ShockCloud { constexpr double parsec_in_cm = 3.086e18; // cm == 1 pc constexpr double solarmass_in_g = 1.99e33; // g == 1 Msun constexpr double keV_in_ergs = 1.60218e-9; // ergs == 1 keV -constexpr double m_H = C::m_p + C::m_e; // mass of hydrogen atom +constexpr double m_H = C::m_p + C::m_e; // mass of hydrogen atom template <> struct Physics_Traits { static constexpr bool is_hydro_enabled = true; @@ -63,7 +63,7 @@ template <> struct Physics_Traits { }; template <> struct quokka::EOS_Traits { - static constexpr double gamma = 5./3.; + static constexpr double gamma = 5. / 3.; static constexpr double mean_molecular_weight = C::m_u; static constexpr double boltzmann_constant = C::k_B; }; From 605c7492eb1f727135de1928a12ff78ba4f0479d Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 15:04:55 -0400 Subject: [PATCH 06/64] add option to read cloudy tables even if disabled --- src/RadhydroSimulation.hpp | 5 ++++- src/ShockCloud/cloud.cpp | 6 ------ tests/ShockCloud_32.in | 3 ++- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index 0b6311229..888af4949 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -325,11 +325,14 @@ template void RadhydroSimulation::readParmParse( // set cooling runtime parameters { amrex::ParmParse hpp("cooling"); + int alwaysReadTables = 0; hpp.query("enabled", enableCooling_); + hpp.query("read_tables_even_if_disabled", alwaysReadTables); hpp.query("grackle_data_file", coolingTableFilename_); - if (enableCooling_ == 1) { + if ((enableCooling_ == 1) || (alwaysReadTables == 1)) { // read Cloudy tables + amrex::Print() << "Reading Cloudy tables...\n"; quokka::cooling::readCloudyData(coolingTableFilename_, cloudyTables_); } } diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index a6a3854ae..b023a177e 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -81,7 +81,6 @@ AMREX_GPU_MANAGED static Real P_wind = 0; AMREX_GPU_MANAGED static Real delta_vx = 0; static Real delta_x = 0; -static bool enable_cooling = true; static bool sharp_cloud_edge = false; static bool do_frame_shift = true; @@ -702,11 +701,6 @@ auto problem_main() -> int Real P_over_k = NAN; Real M0 = NAN; - // enable cooling? - int enable_cooling = 1; // default (0 = off, 1, = on) - pp.query("enable_cooling", enable_cooling); - ::enable_cooling = enable_cooling == 1; - // use a sharp cloud edge? int sharp_cloud_edge = 0; pp.query("sharp_cloud_edge", sharp_cloud_edge); diff --git a/tests/ShockCloud_32.in b/tests/ShockCloud_32.in index af6e1cd7a..e9eea73f6 100644 --- a/tests/ShockCloud_32.in +++ b/tests/ShockCloud_32.in @@ -34,7 +34,8 @@ ascent_interval = 10 derived_vars = pressure entropy nH temperature cooling_length \ cloud_fraction lab_velocity_x mass velocity_mag -cooling.enabled = 1 +cooling.enabled = 0 +cooling.read_tables_even_if_disabled = 1 cooling.grackle_data_file = "../extern/grackle_data_files/input/CloudyData_UVB=HM2012.h5" temperature_floor = 100 From 0ecfffdba9d70ce2125fee32e2e530bb9915c2fb Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 15:12:53 -0400 Subject: [PATCH 07/64] remove old code --- src/ShockCloud/cloud.cpp | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index befbe8f6e..380250c58 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -185,30 +185,6 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBou } } -#if 0 -template <> -void HydroSystem::EnforceInternalEnergyFloor(amrex::Real const internalEnergyFloor, - amrex::MultiFab &state_mf, - SimulationData const &userData) -{ - // prevent negative internal energy - const Real gamma = HydroSystem::gamma_; - auto tables = userData.cloudyTables.const_tables(); - auto const &state = state_mf.arrays(); - - amrex::ParallelFor(state_mf, [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - const amrex::Real rho = state[bx](i, j, k, density_index); - const amrex::Real Eint = state[bx](i, j, k, internalEnergy_index); - const amrex::Real Eint_min = ComputeEgasFromTgas(rho, T_floor, gamma, tables); - - // reset Eint if less than internalEnergyFloor - if (Eint < Eint_min) { - state[bx](i, j, k, internalEnergy_index) = Eint_min; - } - }); -} -#endif - template <> void RadhydroSimulation::computeAfterTimestep() { const amrex::Real dt_coarse = dt_[0]; @@ -725,7 +701,6 @@ auto problem_main() -> int ::R_cloud *= parsec_in_cm; // convert to cm // (pre-shock) Mach number - // (N.B. *not* the same as Mach_wind!) pp.query("Mach_shock", M0); // dimensionless // compute background pressure @@ -777,7 +752,6 @@ auto problem_main() -> int const double max_time = 20.0 * t_cc; // set simulation parameters - sim.reconstructionOrder_ = 3; // PPM for hydro sim.densityFloor_ = 1.0e-3 * rho0; // density floor (to prevent vacuum) sim.stopTime_ = max_time; From dcc087cdea2ffb7a1bfa4cbc3915037599ab5908 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 15:34:27 -0400 Subject: [PATCH 08/64] removed unnecessary params --- src/ShockCloud/cloud.cpp | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index 380250c58..e8112f36d 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -7,7 +7,6 @@ /// \brief Implements a shock-cloud problem with radiative cooling. /// -#include #include #include @@ -34,7 +33,6 @@ #include "CloudyCooling.hpp" #include "EOS.hpp" -#include "ODEIntegrate.hpp" #include "RadhydroSimulation.hpp" #include "fundamental_constants.H" #include "hydro_system.hpp" @@ -56,10 +54,10 @@ constexpr double m_H = C::m_p + C::m_e; // mass of hydrogen atom template <> struct Physics_Traits { static constexpr bool is_hydro_enabled = true; static constexpr bool is_chemistry_enabled = false; - static constexpr int numMassScalars = 0; - static constexpr int numPassiveScalars = numMassScalars + 3; static constexpr bool is_radiation_enabled = false; static constexpr bool is_mhd_enabled = false; + static constexpr int numMassScalars = 0; + static constexpr int numPassiveScalars = numMassScalars + 3; }; template <> struct quokka::EOS_Traits { @@ -666,11 +664,9 @@ auto problem_main() -> int boundaryConditions[n].setLo(2, amrex::BCType::int_dir); boundaryConditions[n].setHi(2, amrex::BCType::int_dir); } - RadhydroSimulation sim(boundaryConditions); // Read problem parameters - // set global variables (read-only after setting them here) amrex::ParmParse pp; Real nH_bg = NAN; Real nH_cloud = NAN; @@ -752,8 +748,7 @@ auto problem_main() -> int const double max_time = 20.0 * t_cc; // set simulation parameters - sim.reconstructionOrder_ = 3; // PPM for hydro - sim.densityFloor_ = 1.0e-3 * rho0; // density floor (to prevent vacuum) + sim.reconstructionOrder_ = 3; // PPM for hydro sim.stopTime_ = max_time; #if 0 From 6c122576f3121bcec16b7603531cfe6a79f8a6f0 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 15:43:26 -0400 Subject: [PATCH 09/64] silence clang-tidy warnings --- src/ShockCloud/cloud.cpp | 40 ++++++++++++++++++++++------------------ 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index e8112f36d..5932cd6b8 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -41,7 +41,6 @@ #include "cloud.hpp" using amrex::Real; -using namespace amrex::literals; struct ShockCloud { }; // dummy type to allow compile-type polymorphism via template specialization @@ -66,21 +65,26 @@ template <> struct quokka::EOS_Traits { static constexpr double boltzmann_constant = C::k_B; }; +// global variables +namespace +{ +// Problem properties (set inside problem_main()) +bool sharp_cloud_edge = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +bool do_frame_shift = true; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) + // Cloud parameters (set inside problem_main()) -AMREX_GPU_MANAGED static Real rho0 = NAN; -AMREX_GPU_MANAGED static Real rho1 = NAN; -AMREX_GPU_MANAGED static Real P0 = NAN; -AMREX_GPU_MANAGED static Real R_cloud = NAN; +AMREX_GPU_MANAGED Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real rho1 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real R_cloud = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) // cloud-tracking variables needed for Dirichlet boundary condition -AMREX_GPU_MANAGED static Real rho_wind = 0; -AMREX_GPU_MANAGED static Real v_wind = 0; -AMREX_GPU_MANAGED static Real P_wind = 0; -AMREX_GPU_MANAGED static Real delta_vx = 0; -static Real delta_x = 0; - -static bool sharp_cloud_edge = false; -static bool do_frame_shift = true; +AMREX_GPU_MANAGED Real rho_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real delta_vx = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real delta_x = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +} // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid) { @@ -99,9 +103,9 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quok auto const &state = grid.array_; amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { - Real const x = prob_lo[0] + (i + Real(0.5)) * dx[0]; - Real const y = prob_lo[1] + (j + Real(0.5)) * dx[1]; - Real const z = prob_lo[2] + (k + Real(0.5)) * dx[2]; + Real const x = prob_lo[0] + (i + static_cast(0.5)) * dx[0]; + Real const y = prob_lo[1] + (j + static_cast(0.5)) * dx[1]; + Real const z = prob_lo[2] + (k + static_cast(0.5)) * dx[2]; Real const R = std::sqrt(std::pow(x - x0, 2) + std::pow(y - y0, 2) + std::pow(z - z0, 2)); Real rho = NAN; @@ -154,7 +158,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBou amrex::Box const &box = geom.Domain(); const auto &domain_lo = box.loVect(); - const int ilo = domain_lo[0]; + const int ilo = domain_lo[0]; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) const Real delta_vx = ::delta_vx; const Real v_wind = ::v_wind; @@ -413,7 +417,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto ComputeCellTemp(int i, int j, int k, am Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); Real const Egas = state(i, j, k, HydroSystem::energy_index); Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - return ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + return ComputeTgasFromEgas(rho, Eint, gamma, tables); } #if 0 From 44d774c74c520ba1cdcf845186de6bf223115fb8 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 17:34:00 -0400 Subject: [PATCH 10/64] Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/ShockCloud/cloud.cpp | 72 ++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index 5932cd6b8..1177bb1e6 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -88,7 +88,7 @@ Real delta_x = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-varia template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid) { - amrex::GpuArray dx = grid.dx_; + amrex::GpuArray const dx = grid.dx_; amrex::GpuArray prob_lo = grid.prob_lo_; amrex::GpuArray prob_hi = grid.prob_hi_; @@ -196,8 +196,8 @@ template <> void RadhydroSimulation::computeAfterTimestep() // N.B. must weight by passive scalar of cloud, since the background has // non-negligible momentum! - int nc = 1; // number of components in temporary MF - int ng = 0; // number of ghost cells in temporary MF + int const nc = 1; // number of components in temporary MF + int const ng = 0; // number of ghost cells in temporary MF amrex::MultiFab temp_mf(boxArray(0), DistributionMap(0), nc, ng); // compute x-momentum @@ -237,15 +237,15 @@ template <> void RadhydroSimulation::computeAfterTimestep() auto const &mf = state_new_cc_[lev]; auto const &state = state_new_cc_[lev].arrays(); amrex::ParallelFor(mf, [=] AMREX_GPU_DEVICE(int box, int i, int j, int k) noexcept { - Real rho = state[box](i, j, k, HydroSystem::density_index); - Real xmom = state[box](i, j, k, HydroSystem::x1Momentum_index); - Real ymom = state[box](i, j, k, HydroSystem::x2Momentum_index); - Real zmom = state[box](i, j, k, HydroSystem::x3Momentum_index); - Real E = state[box](i, j, k, HydroSystem::energy_index); - Real KE = 0.5 * (xmom * xmom + ymom * ymom + zmom * zmom) / rho; - Real Eint = E - KE; - Real new_xmom = xmom - rho * vx_cm; - Real new_KE = 0.5 * (new_xmom * new_xmom + ymom * ymom + zmom * zmom) / rho; + Real const rho = state[box](i, j, k, HydroSystem::density_index); + Real const xmom = state[box](i, j, k, HydroSystem::x1Momentum_index); + Real const ymom = state[box](i, j, k, HydroSystem::x2Momentum_index); + Real const zmom = state[box](i, j, k, HydroSystem::x3Momentum_index); + Real const E = state[box](i, j, k, HydroSystem::energy_index); + Real const KE = 0.5 * (xmom * xmom + ymom * ymom + zmom * zmom) / rho; + Real const Eint = E - KE; + Real const new_xmom = xmom - rho * vx_cm; + Real const new_KE = 0.5 * (new_xmom * new_xmom + ymom * ymom + zmom * zmom) / rho; state[box](i, j, k, HydroSystem::x1Momentum_index) = new_xmom; state[box](i, j, k, HydroSystem::energy_index) = Eint + new_KE; @@ -266,13 +266,13 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: auto const &state = state_new_cc_[lev].const_arrays(); amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real rho = state[bx](i, j, k, HydroSystem::density_index); - Real x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); output[bx](i, j, k, ncomp) = Tgas; }); @@ -282,8 +282,8 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: auto const &state = state_new_cc_[lev].const_arrays(); amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real rho = state[bx](i, j, k, HydroSystem::density_index); - Real nH = (quokka::cooling::cloudy_H_mass_fraction * rho) / m_H; + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const nH = (quokka::cooling::cloudy_H_mass_fraction * rho) / m_H; output[bx](i, j, k, ncomp) = nH; }); @@ -294,15 +294,15 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: auto const &state = state_new_cc_[lev].const_arrays(); amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real rho = state[bx](i, j, k, HydroSystem::density_index); - Real x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); - Real mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); - Real ndens = rho / (mu * m_H); + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + Real const mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); + Real const ndens = rho / (mu * m_H); output[bx](i, j, k, ncomp) = ndens * Tgas; // [K cm^-3] }); @@ -313,12 +313,12 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: auto const &state = state_new_cc_[lev].const_arrays(); amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real rho = state[bx](i, j, k, HydroSystem::density_index); - Real x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const rho = state[bx](i, j, k, HydroSystem::density_index); + Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); Real mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); Real ndens = rho / (mu * m_H); From 2d85bf1552372426583340c01c7c018b76416984 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 16 Aug 2023 17:44:07 -0400 Subject: [PATCH 11/64] Apply suggestions from code review Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/ShockCloud/cloud.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index 1177bb1e6..7d11419a5 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -319,11 +319,11 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); - Real mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); - Real ndens = rho / (mu * m_H); - Real K_cgs = C::k_B * Tgas * std::pow(ndens, -2. / 3.); // ergs cm^2 - Real K_keV_cm2 = K_cgs / keV_in_ergs; // convert to units of keV cm^2 + Real const Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); + Real const mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); + Real const ndens = rho / (mu * m_H); + Real const K_cgs = C::k_B * Tgas * std::pow(ndens, -2. / 3.); // ergs cm^2 + Real const K_keV_cm2 = K_cgs / keV_in_ergs; // convert to units of keV cm^2 output[bx](i, j, k, ncomp) = K_keV_cm2; }); @@ -335,7 +335,7 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: const Real dvol = dx[0] * dx[1] * dx[2]; amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real rho = state[bx](i, j, k, HydroSystem::density_index); + Real const rho = state[bx](i, j, k, HydroSystem::density_index); output[bx](i, j, k, ncomp) = rho * dvol; }); @@ -346,9 +346,9 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { // cloud partial density - Real rho_cloud = state[bx](i, j, k, HydroSystem::scalar0_index + 1); + Real const rho_cloud = state[bx](i, j, k, HydroSystem::scalar0_index + 1); // non-cloud partial density - Real rho_bg = state[bx](i, j, k, HydroSystem::scalar0_index + 2); + Real const rho_bg = state[bx](i, j, k, HydroSystem::scalar0_index + 2); // NOTE: rho_cloud + rho_bg only equals hydro rho up to truncation error! output[bx](i, j, k, ncomp) = rho_cloud / (rho_cloud + rho_bg); @@ -671,7 +671,7 @@ auto problem_main() -> int RadhydroSimulation sim(boundaryConditions); // Read problem parameters - amrex::ParmParse pp; + amrex::ParmParse const pp; Real nH_bg = NAN; Real nH_cloud = NAN; Real P_over_k = NAN; @@ -773,6 +773,6 @@ auto problem_main() -> int sim.evolve(); // Cleanup and exit - int status = 0; + int const status = 0; return status; } From c6d4c7ee2112091d54b268a2c8df49a55c12856d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:44:40 +0000 Subject: [PATCH 12/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/ShockCloud/cloud.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index 7d11419a5..81e8f340a 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -323,7 +323,7 @@ template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std: Real const mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); Real const ndens = rho / (mu * m_H); Real const K_cgs = C::k_B * Tgas * std::pow(ndens, -2. / 3.); // ergs cm^2 - Real const K_keV_cm2 = K_cgs / keV_in_ergs; // convert to units of keV cm^2 + Real const K_keV_cm2 = K_cgs / keV_in_ergs; // convert to units of keV cm^2 output[bx](i, j, k, ncomp) = K_keV_cm2; }); From a9e0c3ecf9f82cd37fa23ecb0282898dc211ded1 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 17 Aug 2023 12:38:11 -0400 Subject: [PATCH 13/64] fix integratorOrder = 1 --- src/RadhydroSimulation.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index 888af4949..1f7b8ca66 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -968,7 +968,7 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o amrex::Gpu::streamSynchronizeAll(); // Stage 2 of RK2-SSP - { + if (integratorOrder_ == 2) { // update ghost zones [intermediate stage stored in state_inter_cc_] fillBoundaryConditions(state_inter_cc_, state_inter_cc_, lev, time + dt_lev, quokka::centering::cc, quokka::direction::na, PreInterpState, PostInterpState); @@ -1033,6 +1033,8 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o // increment flux registers incrementFluxRegisters(fr_as_crse, fr_as_fine, fluxArrays, lev, fluxScaleFactor * dt_lev); } + } else { // we are only doing forward Euler + amrex::Copy(state_new_cc_[lev], state_inter_cc_, 0, 0, ncompHydro_, 0); } amrex::Gpu::streamSynchronizeAll(); From 8216dfcd18bc33ff13ebef464b178e1b2870fcaf Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 18 Aug 2023 13:45:27 -0400 Subject: [PATCH 14/64] add hydro debugging output --- src/RadhydroSimulation.hpp | 92 +++++++++++++++++++++++++++++++++++--- src/simulation.hpp | 33 ++++++++++---- 2 files changed, 110 insertions(+), 15 deletions(-) diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index 1f7b8ca66..6eff50af4 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -10,7 +10,10 @@ /// timestepping, solving, and I/O of a simulation for radiation moments. #include +#include #include +#include +#include #include #include #include @@ -24,6 +27,7 @@ #include "AMReX_BCRec.H" #include "AMReX_BLassert.H" #include "AMReX_Box.H" +#include "AMReX_Conduit_Blueprint.H" #include "AMReX_FArrayBox.H" #include "AMReX_FabArray.H" #include "AMReX_FabArrayUtility.H" @@ -36,8 +40,10 @@ #include "AMReX_IntVect.H" #include "AMReX_MultiFab.H" #include "AMReX_MultiFabUtil.H" +#include "AMReX_ParallelDescriptor.H" #include "AMReX_ParmParse.H" #include "AMReX_PhysBCFunct.H" +#include "AMReX_PlotFileUtil.H" #include "AMReX_Print.H" #include "AMReX_REAL.H" #include "AMReX_Utility.H" @@ -70,9 +76,11 @@ template class RadhydroSimulation : public AMRSimulation::componentNames_fc_; using AMRSimulation::cflNumber_; using AMRSimulation::fillBoundaryConditions; + using AMRSimulation::CustomPlotFileName; using AMRSimulation::geom; using AMRSimulation::grids; using AMRSimulation::dmap; + using AMRSimulation::istep; using AMRSimulation::flux_reg_; using AMRSimulation::incrementFluxRegisters; using AMRSimulation::finest_level; @@ -114,6 +122,7 @@ template class RadhydroSimulation : public AMRSimulation void RadhydroSimulation::readParmParse( // set hydro runtime parameters { amrex::ParmParse hpp("hydro"); + hpp.query("low_level_debugging_output", lowLevelDebuggingOutput_); + hpp.query("rk_integrator_order", integratorOrder_); hpp.query("reconstruction_order", reconstructionOrder_); hpp.query("use_dual_energy", useDualEnergy_); hpp.query("abort_on_fofc_failure", abortOnFofcFailure_); @@ -904,6 +915,18 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o fillBoundaryConditions(state_old_cc_tmp, state_old_cc_tmp, lev, time, quokka::centering::cc, quokka::direction::na, PreInterpState, PostInterpState); + // LOW LEVEL DEBUGGING: output state_old_cc_tmp (with ghost cells) + if (lowLevelDebuggingOutput_ == 1) { + // write Blueprint HDF5 files + conduit::Node mesh; + amrex::SingleLevelToBlueprint(state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev]+1, mesh); + amrex::WriteBlueprintFiles(mesh, "debug_stage1_filled_state_old", istep[lev]+1, "hdf5"); + + // write AMReX plotfile + //WriteSingleLevelPlotfile(CustomPlotFileName("debug_stage1_filled_state_old", istep[lev]+1), + // state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev]+1); + } + // check state validity AMREX_ASSERT(!state_old_cc_tmp.contains_nan(0, state_old_cc_tmp.nComp())); AMREX_ASSERT(!state_old_cc_tmp.contains_nan()); // check ghost cells @@ -921,6 +944,30 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o HydroSystem::AddInternalEnergyPdV(rhs, stateOld, dx, faceVel, redoFlag); HydroSystem::PredictStep(stateOld, stateNew, rhs, dt_lev, ncompHydro_, redoFlag); + // LOW LEVEL DEBUGGING: output rhs + if (lowLevelDebuggingOutput_ == 1) { + // write rhs + std::string plotfile_name = CustomPlotFileName("debug_stage1_rhs_fluxes", istep[lev]+1); + WriteSingleLevelPlotfile(plotfile_name, rhs, componentNames_cc_, geom[lev], time, istep[lev]+1); + + // write fluxes + for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { + if (amrex::ParallelDescriptor::IOProcessor()) { + std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); + } + std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("Flux_") + quokka::face_dir_str[idim]); + amrex::VisMF::Write(fluxArrays[idim], fullprefix); + } + // write face velocities + for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { + if (amrex::ParallelDescriptor::IOProcessor()) { + std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); + } + std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("FaceVel_") + quokka::face_dir_str[idim]); + amrex::VisMF::Write(faceVel[idim], fullprefix); + } + } + // do first-order flux correction (FOFC) amrex::Gpu::streamSynchronizeAll(); // just in case int ncells_bad = redoFlag.sum(0); @@ -1126,7 +1173,7 @@ auto RadhydroSimulation::computeHydroFluxes(amrex::MultiFab const &co auto ba = grids[lev]; auto dm = dmap[lev]; const int flatteningGhost = 2; - const int reconstructRange = 1; + const int reconstructGhost = 1; // allocate temporary MultiFabs amrex::MultiFab primVar(ba, dm, nvars, nghost_cc_); @@ -1142,8 +1189,8 @@ auto RadhydroSimulation::computeHydroFluxes(amrex::MultiFab const &co for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { auto ba_face = amrex::convert(ba, amrex::IntVect::TheDimensionVector(idim)); - leftState[idim] = amrex::MultiFab(ba_face, dm, nvars, reconstructRange); - rightState[idim] = amrex::MultiFab(ba_face, dm, nvars, reconstructRange); + leftState[idim] = amrex::MultiFab(ba_face, dm, nvars, reconstructGhost); + rightState[idim] = amrex::MultiFab(ba_face, dm, nvars, reconstructGhost); flux[idim] = amrex::MultiFab(ba_face, dm, nvars, 0); facevel[idim] = amrex::MultiFab(ba_face, dm, 1, 0); } @@ -1158,15 +1205,48 @@ auto RadhydroSimulation::computeHydroFluxes(amrex::MultiFab const &co // compute flux functions AMREX_D_TERM(hydroFluxFunction(primVar, leftState[0], rightState[0], flux[0], facevel[0], flatCoefs[0], flatCoefs[1], flatCoefs[2], - reconstructRange, nvars); + reconstructGhost, nvars); , hydroFluxFunction(primVar, leftState[1], rightState[1], flux[1], facevel[1], flatCoefs[0], flatCoefs[1], flatCoefs[2], - reconstructRange, nvars); + reconstructGhost, nvars); , hydroFluxFunction(primVar, leftState[2], rightState[2], flux[2], facevel[2], flatCoefs[0], flatCoefs[1], flatCoefs[2], - reconstructRange, nvars);) + reconstructGhost, nvars);) // synchronization point to prevent MultiFabs from going out of scope amrex::Gpu::streamSynchronizeAll(); + // LOW LEVEL DEBUGGING: output all of the temporary MultiFabs + if (lowLevelDebuggingOutput_ == 1) { + // write primitive cell-centered state + std::string plotfile_name = CustomPlotFileName("debug_reconstruction", istep[lev]+1); + WriteSingleLevelPlotfile(plotfile_name, primVar, componentNames_cc_, geom[lev], 0.0, istep[lev]+1); + + // write flattening coefficients + std::string flatx_filename = CustomPlotFileName("debug_flattening_x", istep[lev]+1); + std::string flaty_filename = CustomPlotFileName("debug_flattening_y", istep[lev]+1); + std::string flatz_filename = CustomPlotFileName("debug_flattening_z", istep[lev]+1); + amrex::Vector flatCompNames{"chi"}; + WriteSingleLevelPlotfile(flatx_filename, flatCoefs[0], flatCompNames, geom[lev], 0.0, istep[lev]+1); + WriteSingleLevelPlotfile(flaty_filename, flatCoefs[1], flatCompNames, geom[lev], 0.0, istep[lev]+1); + WriteSingleLevelPlotfile(flatz_filename, flatCoefs[2], flatCompNames, geom[lev], 0.0, istep[lev]+1); + + // write L interface states + for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { + if (amrex::ParallelDescriptor::IOProcessor()) { + std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); + } + std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("StateL_") + quokka::face_dir_str[idim]); + amrex::VisMF::Write(leftState[idim], fullprefix); + } + // write R interface states + for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { + if (amrex::ParallelDescriptor::IOProcessor()) { + std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); + } + std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("StateR_") + quokka::face_dir_str[idim]); + amrex::VisMF::Write(rightState[idim], fullprefix); + } + } + // return flux and face-centered velocities return std::make_pair(std::move(flux), std::move(facevel)); } diff --git a/src/simulation.hpp b/src/simulation.hpp index 130f3d773..5dfe43ef2 100644 --- a/src/simulation.hpp +++ b/src/simulation.hpp @@ -216,6 +216,8 @@ template class AMRSimulation : public amrex::AmrCore // I/O functions [[nodiscard]] auto PlotFileName(int lev) const -> std::string; + [[nodiscard]] auto CustomPlotFileName(const char *base, int lev) const -> std::string; + [[nodiscard]] auto GetPlotfileVarNames() const -> amrex::Vector; [[nodiscard]] auto PlotFileMF() const -> amrex::Vector; [[nodiscard]] auto PlotFileMFAtLevel(int lev) const -> amrex::MultiFab; void WriteMetadataFile(std::string const &plotfilename) const; @@ -1540,6 +1542,12 @@ template void AMRSimulation::AverageDownTo(int c // get plotfile name template auto AMRSimulation::PlotFileName(int lev) const -> std::string { return amrex::Concatenate(plot_file, lev, 5); } +// get plotfile name +template auto AMRSimulation::CustomPlotFileName(const char *base, int lev) const -> std::string { + std::string base_str(base); + return amrex::Concatenate(base_str, lev, 5); +} + template void AMRSimulation::AverageFCToCC(amrex::MultiFab &mf_cc, const amrex::MultiFab &mf_fc, int idim, int dstcomp_start, int srccomp_start, int srccomp_total, int nGrow) const @@ -1690,6 +1698,19 @@ template void AMRSimulation::RenderAscent() } #endif // AMREX_USE_ASCENT +template auto AMRSimulation::GetPlotfileVarNames() const -> amrex::Vector +{ + amrex::Vector varnames; + varnames.insert(varnames.end(), componentNames_cc_.begin(), componentNames_cc_.end()); + if constexpr (Physics_Indices::nvarTotal_fc > 0) { + for (int icomp = 0; icomp < Physics_Indices::nvarTotal_fc; ++icomp) { + varnames.push_back(componentNames_fc_[icomp]); + } + } + varnames.insert(varnames.end(), derivedNames_.begin(), derivedNames_.end()); + return varnames; +} + // write plotfile to disk template void AMRSimulation::WritePlotFile() const { @@ -1703,17 +1724,11 @@ template void AMRSimulation::WritePlotFile() con #endif // now construct output and submit to async write queue - const std::string &plotfilename = PlotFileName(istep[0]); amrex::Vector mf = PlotFileMF(); amrex::Vector mf_ptr = amrex::GetVecOfConstPtrs(mf); - amrex::Vector varnames; - varnames.insert(varnames.end(), componentNames_cc_.begin(), componentNames_cc_.end()); - if constexpr (Physics_Indices::nvarTotal_fc > 0) { - for (int icomp = 0; icomp < Physics_Indices::nvarTotal_fc; ++icomp) { - varnames.push_back(componentNames_fc_[icomp]); - } - } - varnames.insert(varnames.end(), derivedNames_.begin(), derivedNames_.end()); + + const std::string &plotfilename = PlotFileName(istep[0]); + auto varnames = GetPlotfileVarNames(); // write plotfile amrex::Print() << "Writing plotfile " << plotfilename << "\n"; From 3e4d0886ea468a3b96e044e183fdb57754b365cd Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 18 Aug 2023 13:45:46 -0400 Subject: [PATCH 15/64] update cloud settings --- src/ShockCloud/cloud.cpp | 2 +- tests/ShockCloud_32.in | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index 81e8f340a..a42909204 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -749,7 +749,7 @@ auto problem_main() -> int amrex::Print() << std::endl; // compute maximum simulation time - const double max_time = 20.0 * t_cc; + const double max_time = 100.0 * t_cc; // set simulation parameters sim.reconstructionOrder_ = 3; // PPM for hydro diff --git a/tests/ShockCloud_32.in b/tests/ShockCloud_32.in index e9eea73f6..b42f599c8 100644 --- a/tests/ShockCloud_32.in +++ b/tests/ShockCloud_32.in @@ -27,13 +27,18 @@ cfl = 0.3 do_reflux = 1 do_subcycle = 1 max_walltime = 6:00:00 -max_timesteps = 5000 +max_timesteps = 350 checkpoint_interval = 5000 plotfile_interval = 100 -ascent_interval = 10 +ascent_interval = 1 derived_vars = pressure entropy nH temperature cooling_length \ cloud_fraction lab_velocity_x mass velocity_mag +hydro.rk_integrator_order = 1 +hydro.reconstruction_order = 1 +hydro.use_dual_energy = 0 +hydro.low_level_debugging_output = 1 + cooling.enabled = 0 cooling.read_tables_even_if_disabled = 1 cooling.grackle_data_file = "../extern/grackle_data_files/input/CloudyData_UVB=HM2012.h5" @@ -45,4 +50,4 @@ nH_bg = 0.003356403333 # cm^-3 nH_cloud = 0.003356403333 # cm^-3 P_over_k = 1.304005e+04 # K cm^-3 R_cloud_pc = 16.09084149928867 # pc -Mach_shock = 1.05 +Mach_shock = 1.2 From f51c064cd51bcd08f8a9869083c665aa8c3ccbda Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 18 Aug 2023 14:25:11 -0400 Subject: [PATCH 16/64] revert shockcloud to development --- src/ShockCloud/cloud.cpp | 850 +++++++++------------------------------ 1 file changed, 192 insertions(+), 658 deletions(-) diff --git a/src/ShockCloud/cloud.cpp b/src/ShockCloud/cloud.cpp index a42909204..9fd6e54c7 100644 --- a/src/ShockCloud/cloud.cpp +++ b/src/ShockCloud/cloud.cpp @@ -6,8 +6,7 @@ /// \file cloud.cpp /// \brief Implements a shock-cloud problem with radiative cooling. /// - -#include +#include #include #include "AMReX.H" @@ -16,91 +15,114 @@ #include "AMReX_BLassert.H" #include "AMReX_FabArray.H" #include "AMReX_Geometry.H" -#include "AMReX_GpuContainers.H" #include "AMReX_GpuDevice.H" -#include "AMReX_GpuQualifiers.H" #include "AMReX_IntVect.H" -#include "AMReX_MFParallelFor.H" #include "AMReX_MultiFab.H" #include "AMReX_ParallelContext.H" #include "AMReX_ParallelDescriptor.H" -#include "AMReX_ParmParse.H" #include "AMReX_REAL.H" -#include "AMReX_Reduce.H" #include "AMReX_SPACE.H" #include "AMReX_TableData.H" #include "AMReX_iMultiFab.H" -#include "CloudyCooling.hpp" -#include "EOS.hpp" #include "RadhydroSimulation.hpp" -#include "fundamental_constants.H" +#include "cloud.hpp" #include "hydro_system.hpp" #include "radiation_system.hpp" -#include "cloud.hpp" - using amrex::Real; struct ShockCloud { }; // dummy type to allow compile-type polymorphism via template specialization -constexpr double parsec_in_cm = 3.086e18; // cm == 1 pc -constexpr double solarmass_in_g = 1.99e33; // g == 1 Msun -constexpr double keV_in_ergs = 1.60218e-9; // ergs == 1 keV -constexpr double m_H = C::m_p + C::m_e; // mass of hydrogen atom +constexpr double seconds_in_year = 3.154e7; + +template <> struct quokka::EOS_Traits { + static constexpr double gamma = 5. / 3.; // default value + static constexpr double mean_molecular_weight = 1.0; + static constexpr double boltzmann_constant = C::k_B; +}; template <> struct Physics_Traits { + // cell-centred static constexpr bool is_hydro_enabled = true; static constexpr bool is_chemistry_enabled = false; + static constexpr int numMassScalars = 0; // number of mass scalars + static constexpr int numPassiveScalars = numMassScalars + 0; // number of passive scalars static constexpr bool is_radiation_enabled = false; + // face-centred static constexpr bool is_mhd_enabled = false; - static constexpr int numMassScalars = 0; - static constexpr int numPassiveScalars = numMassScalars + 3; }; -template <> struct quokka::EOS_Traits { - static constexpr double gamma = 5. / 3.; - static constexpr double mean_molecular_weight = C::m_u; - static constexpr double boltzmann_constant = C::k_B; +template <> struct SimulationData { + std::unique_ptr> table_data; }; -// global variables -namespace -{ -// Problem properties (set inside problem_main()) -bool sharp_cloud_edge = false; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -bool do_frame_shift = true; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +constexpr Real Tgas0 = 1.0e7; // K +constexpr Real nH0 = 1.0e-4; // cm^-3 +constexpr Real nH1 = 1.0e-1; // cm^-3 +constexpr Real R_cloud = 5.0 * 3.086e18; // cm [5 pc] +constexpr Real M0 = 2.0; // Mach number of shock + +constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 +constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 +constexpr Real rho1 = nH1 * (C::m_p + C::m_e); -// Cloud parameters (set inside problem_main()) -AMREX_GPU_MANAGED Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real rho1 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real R_cloud = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +// perturbation parameters +const int kmin = 0; +const int kmax = 16; +Real const A = 0.05 / kmax; // cloud-tracking variables needed for Dirichlet boundary condition -AMREX_GPU_MANAGED Real rho_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real delta_vx = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -Real delta_x = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -} // namespace - -template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid) +AMREX_GPU_MANAGED static Real rho_wind = 0; +AMREX_GPU_MANAGED static Real v_wind = 0; +AMREX_GPU_MANAGED static Real P_wind = 0; +AMREX_GPU_MANAGED static Real delta_vx = 0; + +template <> void RadhydroSimulation::preCalculateInitialConditions() { - amrex::GpuArray const dx = grid.dx_; - amrex::GpuArray prob_lo = grid.prob_lo_; - amrex::GpuArray prob_hi = grid.prob_hi_; + // generate random phases + amrex::Array tlo{kmin, kmin, kmin}; + amrex::Array thi{kmax, kmax, kmax}; + userData_.table_data = std::make_unique>(tlo, thi); + + amrex::TableData h_table_data(tlo, thi, amrex::The_Pinned_Arena()); + auto const &h_table = h_table_data.table(); + + // Initialize data on the hostcd + // 64-bit Mersenne Twister (do not use 32-bit version for sampling doubles!) + std::mt19937_64 rng(1); // NOLINT + std::uniform_real_distribution sample_phase(0., 2.0 * M_PI); + for (int j = tlo[0]; j <= thi[0]; ++j) { + for (int i = tlo[1]; i <= thi[1]; ++i) { + for (int k = tlo[2]; k <= thi[2]; ++k) { + h_table(i, j, k) = sample_phase(rng); + } + } + } - Real const x0 = prob_lo[0] + 0.5 * (prob_hi[0] - prob_lo[0]); - Real const y0 = prob_lo[1] + 0.5 * (prob_hi[1] - prob_lo[1]); - Real const z0 = prob_lo[2] + 0.5 * (prob_hi[2] - prob_lo[2]); + // Copy data to GPU memory + userData_.table_data->copy(h_table_data); + amrex::Gpu::streamSynchronize(); +} - auto tables = cloudyTables_.const_tables(); - const bool sharp_cloud_edge = ::sharp_cloud_edge; +template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) +{ + // set initial conditions + amrex::GpuArray const dx = grid_elem.dx_; + amrex::GpuArray prob_lo = grid_elem.prob_lo_; + amrex::GpuArray prob_hi = grid_elem.prob_hi_; + const amrex::Box &indexRange = grid_elem.indexRange_; + const amrex::Array4 &state_cc = grid_elem.array_; + auto const &phase_table = userData_.table_data->const_table(); + + Real const Lx = (prob_hi[0] - prob_lo[0]); + Real const Ly = (prob_hi[1] - prob_lo[1]); + Real const Lz = (prob_hi[2] - prob_lo[2]); - const amrex::Box &indexRange = grid.indexRange_; - auto const &state = grid.array_; + Real const x0 = prob_lo[0] + 0.5 * (prob_hi[0] - prob_lo[0]); + Real const y0 = prob_lo[1] + 0.8 * (prob_hi[1] - prob_lo[1]); + Real const z0 = prob_lo[2] + 0.5 * (prob_hi[2] - prob_lo[2]); amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { Real const x = prob_lo[0] + (i + static_cast(0.5)) * dx[0]; @@ -108,43 +130,39 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quok Real const z = prob_lo[2] + (k + static_cast(0.5)) * dx[2]; Real const R = std::sqrt(std::pow(x - x0, 2) + std::pow(y - y0, 2) + std::pow(z - z0, 2)); - Real rho = NAN; - Real C = NAN; - - if (sharp_cloud_edge) { - if (R < R_cloud) { - rho = rho1; // cloud density - C = 1.0; // concentration is unity inside the cloud - } else { - rho = rho0; // background density - C = 0.0; // concentration is zero outside the cloud + // compute perturbations + Real delta_rho = 0; + for (int ki = kmin; ki < kmax; ++ki) { + for (int kj = kmin; kj < kmax; ++kj) { + for (int kk = kmin; kk < kmax; ++kk) { + if ((ki == 0) && (kj == 0) && (kk == 0)) { + continue; + } + Real const kx = 2.0 * M_PI * static_cast(ki) / Lx; + Real const ky = 2.0 * M_PI * static_cast(kj) / Lx; + Real const kz = 2.0 * M_PI * static_cast(kk) / Lx; + delta_rho += A * std::sin(x * kx + y * ky + z * kz + phase_table(ki, kj, kk)); + } } - } else { - const Real h_smooth = R_cloud / 20.; - const Real ramp = 0.5 * (1. - std::tanh((R - R_cloud) / h_smooth)); - rho = ramp * (rho1 - rho0) + rho0; - C = ramp * 1.0; // concentration is unity inside the cloud } + AMREX_ALWAYS_ASSERT(delta_rho > -1.0); - AMREX_ALWAYS_ASSERT(rho > 0.); - AMREX_ALWAYS_ASSERT(C >= 0.); - AMREX_ALWAYS_ASSERT(C <= 1.); - + Real rho = rho0 * (1.0 + delta_rho); // background density + if (R < R_cloud) { + rho = rho1 * (1.0 + delta_rho); // cloud density + } Real const xmom = 0; Real const ymom = 0; Real const zmom = 0; - Real const Eint = P0 / (quokka::EOS_Traits::gamma - 1.); + Real const Eint = (quokka::EOS_Traits::gamma - 1.) * P0; Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - state(i, j, k, RadSystem::gasDensity_index) = rho; - state(i, j, k, RadSystem::x1GasMomentum_index) = xmom; - state(i, j, k, RadSystem::x2GasMomentum_index) = ymom; - state(i, j, k, RadSystem::x3GasMomentum_index) = zmom; - state(i, j, k, RadSystem::gasEnergy_index) = Egas; - state(i, j, k, RadSystem::gasInternalEnergy_index) = Eint; - state(i, j, k, RadSystem::scalar0_index) = C; - state(i, j, k, RadSystem::scalar0_index + 1) = C * rho; // cloud partial density - state(i, j, k, RadSystem::scalar0_index + 2) = (1.0 - C) * rho; // non-cloud partial density + state_cc(i, j, k, HydroSystem::density_index) = rho; + state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; + state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; + state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; + state_cc(i, j, k, HydroSystem::energy_index) = Egas; + state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; }); } @@ -154,617 +172,133 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBou const Real /*time*/, const amrex::BCRec * /*bcr*/, int /*bcomp*/, int /*orig_comp*/) { - auto [i, j, k] = iv.toArray(); + auto [i, j, k] = iv.dim3(); amrex::Box const &box = geom.Domain(); - const auto &domain_lo = box.loVect(); - const int ilo = domain_lo[0]; // NOLINT(cppcoreguidelines-pro-bounds-pointer-arithmetic) - - const Real delta_vx = ::delta_vx; - const Real v_wind = ::v_wind; - const Real rho_wind = ::rho_wind; - const Real P_wind = ::P_wind; - - if (i < ilo) { - // x1 lower boundary -- constant - Real const vx = v_wind - delta_vx; - Real const rho = rho_wind; - Real const xmom = rho_wind * vx; - Real const ymom = 0; + const auto &domain_lo = box.loVect3d(); + const auto &domain_hi = box.hiVect3d(); + const int jhi = domain_hi[1]; + + if (j >= jhi) { + // x2 upper boundary -- constant + // compute downstream shock conditions from rho0, P0, and M0 + constexpr Real gamma = quokka::EOS_Traits::gamma; + constexpr Real rho2 = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); + constexpr Real P2 = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); + Real const v2 = -M0 * std::sqrt(gamma * P2 / rho2); + + Real const rho = rho2; + Real const xmom = 0; + Real const ymom = rho2 * v2; Real const zmom = 0; - Real const Eint = P_wind / (HydroSystem::gamma_ - 1.); + Real const Eint = (gamma - 1.) * P2; Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - consVar(i, j, k, RadSystem::gasDensity_index) = rho; - consVar(i, j, k, RadSystem::x1GasMomentum_index) = xmom; - consVar(i, j, k, RadSystem::x2GasMomentum_index) = ymom; - consVar(i, j, k, RadSystem::x3GasMomentum_index) = zmom; - consVar(i, j, k, RadSystem::gasEnergy_index) = Egas; - consVar(i, j, k, RadSystem::gasInternalEnergy_index) = Eint; - consVar(i, j, k, RadSystem::scalar0_index) = 0; - consVar(i, j, k, RadSystem::scalar0_index + 1) = 0; // cloud partial density - consVar(i, j, k, RadSystem::scalar0_index + 2) = rho; // non-cloud partial density + consVar(i, j, k, HydroSystem::density_index) = rho; + consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; + consVar(i, j, k, HydroSystem::x2Momentum_index) = ymom; + consVar(i, j, k, HydroSystem::x3Momentum_index) = zmom; + consVar(i, j, k, HydroSystem::energy_index) = Egas; + consVar(i, j, k, HydroSystem::internalEnergy_index) = Eint; } } -template <> void RadhydroSimulation::computeAfterTimestep() +template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp_cc_in) const { - const amrex::Real dt_coarse = dt_[0]; - - // perform Galilean transformation (velocity shift to center-of-mass frame) - if (::do_frame_shift) { - - // N.B. must weight by passive scalar of cloud, since the background has - // non-negligible momentum! - int const nc = 1; // number of components in temporary MF - int const ng = 0; // number of ghost cells in temporary MF - amrex::MultiFab temp_mf(boxArray(0), DistributionMap(0), nc, ng); - - // compute x-momentum - amrex::MultiFab::Copy(temp_mf, state_new_cc_[0], HydroSystem::x1Momentum_index, 0, nc, ng); - amrex::MultiFab::Multiply(temp_mf, state_new_cc_[0], HydroSystem::scalar0_index, 0, nc, ng); - const Real xmom = temp_mf.sum(0); - - // compute cloud mass within simulation box - amrex::MultiFab::Copy(temp_mf, state_new_cc_[0], HydroSystem::density_index, 0, nc, ng); - amrex::MultiFab::Multiply(temp_mf, state_new_cc_[0], HydroSystem::scalar0_index, 0, nc, ng); - const Real cloud_mass = temp_mf.sum(0); - - // compute center-of-mass velocity of the cloud - const Real vx_cm = xmom / cloud_mass; - - // save cumulative position, velocity offsets in simulationMetadata_ - const Real delta_x_prev = ::delta_x; // std::get(simulationMetadata_["delta_x"]); - const Real delta_vx_prev = ::delta_vx; // std::get(simulationMetadata_["delta_vx"]); - const Real delta_x = delta_x_prev + dt_coarse * delta_vx_prev; - const Real delta_vx = delta_vx_prev + vx_cm; - // simulationMetadata_["delta_x"] = delta_x; - // simulationMetadata_["delta_vx"] = delta_vx; - ::delta_vx = delta_vx; - - const Real v_wind = ::v_wind; - amrex::Print() << "[Cloud Tracking] Delta x = " << (delta_x / parsec_in_cm) << " pc," - << " Delta vx = " << (delta_vx / 1.0e5) << " km/s," - << " Inflow velocity = " << ((v_wind - delta_vx) / 1.0e5) << " km/s\n"; - - // If we are moving faster than the wind, we should abort the simulation. - // (otherwise, the boundary conditions become inconsistent.) - AMREX_ALWAYS_ASSERT(delta_vx < v_wind); - - // subtract center-of-mass y-velocity on each level - // N.B. must update both y-momentum *and* energy! - for (int lev = 0; lev <= finest_level; ++lev) { - auto const &mf = state_new_cc_[lev]; - auto const &state = state_new_cc_[lev].arrays(); - amrex::ParallelFor(mf, [=] AMREX_GPU_DEVICE(int box, int i, int j, int k) noexcept { - Real const rho = state[box](i, j, k, HydroSystem::density_index); - Real const xmom = state[box](i, j, k, HydroSystem::x1Momentum_index); - Real const ymom = state[box](i, j, k, HydroSystem::x2Momentum_index); - Real const zmom = state[box](i, j, k, HydroSystem::x3Momentum_index); - Real const E = state[box](i, j, k, HydroSystem::energy_index); - Real const KE = 0.5 * (xmom * xmom + ymom * ymom + zmom * zmom) / rho; - Real const Eint = E - KE; - Real const new_xmom = xmom - rho * vx_cm; - Real const new_KE = 0.5 * (new_xmom * new_xmom + ymom * ymom + zmom * zmom) / rho; - - state[box](i, j, k, HydroSystem::x1Momentum_index) = new_xmom; - state[box](i, j, k, HydroSystem::energy_index) = Eint + new_KE; + // compute derived variables and save in 'mf' + if (dname == "temperature") { + const int ncomp = ncomp_cc_in; + auto tables = cloudyTables_.const_tables(); + + for (amrex::MFIter iter(mf); iter.isValid(); ++iter) { + const amrex::Box &indexRange = iter.validbox(); + auto const &output = mf.array(iter); + auto const &state = state_new_cc_[lev].const_array(iter); + + amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const x1Mom = state(i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state(i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state(i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const Tgas = quokka::cooling::ComputeTgasFromEgas(rho, Eint, quokka::EOS_Traits::gamma, tables); + + output(i, j, k, ncomp) = Tgas; }); } - amrex::Gpu::streamSynchronizeAll(); } } -template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp_in) const +template <> void RadhydroSimulation::ErrorEst(int lev, amrex::TagBoxArray &tags, Real /*time*/, int /*ngrow*/) { - // compute derived variables and save in 'mf' - - if (dname == "temperature") { - const int ncomp = ncomp_in; - auto tables = cloudyTables_.const_tables(); - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); - output[bx](i, j, k, ncomp) = Tgas; - }); - - } else if (dname == "nH") { - const int ncomp = ncomp_in; - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const nH = (quokka::cooling::cloudy_H_mass_fraction * rho) / m_H; - output[bx](i, j, k, ncomp) = nH; - }); - - } else if (dname == "pressure") { - const int ncomp = ncomp_in; - auto tables = cloudyTables_.const_tables(); - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); - Real const mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); - Real const ndens = rho / (mu * m_H); - output[bx](i, j, k, ncomp) = ndens * Tgas; // [K cm^-3] - }); - - } else if (dname == "entropy") { - const int ncomp = ncomp_in; - auto tables = cloudyTables_.const_tables(); - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const Tgas = ComputeTgasFromEgas(rho, Eint, HydroSystem::gamma_, tables); - Real const mu = ComputeMMW(rho, Egas, HydroSystem::gamma_, tables); - Real const ndens = rho / (mu * m_H); - Real const K_cgs = C::k_B * Tgas * std::pow(ndens, -2. / 3.); // ergs cm^2 - Real const K_keV_cm2 = K_cgs / keV_in_ergs; // convert to units of keV cm^2 - output[bx](i, j, k, ncomp) = K_keV_cm2; - }); - - } else if (dname == "mass") { - const int ncomp = ncomp_in; - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - auto const dx = geom[lev].CellSizeArray(); - const Real dvol = dx[0] * dx[1] * dx[2]; - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - output[bx](i, j, k, ncomp) = rho * dvol; - }); + // tag cells for refinement + const Real eta_threshold = 0.1; // gradient refinement threshold + const Real q_min = std::sqrt(rho0 * rho1); // minimum density for refinement - } else if (dname == "cloud_fraction") { - const int ncomp = ncomp_in; - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); + for (amrex::MFIter mfi(state_new_cc_[lev]); mfi.isValid(); ++mfi) { + const amrex::Box &box = mfi.validbox(); + const auto state = state_new_cc_[lev].const_array(mfi); + const auto tag = tags.array(mfi); + const int nidx = HydroSystem::density_index; - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - // cloud partial density - Real const rho_cloud = state[bx](i, j, k, HydroSystem::scalar0_index + 1); - // non-cloud partial density - Real const rho_bg = state[bx](i, j, k, HydroSystem::scalar0_index + 2); + amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { + Real const q = state(i, j, k, nidx); - // NOTE: rho_cloud + rho_bg only equals hydro rho up to truncation error! - output[bx](i, j, k, ncomp) = rho_cloud / (rho_cloud + rho_bg); - }); + Real const q_xplus = state(i + 1, j, k, nidx); + Real const q_xminus = state(i - 1, j, k, nidx); + Real const q_yplus = state(i, j + 1, k, nidx); + Real const q_yminus = state(i, j - 1, k, nidx); + Real const q_zplus = state(i, j, k + 1, nidx); + Real const q_zminus = state(i, j, k - 1, nidx); - } else if (dname == "cooling_length") { - const int ncomp = ncomp_in; - auto tables = cloudyTables_.const_tables(); - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - // compute cooling length in parsec - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const l_cool = ComputeCoolingLength(rho, Eint, HydroSystem::gamma_, tables); - output[bx](i, j, k, ncomp) = l_cool / parsec_in_cm; - }); + Real const del_x = std::max(std::abs(q_xplus - q), std::abs(q - q_xminus)); + Real const del_y = std::max(std::abs(q_yplus - q), std::abs(q - q_yminus)); + Real const del_z = std::max(std::abs(q_zplus - q), std::abs(q - q_zminus)); - } else if (dname == "lab_velocity_x") { - const int ncomp = ncomp_in; - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - const Real delta_vx = ::delta_vx; - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - // compute observer velocity in km/s - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const vx = x1Mom / rho; - Real const vx_lab = vx + delta_vx; - output[bx](i, j, k, ncomp) = vx_lab / 1.0e5; // km/s - }); + Real const gradient_indicator = std::max({del_x, del_y, del_z}) / q; - } else if (dname == "velocity_mag") { - const int ncomp = ncomp_in; - auto const &output = mf.arrays(); - auto const &state = state_new_cc_[lev].const_arrays(); - - amrex::ParallelFor(mf, mf.nGrowVect(), [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - // compute simulation-frame |v| in km/s - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real const v1 = x1Mom / rho; - Real const v2 = x2Mom / rho; - Real const v3 = x3Mom / rho; - output[bx](i, j, k, ncomp) = std::sqrt(v1 * v1 + v2 * v2 + v3 * v3) / 1.0e5; // km/s + if ((gradient_indicator > eta_threshold) && (q > q_min)) { + tag(i, j, k) = amrex::TagBox::SET; + } }); } - amrex::Gpu::streamSynchronize(); } -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto ComputeCellTemp(int i, int j, int k, amrex::Array4 const &state, amrex::Real gamma, - quokka::cooling::cloudyGpuConstTables const &tables) +auto problem_main() -> int { - // return cell temperature - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const x1Mom = state(i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state(i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state(i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - return ComputeTgasFromEgas(rho, Eint, gamma, tables); -} + // Problem parameters + const double CFL_number = 0.25; + const double max_time = 2.0e6 * seconds_in_year; // 2 Myr + const int max_timesteps = 1e5; -#if 0 -template <> auto RadhydroSimulation::ComputeStatistics() -> std::map -{ - // compute scalar statistics - std::map stats; - - // save time - const Real t_cc = std::get(simulationMetadata_["t_cc"]); - const Real time = tNew_[0]; - stats["t_over_tcc"] = time / t_cc; - - // save cloud position, velocity - const Real dx_cgs = std::get(simulationMetadata_["delta_x"]); - const Real dvx_cgs = std::get(simulationMetadata_["delta_vx"]); - const Real v_wind = ::v_wind; - - stats["delta_x"] = dx_cgs / parsec_in_cm; // pc - stats["delta_vx"] = dvx_cgs / 1.0e5; // km/s - stats["inflow_vx"] = (v_wind - dvx_cgs) / 1.0e5; // km/s - - // save total simulation mass - const Real sim_mass = amrex::volumeWeightedSum(amrex::GetVecOfConstPtrs(state_new_cc_), - HydroSystem::density_index, geom, ref_ratio); - const Real sim_partialcloud_mass = amrex::volumeWeightedSum( - amrex::GetVecOfConstPtrs(state_new_cc_), HydroSystem::scalar0_index + 1, geom, ref_ratio); - const Real sim_partialwind_mass = amrex::volumeWeightedSum( - amrex::GetVecOfConstPtrs(state_new_cc_), HydroSystem::scalar0_index + 2, geom, ref_ratio); - - stats["sim_mass"] = sim_mass / solarmass_in_g; - stats["sim_partialcloud_mass"] = sim_partialcloud_mass / solarmass_in_g; - stats["sim_partialwind_mass"] = sim_partialwind_mass / solarmass_in_g; - - // compute cloud mass according to temperature threshold - auto tables = userData_.cloudyTables.const_tables(); - - const Real M_cl_1e4 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (T < 1.0e4) ? rho : 0.0; - return result; - }); - const Real M_cl_8000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (T < 8000.) ? rho : 0.0; - return result; - }); - const Real M_cl_9000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (T < 9000.) ? rho : 0.0; - return result; - }); - const Real M_cl_11000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (T < 1.1e4) ? rho : 0.0; - return result; - }); - const Real M_cl_12000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (T < 1.2e4) ? rho : 0.0; - return result; - }); - - stats["cloud_mass_1e4"] = M_cl_1e4 / solarmass_in_g; - stats["cloud_mass_8000"] = M_cl_8000 / solarmass_in_g; - stats["cloud_mass_9000"] = M_cl_9000 / solarmass_in_g; - stats["cloud_mass_11000"] = M_cl_11000 / solarmass_in_g; - stats["cloud_mass_12000"] = M_cl_12000 / solarmass_in_g; - - const Real origM_cl_1e4 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const result = (T < 1.0e4) ? rho_cloud : 0.0; - return result; - }); - const Real origM_cl_8000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const result = (T < 8000.) ? rho_cloud : 0.0; - return result; - }); - const Real origM_cl_9000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const result = (T < 9000.) ? rho_cloud : 0.0; - return result; - }); - const Real origM_cl_11000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const result = (T < 1.1e4) ? rho_cloud : 0.0; - return result; - }); - const Real origM_cl_12000 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const T = ComputeCellTemp(i, j, k, state, HydroSystem::gamma_, tables); - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const result = (T < 1.2e4) ? rho_cloud : 0.0; - return result; - }); - - stats["cloud_mass_1e4_original"] = origM_cl_1e4 / solarmass_in_g; - stats["cloud_mass_8000_original"] = origM_cl_8000 / solarmass_in_g; - stats["cloud_mass_9000_original"] = origM_cl_9000 / solarmass_in_g; - stats["cloud_mass_11000_original"] = origM_cl_11000 / solarmass_in_g; - stats["cloud_mass_12000_original"] = origM_cl_12000 / solarmass_in_g; - - // compute cloud mass according to passive scalar threshold - const Real M_cl_scalar_01 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const C = state(i, j, k, HydroSystem::scalar0_index); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (C > 0.1) ? rho : 0.0; - return result; - }); - const Real M_cl_scalar_01_09 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const C = state(i, j, k, HydroSystem::scalar0_index); - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = ((C > 0.1) && (C < 0.9)) ? rho : 0.0; - return result; - }); - - stats["cloud_mass_scalar_01"] = M_cl_scalar_01 / solarmass_in_g; - stats["cloud_mass_scalar_01_09"] = M_cl_scalar_01_09 / solarmass_in_g; - - // compute cloud mass according to cloud fraction threshold - const Real M_cl_fraction_01 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const rho_bg = state(i, j, k, HydroSystem::scalar0_index + 2); - Real const C_frac = rho_cloud / (rho_cloud + rho_bg); - - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = (C_frac > 0.1) ? rho : 0.0; - return result; - }); - const Real M_cl_fraction_01_09 = computeVolumeIntegral( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real const rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - Real const rho_bg = state(i, j, k, HydroSystem::scalar0_index + 2); - Real const C_frac = rho_cloud / (rho_cloud + rho_bg); - - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const result = ((C_frac > 0.1) && (C_frac < 0.9)) ? rho : 0.0; - return result; - }); - - stats["cloud_mass_fraction_01"] = M_cl_fraction_01 / solarmass_in_g; - stats["cloud_mass_fraction_01_09"] = M_cl_fraction_01_09 / solarmass_in_g; - - return stats; -} -#endif + // Problem initialization + constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; + amrex::Vector BCs_cc(ncomp_cc); + for (int n = 0; n < ncomp_cc; ++n) { + BCs_cc[n].setLo(0, amrex::BCType::int_dir); // periodic + BCs_cc[n].setHi(0, amrex::BCType::int_dir); -#if 0 -template <> -auto RadhydroSimulation::ComputeProjections(const int dir) const - -> std::unordered_map> -{ - std::unordered_map> proj; - - // compute (total) density projection - proj["nH"] = computePlaneProjection( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - Real rho = state(i, j, k, HydroSystem::density_index); - return (quokka::cooling::cloud_H_mass_fraction * rho) / m_H; - }, - dir); - - // compute cloud partial density projection - proj["nH_cloud"] = computePlaneProjection( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - // partial cloud density - Real rho_cloud = state(i, j, k, HydroSystem::scalar0_index + 1); - return (quokka::cooling::cloud_H_mass_fraction * rho_cloud) / m_H; - }, - dir); - - // compute non-cloud partial density projection - proj["nH_wind"] = computePlaneProjection( - [=] AMREX_GPU_DEVICE(int i, int j, int k, amrex::Array4 const &state) noexcept { - // partial wind density - Real rho_wind = state(i, j, k, HydroSystem::scalar0_index + 2); - return (quokka::cooling::cloud_H_mass_fraction * rho_wind) / m_H; - }, - dir); - - return proj; -} -#endif + BCs_cc[n].setLo(1, amrex::BCType::foextrap); // extrapolate + BCs_cc[n].setHi(1, amrex::BCType::ext_dir); // Dirichlet -template <> void RadhydroSimulation::ErrorEst(int lev, amrex::TagBoxArray &tags, Real /*time*/, int /*ngrow*/) -{ - // tag cells for refinement - const int Ncells_per_lcool = 10; - - amrex::GpuArray dx = geom[lev].CellSizeArray(); - const Real min_dx = std::min({AMREX_D_DECL(dx[0], dx[1], dx[2])}); - const Real resolved_length = static_cast(Ncells_per_lcool) * min_dx; - - auto tables = cloudyTables_.const_tables(); - const auto state = state_new_cc_[lev].const_arrays(); - const auto tag = tags.arrays(); - - amrex::ParallelFor(state_new_cc_[lev], [=] AMREX_GPU_DEVICE(int bx, int i, int j, int k) noexcept { - Real const rho = state[bx](i, j, k, HydroSystem::density_index); - Real const x1Mom = state[bx](i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state[bx](i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state[bx](i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state[bx](i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const l_cool = ComputeCoolingLength(rho, Eint, HydroSystem::gamma_, tables); - - if (l_cool < resolved_length) { - tag[bx](i, j, k) = amrex::TagBox::SET; - } - }); - amrex::Gpu::streamSynchronize(); -} + BCs_cc[n].setLo(2, amrex::BCType::int_dir); + BCs_cc[n].setHi(2, amrex::BCType::int_dir); + } -auto problem_main() -> int -{ - // Problem initialization - constexpr int nvars = RadhydroSimulation::nvarTotal_cc_; - amrex::Vector boundaryConditions(nvars); - for (int n = 0; n < nvars; ++n) { - boundaryConditions[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet - boundaryConditions[n].setHi(0, amrex::BCType::foextrap); // extrapolate + RadhydroSimulation sim(BCs_cc); - boundaryConditions[n].setLo(1, amrex::BCType::int_dir); // periodic - boundaryConditions[n].setHi(1, amrex::BCType::int_dir); + // Standard PPM gives unphysically enormous temperatures when used for + // this problem (e.g., ~1e14 K or higher), but can be fixed by + // reconstructing the temperature instead of the pressure + sim.reconstructionOrder_ = 3; // PLM + sim.densityFloor_ = 1.0e-2 * rho0; // density floor (to prevent vacuum) - boundaryConditions[n].setLo(2, amrex::BCType::int_dir); - boundaryConditions[n].setHi(2, amrex::BCType::int_dir); - } - RadhydroSimulation sim(boundaryConditions); - - // Read problem parameters - amrex::ParmParse const pp; - Real nH_bg = NAN; - Real nH_cloud = NAN; - Real P_over_k = NAN; - Real M0 = NAN; - - // use a sharp cloud edge? - int sharp_cloud_edge = 0; - pp.query("sharp_cloud_edge", sharp_cloud_edge); - ::sharp_cloud_edge = sharp_cloud_edge == 1; - - // do frame shifting to follow cloud center-of-mass? - int do_frame_shift = 1; - pp.query("do_frame_shift", do_frame_shift); - ::do_frame_shift = do_frame_shift == 1; - - // background gas H number density - pp.query("nH_bg", nH_bg); // cm^-3 - - // cloud H number density - pp.query("nH_cloud", nH_cloud); // cm^-3 - - // background gas pressure - pp.query("P_over_k", P_over_k); // K cm^-3 - - // cloud radius - pp.query("R_cloud_pc", ::R_cloud); // pc - ::R_cloud *= parsec_in_cm; // convert to cm - - // (pre-shock) Mach number - pp.query("Mach_shock", M0); // dimensionless - - // compute background pressure - // (pressure equilibrium should hold *before* the shock enters the box) - ::P0 = P_over_k * C::k_B; // erg cm^-3 - amrex::Print() << fmt::format("Pressure = {} K cm^-3\n", P_over_k); - - // compute mass density of background, cloud - ::rho0 = nH_bg * m_H / quokka::cooling::cloudy_H_mass_fraction; // g cm^-3 - ::rho1 = nH_cloud * m_H / quokka::cooling::cloudy_H_mass_fraction; // g cm^-3 - - AMREX_ALWAYS_ASSERT(!std::isnan(::rho0)); - AMREX_ALWAYS_ASSERT(!std::isnan(::rho1)); - AMREX_ALWAYS_ASSERT(!std::isnan(::P0)); - - // check temperature of cloud, background - constexpr Real gamma = HydroSystem::gamma_; - auto tables = sim.cloudyTables_.const_tables(); - const Real Eint_bg = ::P0 / (gamma - 1.); - const Real Eint_cl = ::P0 / (gamma - 1.); - const Real T_bg = ComputeTgasFromEgas(rho0, Eint_bg, gamma, tables); - const Real T_cl = ComputeTgasFromEgas(rho1, Eint_cl, gamma, tables); - amrex::Print() << fmt::format("T_bg = {} K\n", T_bg); - amrex::Print() << fmt::format("T_cl = {} K\n", T_cl); - - // compute shock jump conditions from rho0, P0, and M0 - const Real v_pre = M0 * std::sqrt(gamma * P0 / rho0); - const Real rho_post = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); - const Real v_post = v_pre * (rho0 / rho_post); - const Real v_wind = v_pre - v_post; - - const Real P_post = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); - const Real Eint_post = P_post / (gamma - 1.); - const Real T_post = ComputeTgasFromEgas(rho_post, Eint_post, gamma, tables); - amrex::Print() << fmt::format("T_wind = {} K\n", T_post); - - ::v_wind = v_wind; // set global variables - ::rho_wind = rho_post; - ::P_wind = P_post; - amrex::Print() << fmt::format("v_wind = {} km/s (v_pre = {}, v_post = {})\n", v_wind / 1.0e5, v_pre / 1.0e5, v_post / 1.0e5); - - // compute cloud-crushing time - const Real chi = rho1 / rho0; - const Real t_cc = std::sqrt(chi) * R_cloud / v_wind; - amrex::Print() << fmt::format("t_cc = {} kyr\n", t_cc / (1.0e3 * 3.15e7)); - amrex::Print() << std::endl; - - // compute maximum simulation time - const double max_time = 100.0 * t_cc; - - // set simulation parameters - sim.reconstructionOrder_ = 3; // PPM for hydro + sim.cflNumber_ = CFL_number; + sim.maxTimesteps_ = max_timesteps; sim.stopTime_ = max_time; - -#if 0 - // set metadata - sim.simulationMetadata_["delta_x"] = 0._rt; - sim.simulationMetadata_["delta_vx"] = 0._rt; - sim.simulationMetadata_["rho_wind"] = rho_wind; - sim.simulationMetadata_["v_wind"] = v_wind; - sim.simulationMetadata_["P_wind"] = P_wind; - sim.simulationMetadata_["M0"] = M0; - sim.simulationMetadata_["t_cc"] = t_cc; -#endif + sim.plotfileInterval_ = 100; + sim.checkpointInterval_ = 2000; // Set initial conditions sim.setInitialConditions(); From 1f68d095dfbf76188a333f07fb6d38c023fb9544 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 18 Aug 2023 18:28:18 +0000 Subject: [PATCH 17/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/RadhydroSimulation.hpp | 74 ++++++++++++++++++++------------------ src/simulation.hpp | 3 +- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index 6eff50af4..d3ef48b20 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -122,7 +122,7 @@ template class RadhydroSimulation : public AMRSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o if (lowLevelDebuggingOutput_ == 1) { // write Blueprint HDF5 files conduit::Node mesh; - amrex::SingleLevelToBlueprint(state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev]+1, mesh); - amrex::WriteBlueprintFiles(mesh, "debug_stage1_filled_state_old", istep[lev]+1, "hdf5"); + amrex::SingleLevelToBlueprint(state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev] + 1, mesh); + amrex::WriteBlueprintFiles(mesh, "debug_stage1_filled_state_old", istep[lev] + 1, "hdf5"); // write AMReX plotfile - //WriteSingleLevelPlotfile(CustomPlotFileName("debug_stage1_filled_state_old", istep[lev]+1), + // WriteSingleLevelPlotfile(CustomPlotFileName("debug_stage1_filled_state_old", istep[lev]+1), // state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev]+1); } @@ -947,15 +947,16 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o // LOW LEVEL DEBUGGING: output rhs if (lowLevelDebuggingOutput_ == 1) { // write rhs - std::string plotfile_name = CustomPlotFileName("debug_stage1_rhs_fluxes", istep[lev]+1); - WriteSingleLevelPlotfile(plotfile_name, rhs, componentNames_cc_, geom[lev], time, istep[lev]+1); + std::string plotfile_name = CustomPlotFileName("debug_stage1_rhs_fluxes", istep[lev] + 1); + WriteSingleLevelPlotfile(plotfile_name, rhs, componentNames_cc_, geom[lev], time, istep[lev] + 1); // write fluxes for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { if (amrex::ParallelDescriptor::IOProcessor()) { std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); } - std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("Flux_") + quokka::face_dir_str[idim]); + std::string fullprefix = + amrex::MultiFabFileFullPrefix(lev, plotfile_name, "raw_fields/Level_", std::string("Flux_") + quokka::face_dir_str[idim]); amrex::VisMF::Write(fluxArrays[idim], fullprefix); } // write face velocities @@ -963,7 +964,8 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o if (amrex::ParallelDescriptor::IOProcessor()) { std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); } - std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("FaceVel_") + quokka::face_dir_str[idim]); + std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name, "raw_fields/Level_", + std::string("FaceVel_") + quokka::face_dir_str[idim]); amrex::VisMF::Write(faceVel[idim], fullprefix); } } @@ -1216,35 +1218,37 @@ auto RadhydroSimulation::computeHydroFluxes(amrex::MultiFab const &co // LOW LEVEL DEBUGGING: output all of the temporary MultiFabs if (lowLevelDebuggingOutput_ == 1) { - // write primitive cell-centered state - std::string plotfile_name = CustomPlotFileName("debug_reconstruction", istep[lev]+1); - WriteSingleLevelPlotfile(plotfile_name, primVar, componentNames_cc_, geom[lev], 0.0, istep[lev]+1); - - // write flattening coefficients - std::string flatx_filename = CustomPlotFileName("debug_flattening_x", istep[lev]+1); - std::string flaty_filename = CustomPlotFileName("debug_flattening_y", istep[lev]+1); - std::string flatz_filename = CustomPlotFileName("debug_flattening_z", istep[lev]+1); - amrex::Vector flatCompNames{"chi"}; - WriteSingleLevelPlotfile(flatx_filename, flatCoefs[0], flatCompNames, geom[lev], 0.0, istep[lev]+1); - WriteSingleLevelPlotfile(flaty_filename, flatCoefs[1], flatCompNames, geom[lev], 0.0, istep[lev]+1); - WriteSingleLevelPlotfile(flatz_filename, flatCoefs[2], flatCompNames, geom[lev], 0.0, istep[lev]+1); - - // write L interface states - for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { - if (amrex::ParallelDescriptor::IOProcessor()) { - std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); - } - std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("StateL_") + quokka::face_dir_str[idim]); - amrex::VisMF::Write(leftState[idim], fullprefix); + // write primitive cell-centered state + std::string plotfile_name = CustomPlotFileName("debug_reconstruction", istep[lev] + 1); + WriteSingleLevelPlotfile(plotfile_name, primVar, componentNames_cc_, geom[lev], 0.0, istep[lev] + 1); + + // write flattening coefficients + std::string flatx_filename = CustomPlotFileName("debug_flattening_x", istep[lev] + 1); + std::string flaty_filename = CustomPlotFileName("debug_flattening_y", istep[lev] + 1); + std::string flatz_filename = CustomPlotFileName("debug_flattening_z", istep[lev] + 1); + amrex::Vector flatCompNames{"chi"}; + WriteSingleLevelPlotfile(flatx_filename, flatCoefs[0], flatCompNames, geom[lev], 0.0, istep[lev] + 1); + WriteSingleLevelPlotfile(flaty_filename, flatCoefs[1], flatCompNames, geom[lev], 0.0, istep[lev] + 1); + WriteSingleLevelPlotfile(flatz_filename, flatCoefs[2], flatCompNames, geom[lev], 0.0, istep[lev] + 1); + + // write L interface states + for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { + if (amrex::ParallelDescriptor::IOProcessor()) { + std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); } - // write R interface states - for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { - if (amrex::ParallelDescriptor::IOProcessor()) { - std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); - } - std::string fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name,"raw_fields/Level_", std::string("StateR_") + quokka::face_dir_str[idim]); - amrex::VisMF::Write(rightState[idim], fullprefix); + std::string fullprefix = + amrex::MultiFabFileFullPrefix(lev, plotfile_name, "raw_fields/Level_", std::string("StateL_") + quokka::face_dir_str[idim]); + amrex::VisMF::Write(leftState[idim], fullprefix); + } + // write R interface states + for (int idim = 0; idim < AMREX_SPACEDIM; ++idim) { + if (amrex::ParallelDescriptor::IOProcessor()) { + std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); } + std::string fullprefix = + amrex::MultiFabFileFullPrefix(lev, plotfile_name, "raw_fields/Level_", std::string("StateR_") + quokka::face_dir_str[idim]); + amrex::VisMF::Write(rightState[idim], fullprefix); + } } // return flux and face-centered velocities diff --git a/src/simulation.hpp b/src/simulation.hpp index 5dfe43ef2..9b7f3eaef 100644 --- a/src/simulation.hpp +++ b/src/simulation.hpp @@ -1543,7 +1543,8 @@ template void AMRSimulation::AverageDownTo(int c template auto AMRSimulation::PlotFileName(int lev) const -> std::string { return amrex::Concatenate(plot_file, lev, 5); } // get plotfile name -template auto AMRSimulation::CustomPlotFileName(const char *base, int lev) const -> std::string { +template auto AMRSimulation::CustomPlotFileName(const char *base, int lev) const -> std::string +{ std::string base_str(base); return amrex::Concatenate(base_str, lev, 5); } From c6ebcdae1f685b01f6237ef3da87790511c442cf Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 18 Aug 2023 14:29:31 -0400 Subject: [PATCH 18/64] revert CloudyCooling.hpp --- src/CloudyCooling.hpp | 48 ------------------------------------------- 1 file changed, 48 deletions(-) diff --git a/src/CloudyCooling.hpp b/src/CloudyCooling.hpp index 37b97c814..ae5aca447 100644 --- a/src/CloudyCooling.hpp +++ b/src/CloudyCooling.hpp @@ -20,7 +20,6 @@ #include "GrackleDataReader.hpp" #include "Interpolate2D.hpp" #include "ODEIntegrate.hpp" -#include "fundamental_constants.H" #include "hydro_system.hpp" #include "radiation_system.hpp" #include "root_finding.hpp" @@ -304,53 +303,6 @@ template void computeCooling(amrex::MultiFab &mf, const Rea } } -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto ComputeCoolingLength(double rho, double Egas, double gamma, cloudyGpuConstTables const &tables) -> Real -{ - // convert (rho, Egas) to cooling length - - // 1. convert Egas (internal gas energy) to temperature - const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); - - // 2. compute cooling time - // interpolate cooling rates from Cloudy tables - const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species - const Real nH = rhoH / (C::m_p + C::m_e); - const Real log_nH = std::log10(nH); - const Real log_T = std::log10(Tgas); - - const double logPrimCool = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.primCool); - const double logMetalCool = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.metalCool); - const double LambdaCool = FastMath::pow10(logPrimCool) + FastMath::pow10(logMetalCool); - - const double Edot = (rhoH * rhoH) * LambdaCool; - // compute cooling time - const Real t_cool = Egas / Edot; - - // 3. compute cooling length c_s t_cool - // compute mu from mu(T) table - const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.meanMolWeight); - const Real c_s = std::sqrt(gamma * C::k_B * Tgas / (mu * (C::m_p + C::m_e))); - - // cooling length - return c_s * t_cool; -} - -AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE auto ComputeMMW(double rho, double Egas, double gamma, cloudyGpuConstTables const &tables) -> Real -{ - // convert (rho, Egas) to dimensionless mean molecular weight - - // 1. convert Egas (internal gas energy) to temperature - const Real Tgas = ComputeTgasFromEgas(rho, Egas, gamma, tables); - - // 2. compute mu from mu(T) table - const Real rhoH = rho * cloudy_H_mass_fraction; // mass density of H species - const Real nH = rhoH / (C::m_p + C::m_e); - const Real log_nH = std::log10(nH); - const Real log_T = std::log10(Tgas); - const Real mu = interpolate2d(log_nH, log_T, tables.log_nH, tables.log_Tgas, tables.meanMolWeight); - return mu; -} - void readCloudyData(std::string &grackle_hdf5_file, cloudy_tables &cloudyTables); } // namespace quokka::cooling From 992b4f121308d1e1800377839730693eea36d052 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 18 Aug 2023 14:45:11 -0400 Subject: [PATCH 19/64] add NSCBC test problem --- src/CMakeLists.txt | 1 + src/NSCBC/CMakeLists.txt | 8 + src/NSCBC/channel.cpp | 312 +++++++++++++++++++++++++++++++++++++++ src/NSCBC/channel.hpp | 19 +++ 4 files changed, 340 insertions(+) create mode 100644 src/NSCBC/CMakeLists.txt create mode 100644 src/NSCBC/channel.cpp create mode 100644 src/NSCBC/channel.hpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ee2a28177..46988ab38 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,3 +153,4 @@ add_subdirectory(ShockCloud) add_subdirectory(PassiveScalar) add_subdirectory(FCQuantities) add_subdirectory(SphericalCollapse) +add_subdirectory(NSCBC) diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt new file mode 100644 index 000000000..96a9d47b8 --- /dev/null +++ b/src/NSCBC/CMakeLists.txt @@ -0,0 +1,8 @@ +if (AMReX_SPACEDIM GREATER_EQUAL 2) + add_executable(test_channel_flow channel.cpp ${QuokkaObjSources}) + + if(AMReX_GPU_BACKEND MATCHES "CUDA") + setup_target_for_cuda_compilation(test_channel_flow) + endif(AMReX_GPU_BACKEND MATCHES "CUDA") + +endif(AMReX_SPACEDIM GREATER_EQUAL 2) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp new file mode 100644 index 000000000..40be0c164 --- /dev/null +++ b/src/NSCBC/channel.cpp @@ -0,0 +1,312 @@ +//============================================================================== +// TwoMomentRad - a radiation transport library for patch-based AMR codes +// Copyright 2020 Benjamin Wibking. +// Released under the MIT license. See LICENSE file included in the GitHub repo. +//============================================================================== +/// \file cloud.cpp +/// \brief Implements a shock-cloud problem with radiative cooling. +/// +#include +#include + +#include "AMReX.H" +#include "AMReX_BC_TYPES.H" +#include "AMReX_BLProfiler.H" +#include "AMReX_BLassert.H" +#include "AMReX_FabArray.H" +#include "AMReX_Geometry.H" +#include "AMReX_GpuDevice.H" +#include "AMReX_IntVect.H" +#include "AMReX_MultiFab.H" +#include "AMReX_ParallelContext.H" +#include "AMReX_ParallelDescriptor.H" +#include "AMReX_REAL.H" +#include "AMReX_SPACE.H" +#include "AMReX_TableData.H" +#include "AMReX_iMultiFab.H" + +#include "RadhydroSimulation.hpp" +#include "channel.hpp" +#include "hydro_system.hpp" +#include "radiation_system.hpp" + +using amrex::Real; + +struct ShockCloud { +}; // dummy type to allow compile-type polymorphism via template specialization + +constexpr double seconds_in_year = 3.154e7; + +template <> struct quokka::EOS_Traits { + static constexpr double gamma = 5. / 3.; // default value + static constexpr double mean_molecular_weight = 1.0; + static constexpr double boltzmann_constant = C::k_B; +}; + +template <> struct Physics_Traits { + // cell-centred + static constexpr bool is_hydro_enabled = true; + static constexpr bool is_chemistry_enabled = false; + static constexpr int numMassScalars = 0; // number of mass scalars + static constexpr int numPassiveScalars = numMassScalars + 0; // number of passive scalars + static constexpr bool is_radiation_enabled = false; + // face-centred + static constexpr bool is_mhd_enabled = false; +}; + +template <> struct SimulationData { + std::unique_ptr> table_data; +}; + +constexpr Real Tgas0 = 1.0e7; // K +constexpr Real nH0 = 1.0e-4; // cm^-3 +constexpr Real nH1 = 1.0e-1; // cm^-3 +constexpr Real R_cloud = 5.0 * 3.086e18; // cm [5 pc] +constexpr Real M0 = 2.0; // Mach number of shock + +constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 +constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 +constexpr Real rho1 = nH1 * (C::m_p + C::m_e); + +// perturbation parameters +const int kmin = 0; +const int kmax = 16; +Real const A = 0.05 / kmax; + +// cloud-tracking variables needed for Dirichlet boundary condition +AMREX_GPU_MANAGED static Real rho_wind = 0; +AMREX_GPU_MANAGED static Real v_wind = 0; +AMREX_GPU_MANAGED static Real P_wind = 0; +AMREX_GPU_MANAGED static Real delta_vx = 0; + +template <> void RadhydroSimulation::preCalculateInitialConditions() +{ + // generate random phases + amrex::Array tlo{kmin, kmin, kmin}; + amrex::Array thi{kmax, kmax, kmax}; + userData_.table_data = std::make_unique>(tlo, thi); + + amrex::TableData h_table_data(tlo, thi, amrex::The_Pinned_Arena()); + auto const &h_table = h_table_data.table(); + + // Initialize data on the hostcd + // 64-bit Mersenne Twister (do not use 32-bit version for sampling doubles!) + std::mt19937_64 rng(1); // NOLINT + std::uniform_real_distribution sample_phase(0., 2.0 * M_PI); + for (int j = tlo[0]; j <= thi[0]; ++j) { + for (int i = tlo[1]; i <= thi[1]; ++i) { + for (int k = tlo[2]; k <= thi[2]; ++k) { + h_table(i, j, k) = sample_phase(rng); + } + } + } + + // Copy data to GPU memory + userData_.table_data->copy(h_table_data); + amrex::Gpu::streamSynchronize(); +} + +template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) +{ + // set initial conditions + amrex::GpuArray const dx = grid_elem.dx_; + amrex::GpuArray prob_lo = grid_elem.prob_lo_; + amrex::GpuArray prob_hi = grid_elem.prob_hi_; + const amrex::Box &indexRange = grid_elem.indexRange_; + const amrex::Array4 &state_cc = grid_elem.array_; + auto const &phase_table = userData_.table_data->const_table(); + + Real const Lx = (prob_hi[0] - prob_lo[0]); + Real const Ly = (prob_hi[1] - prob_lo[1]); + Real const Lz = (prob_hi[2] - prob_lo[2]); + + Real const x0 = prob_lo[0] + 0.5 * (prob_hi[0] - prob_lo[0]); + Real const y0 = prob_lo[1] + 0.8 * (prob_hi[1] - prob_lo[1]); + Real const z0 = prob_lo[2] + 0.5 * (prob_hi[2] - prob_lo[2]); + + amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { + Real const x = prob_lo[0] + (i + static_cast(0.5)) * dx[0]; + Real const y = prob_lo[1] + (j + static_cast(0.5)) * dx[1]; + Real const z = prob_lo[2] + (k + static_cast(0.5)) * dx[2]; + Real const R = std::sqrt(std::pow(x - x0, 2) + std::pow(y - y0, 2) + std::pow(z - z0, 2)); + + // compute perturbations + Real delta_rho = 0; + for (int ki = kmin; ki < kmax; ++ki) { + for (int kj = kmin; kj < kmax; ++kj) { + for (int kk = kmin; kk < kmax; ++kk) { + if ((ki == 0) && (kj == 0) && (kk == 0)) { + continue; + } + Real const kx = 2.0 * M_PI * static_cast(ki) / Lx; + Real const ky = 2.0 * M_PI * static_cast(kj) / Lx; + Real const kz = 2.0 * M_PI * static_cast(kk) / Lx; + delta_rho += A * std::sin(x * kx + y * ky + z * kz + phase_table(ki, kj, kk)); + } + } + } + AMREX_ALWAYS_ASSERT(delta_rho > -1.0); + + Real rho = rho0 * (1.0 + delta_rho); // background density + if (R < R_cloud) { + rho = rho1 * (1.0 + delta_rho); // cloud density + } + Real const xmom = 0; + Real const ymom = 0; + Real const zmom = 0; + Real const Eint = (quokka::EOS_Traits::gamma - 1.) * P0; + Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + + state_cc(i, j, k, HydroSystem::density_index) = rho; + state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; + state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; + state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; + state_cc(i, j, k, HydroSystem::energy_index) = Egas; + state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; + }); +} + +template <> +AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundaryConditions(const amrex::IntVect &iv, amrex::Array4 const &consVar, + int /*dcomp*/, int /*numcomp*/, amrex::GeometryData const &geom, + const Real /*time*/, const amrex::BCRec * /*bcr*/, + int /*bcomp*/, int /*orig_comp*/) +{ + auto [i, j, k] = iv.dim3(); + + amrex::Box const &box = geom.Domain(); + const auto &domain_lo = box.loVect3d(); + const auto &domain_hi = box.hiVect3d(); + const int jhi = domain_hi[1]; + + if (j >= jhi) { + // x2 upper boundary -- constant + // compute downstream shock conditions from rho0, P0, and M0 + constexpr Real gamma = quokka::EOS_Traits::gamma; + constexpr Real rho2 = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); + constexpr Real P2 = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); + Real const v2 = -M0 * std::sqrt(gamma * P2 / rho2); + + Real const rho = rho2; + Real const xmom = 0; + Real const ymom = rho2 * v2; + Real const zmom = 0; + Real const Eint = (gamma - 1.) * P2; + Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + + consVar(i, j, k, HydroSystem::density_index) = rho; + consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; + consVar(i, j, k, HydroSystem::x2Momentum_index) = ymom; + consVar(i, j, k, HydroSystem::x3Momentum_index) = zmom; + consVar(i, j, k, HydroSystem::energy_index) = Egas; + consVar(i, j, k, HydroSystem::internalEnergy_index) = Eint; + } +} + +template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp_cc_in) const +{ + // compute derived variables and save in 'mf' + if (dname == "temperature") { + const int ncomp = ncomp_cc_in; + auto tables = cloudyTables_.const_tables(); + + for (amrex::MFIter iter(mf); iter.isValid(); ++iter) { + const amrex::Box &indexRange = iter.validbox(); + auto const &output = mf.array(iter); + auto const &state = state_new_cc_[lev].const_array(iter); + + amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { + Real const rho = state(i, j, k, HydroSystem::density_index); + Real const x1Mom = state(i, j, k, HydroSystem::x1Momentum_index); + Real const x2Mom = state(i, j, k, HydroSystem::x2Momentum_index); + Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); + Real const Egas = state(i, j, k, HydroSystem::energy_index); + Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); + Real const Tgas = quokka::cooling::ComputeTgasFromEgas(rho, Eint, quokka::EOS_Traits::gamma, tables); + + output(i, j, k, ncomp) = Tgas; + }); + } + } +} + +template <> void RadhydroSimulation::ErrorEst(int lev, amrex::TagBoxArray &tags, Real /*time*/, int /*ngrow*/) +{ + // tag cells for refinement + const Real eta_threshold = 0.1; // gradient refinement threshold + const Real q_min = std::sqrt(rho0 * rho1); // minimum density for refinement + + for (amrex::MFIter mfi(state_new_cc_[lev]); mfi.isValid(); ++mfi) { + const amrex::Box &box = mfi.validbox(); + const auto state = state_new_cc_[lev].const_array(mfi); + const auto tag = tags.array(mfi); + const int nidx = HydroSystem::density_index; + + amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { + Real const q = state(i, j, k, nidx); + + Real const q_xplus = state(i + 1, j, k, nidx); + Real const q_xminus = state(i - 1, j, k, nidx); + Real const q_yplus = state(i, j + 1, k, nidx); + Real const q_yminus = state(i, j - 1, k, nidx); + Real const q_zplus = state(i, j, k + 1, nidx); + Real const q_zminus = state(i, j, k - 1, nidx); + + Real const del_x = std::max(std::abs(q_xplus - q), std::abs(q - q_xminus)); + Real const del_y = std::max(std::abs(q_yplus - q), std::abs(q - q_yminus)); + Real const del_z = std::max(std::abs(q_zplus - q), std::abs(q - q_zminus)); + + Real const gradient_indicator = std::max({del_x, del_y, del_z}) / q; + + if ((gradient_indicator > eta_threshold) && (q > q_min)) { + tag(i, j, k) = amrex::TagBox::SET; + } + }); + } +} + +auto problem_main() -> int +{ + // Problem parameters + const double CFL_number = 0.25; + const double max_time = 2.0e6 * seconds_in_year; // 2 Myr + const int max_timesteps = 1e5; + + // Problem initialization + constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; + amrex::Vector BCs_cc(ncomp_cc); + for (int n = 0; n < ncomp_cc; ++n) { + BCs_cc[n].setLo(0, amrex::BCType::int_dir); // periodic + BCs_cc[n].setHi(0, amrex::BCType::int_dir); + + BCs_cc[n].setLo(1, amrex::BCType::foextrap); // extrapolate + BCs_cc[n].setHi(1, amrex::BCType::ext_dir); // Dirichlet + + BCs_cc[n].setLo(2, amrex::BCType::int_dir); + BCs_cc[n].setHi(2, amrex::BCType::int_dir); + } + + RadhydroSimulation sim(BCs_cc); + + // Standard PPM gives unphysically enormous temperatures when used for + // this problem (e.g., ~1e14 K or higher), but can be fixed by + // reconstructing the temperature instead of the pressure + sim.reconstructionOrder_ = 3; // PLM + sim.densityFloor_ = 1.0e-2 * rho0; // density floor (to prevent vacuum) + + sim.cflNumber_ = CFL_number; + sim.maxTimesteps_ = max_timesteps; + sim.stopTime_ = max_time; + sim.plotfileInterval_ = 100; + sim.checkpointInterval_ = 2000; + + // Set initial conditions + sim.setInitialConditions(); + + // run simulation + sim.evolve(); + + // Cleanup and exit + int const status = 0; + return status; +} diff --git a/src/NSCBC/channel.hpp b/src/NSCBC/channel.hpp new file mode 100644 index 000000000..2c4bdb8fc --- /dev/null +++ b/src/NSCBC/channel.hpp @@ -0,0 +1,19 @@ +#ifndef CLOUD_HPP_ // NOLINT +#define CLOUD_HPP_ +//============================================================================== +// TwoMomentRad - a radiation transport library for patch-based AMR codes +// Copyright 2020 Benjamin Wibking. +// Released under the MIT license. See LICENSE file included in the GitHub repo. +//============================================================================== +/// \file cloud.hpp +/// \brief Implements a shock-cloud problem with radiative cooling. +/// + +// external headers +#include + +// internal headers + +// function definitions + +#endif // CLOUD_HPP_ From 9866862df2aada791b8d82ddd6fccbc2ea21141c Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:33:19 -0400 Subject: [PATCH 20/64] fix ascent includes --- src/RadhydroSimulation.hpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index d3ef48b20..a9ab00597 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -10,9 +10,7 @@ /// timestepping, solving, and I/O of a simulation for radiation moments. #include -#include #include -#include #include #include #include @@ -27,7 +25,6 @@ #include "AMReX_BCRec.H" #include "AMReX_BLassert.H" #include "AMReX_Box.H" -#include "AMReX_Conduit_Blueprint.H" #include "AMReX_FArrayBox.H" #include "AMReX_FabArray.H" #include "AMReX_FabArrayUtility.H" @@ -49,6 +46,12 @@ #include "AMReX_Utility.H" #include "AMReX_YAFluxRegister.H" +#ifdef AMREX_ASCENT +#include +#include +#include "AMReX_Conduit_Blueprint.H" +#endif + #include "Chemistry.hpp" #include "CloudyCooling.hpp" #include "SimulationData.hpp" @@ -917,14 +920,16 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o // LOW LEVEL DEBUGGING: output state_old_cc_tmp (with ghost cells) if (lowLevelDebuggingOutput_ == 1) { +#ifdef AMREX_ASCENT // write Blueprint HDF5 files conduit::Node mesh; amrex::SingleLevelToBlueprint(state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev] + 1, mesh); amrex::WriteBlueprintFiles(mesh, "debug_stage1_filled_state_old", istep[lev] + 1, "hdf5"); - +#else // write AMReX plotfile // WriteSingleLevelPlotfile(CustomPlotFileName("debug_stage1_filled_state_old", istep[lev]+1), // state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev]+1); +#endif } // check state validity From 7d257ea9df05106b50047fd5381e37879b6868f0 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:34:12 -0400 Subject: [PATCH 21/64] fix typo --- src/RadhydroSimulation.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index a9ab00597..8fb40f3a7 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -46,7 +46,7 @@ #include "AMReX_Utility.H" #include "AMReX_YAFluxRegister.H" -#ifdef AMREX_ASCENT +#ifdef AMREX_USE_ASCENT #include #include #include "AMReX_Conduit_Blueprint.H" @@ -920,7 +920,7 @@ auto RadhydroSimulation::advanceHydroAtLevel(amrex::MultiFab &state_o // LOW LEVEL DEBUGGING: output state_old_cc_tmp (with ghost cells) if (lowLevelDebuggingOutput_ == 1) { -#ifdef AMREX_ASCENT +#ifdef AMREX_USE_ASCENT // write Blueprint HDF5 files conduit::Node mesh; amrex::SingleLevelToBlueprint(state_old_cc_tmp, componentNames_cc_, geom[lev], time, istep[lev] + 1, mesh); From 8d551a55ca096feb0ed3d8811cecac60778e21c8 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:34:27 -0400 Subject: [PATCH 22/64] fix channel problem --- src/NSCBC/channel.cpp | 235 +++++++++--------------------------------- 1 file changed, 47 insertions(+), 188 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 40be0c164..24c4e9bdd 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -3,8 +3,9 @@ // Copyright 2020 Benjamin Wibking. // Released under the MIT license. See LICENSE file included in the GitHub repo. //============================================================================== -/// \file cloud.cpp -/// \brief Implements a shock-cloud problem with radiative cooling. +/// \file channel.cpp +/// \brief Implements a subsonic channel flow problem with Navier-Stokes +/// Characteristic Boundary Conditions (NSCBC). /// #include #include @@ -32,46 +33,30 @@ using amrex::Real; -struct ShockCloud { +struct Channel { }; // dummy type to allow compile-type polymorphism via template specialization -constexpr double seconds_in_year = 3.154e7; - -template <> struct quokka::EOS_Traits { +template <> struct quokka::EOS_Traits { static constexpr double gamma = 5. / 3.; // default value static constexpr double mean_molecular_weight = 1.0; static constexpr double boltzmann_constant = C::k_B; }; -template <> struct Physics_Traits { - // cell-centred +template <> struct Physics_Traits { static constexpr bool is_hydro_enabled = true; static constexpr bool is_chemistry_enabled = false; + static constexpr bool is_mhd_enabled = false; static constexpr int numMassScalars = 0; // number of mass scalars static constexpr int numPassiveScalars = numMassScalars + 0; // number of passive scalars static constexpr bool is_radiation_enabled = false; - // face-centred - static constexpr bool is_mhd_enabled = false; -}; - -template <> struct SimulationData { - std::unique_ptr> table_data; }; -constexpr Real Tgas0 = 1.0e7; // K -constexpr Real nH0 = 1.0e-4; // cm^-3 -constexpr Real nH1 = 1.0e-1; // cm^-3 -constexpr Real R_cloud = 5.0 * 3.086e18; // cm [5 pc] -constexpr Real M0 = 2.0; // Mach number of shock +constexpr Real Tgas0 = 1.0e7; // K +constexpr Real nH0 = 1.0e-4; // cm^-3 +constexpr Real M0 = 2.0; // Mach number of shock constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 -constexpr Real rho1 = nH1 * (C::m_p + C::m_e); - -// perturbation parameters -const int kmin = 0; -const int kmax = 16; -Real const A = 0.05 / kmax; // cloud-tracking variables needed for Dirichlet boundary condition AMREX_GPU_MANAGED static Real rho_wind = 0; @@ -79,34 +64,7 @@ AMREX_GPU_MANAGED static Real v_wind = 0; AMREX_GPU_MANAGED static Real P_wind = 0; AMREX_GPU_MANAGED static Real delta_vx = 0; -template <> void RadhydroSimulation::preCalculateInitialConditions() -{ - // generate random phases - amrex::Array tlo{kmin, kmin, kmin}; - amrex::Array thi{kmax, kmax, kmax}; - userData_.table_data = std::make_unique>(tlo, thi); - - amrex::TableData h_table_data(tlo, thi, amrex::The_Pinned_Arena()); - auto const &h_table = h_table_data.table(); - - // Initialize data on the hostcd - // 64-bit Mersenne Twister (do not use 32-bit version for sampling doubles!) - std::mt19937_64 rng(1); // NOLINT - std::uniform_real_distribution sample_phase(0., 2.0 * M_PI); - for (int j = tlo[0]; j <= thi[0]; ++j) { - for (int i = tlo[1]; i <= thi[1]; ++i) { - for (int k = tlo[2]; k <= thi[2]; ++k) { - h_table(i, j, k) = sample_phase(rng); - } - } - } - - // Copy data to GPU memory - userData_.table_data->copy(h_table_data); - amrex::Gpu::streamSynchronize(); -} - -template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) +template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { // set initial conditions amrex::GpuArray const dx = grid_elem.dx_; @@ -125,180 +83,81 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quok Real const z0 = prob_lo[2] + 0.5 * (prob_hi[2] - prob_lo[2]); amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { - Real const x = prob_lo[0] + (i + static_cast(0.5)) * dx[0]; - Real const y = prob_lo[1] + (j + static_cast(0.5)) * dx[1]; - Real const z = prob_lo[2] + (k + static_cast(0.5)) * dx[2]; - Real const R = std::sqrt(std::pow(x - x0, 2) + std::pow(y - y0, 2) + std::pow(z - z0, 2)); - - // compute perturbations - Real delta_rho = 0; - for (int ki = kmin; ki < kmax; ++ki) { - for (int kj = kmin; kj < kmax; ++kj) { - for (int kk = kmin; kk < kmax; ++kk) { - if ((ki == 0) && (kj == 0) && (kk == 0)) { - continue; - } - Real const kx = 2.0 * M_PI * static_cast(ki) / Lx; - Real const ky = 2.0 * M_PI * static_cast(kj) / Lx; - Real const kz = 2.0 * M_PI * static_cast(kk) / Lx; - delta_rho += A * std::sin(x * kx + y * ky + z * kz + phase_table(ki, kj, kk)); - } - } - } - AMREX_ALWAYS_ASSERT(delta_rho > -1.0); - - Real rho = rho0 * (1.0 + delta_rho); // background density - if (R < R_cloud) { - rho = rho1 * (1.0 + delta_rho); // cloud density - } + Real const rho = rho0; Real const xmom = 0; Real const ymom = 0; Real const zmom = 0; - Real const Eint = (quokka::EOS_Traits::gamma - 1.) * P0; - Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - - state_cc(i, j, k, HydroSystem::density_index) = rho; - state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; - state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; - state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; - state_cc(i, j, k, HydroSystem::energy_index) = Egas; - state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; + Real const Eint = (quokka::EOS_Traits::gamma - 1.) * P0; + Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + + state_cc(i, j, k, HydroSystem::density_index) = rho; + state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; + state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; + state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; + state_cc(i, j, k, HydroSystem::energy_index) = Egas; + state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; }); } template <> -AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundaryConditions(const amrex::IntVect &iv, amrex::Array4 const &consVar, - int /*dcomp*/, int /*numcomp*/, amrex::GeometryData const &geom, - const Real /*time*/, const amrex::BCRec * /*bcr*/, - int /*bcomp*/, int /*orig_comp*/) +AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundaryConditions(const amrex::IntVect &iv, amrex::Array4 const &consVar, + int /*dcomp*/, int /*numcomp*/, amrex::GeometryData const &geom, + const Real /*time*/, const amrex::BCRec * /*bcr*/, int /*bcomp*/, + int /*orig_comp*/) { auto [i, j, k] = iv.dim3(); amrex::Box const &box = geom.Domain(); const auto &domain_lo = box.loVect3d(); const auto &domain_hi = box.hiVect3d(); - const int jhi = domain_hi[1]; + const int ilo = domain_lo[0]; - if (j >= jhi) { - // x2 upper boundary -- constant + if (i < ilo) { + // x1 lower boundary -- constant // compute downstream shock conditions from rho0, P0, and M0 - constexpr Real gamma = quokka::EOS_Traits::gamma; + constexpr Real gamma = quokka::EOS_Traits::gamma; constexpr Real rho2 = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); constexpr Real P2 = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); - Real const v2 = -M0 * std::sqrt(gamma * P2 / rho2); + Real const v2 = M0 * std::sqrt(gamma * P2 / rho2); Real const rho = rho2; - Real const xmom = 0; - Real const ymom = rho2 * v2; + Real const xmom = rho2 * v2; + Real const ymom = 0; Real const zmom = 0; Real const Eint = (gamma - 1.) * P2; - Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - - consVar(i, j, k, HydroSystem::density_index) = rho; - consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; - consVar(i, j, k, HydroSystem::x2Momentum_index) = ymom; - consVar(i, j, k, HydroSystem::x3Momentum_index) = zmom; - consVar(i, j, k, HydroSystem::energy_index) = Egas; - consVar(i, j, k, HydroSystem::internalEnergy_index) = Eint; - } -} - -template <> void RadhydroSimulation::ComputeDerivedVar(int lev, std::string const &dname, amrex::MultiFab &mf, const int ncomp_cc_in) const -{ - // compute derived variables and save in 'mf' - if (dname == "temperature") { - const int ncomp = ncomp_cc_in; - auto tables = cloudyTables_.const_tables(); - - for (amrex::MFIter iter(mf); iter.isValid(); ++iter) { - const amrex::Box &indexRange = iter.validbox(); - auto const &output = mf.array(iter); - auto const &state = state_new_cc_[lev].const_array(iter); - - amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { - Real const rho = state(i, j, k, HydroSystem::density_index); - Real const x1Mom = state(i, j, k, HydroSystem::x1Momentum_index); - Real const x2Mom = state(i, j, k, HydroSystem::x2Momentum_index); - Real const x3Mom = state(i, j, k, HydroSystem::x3Momentum_index); - Real const Egas = state(i, j, k, HydroSystem::energy_index); - Real const Eint = RadSystem::ComputeEintFromEgas(rho, x1Mom, x2Mom, x3Mom, Egas); - Real const Tgas = quokka::cooling::ComputeTgasFromEgas(rho, Eint, quokka::EOS_Traits::gamma, tables); - - output(i, j, k, ncomp) = Tgas; - }); - } - } -} - -template <> void RadhydroSimulation::ErrorEst(int lev, amrex::TagBoxArray &tags, Real /*time*/, int /*ngrow*/) -{ - // tag cells for refinement - const Real eta_threshold = 0.1; // gradient refinement threshold - const Real q_min = std::sqrt(rho0 * rho1); // minimum density for refinement - - for (amrex::MFIter mfi(state_new_cc_[lev]); mfi.isValid(); ++mfi) { - const amrex::Box &box = mfi.validbox(); - const auto state = state_new_cc_[lev].const_array(mfi); - const auto tag = tags.array(mfi); - const int nidx = HydroSystem::density_index; - - amrex::ParallelFor(box, [=] AMREX_GPU_DEVICE(int i, int j, int k) noexcept { - Real const q = state(i, j, k, nidx); - - Real const q_xplus = state(i + 1, j, k, nidx); - Real const q_xminus = state(i - 1, j, k, nidx); - Real const q_yplus = state(i, j + 1, k, nidx); - Real const q_yminus = state(i, j - 1, k, nidx); - Real const q_zplus = state(i, j, k + 1, nidx); - Real const q_zminus = state(i, j, k - 1, nidx); - - Real const del_x = std::max(std::abs(q_xplus - q), std::abs(q - q_xminus)); - Real const del_y = std::max(std::abs(q_yplus - q), std::abs(q - q_yminus)); - Real const del_z = std::max(std::abs(q_zplus - q), std::abs(q - q_zminus)); - - Real const gradient_indicator = std::max({del_x, del_y, del_z}) / q; - - if ((gradient_indicator > eta_threshold) && (q > q_min)) { - tag(i, j, k) = amrex::TagBox::SET; - } - }); + Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + + consVar(i, j, k, HydroSystem::density_index) = rho; + consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; + consVar(i, j, k, HydroSystem::x2Momentum_index) = ymom; + consVar(i, j, k, HydroSystem::x3Momentum_index) = zmom; + consVar(i, j, k, HydroSystem::energy_index) = Egas; + consVar(i, j, k, HydroSystem::internalEnergy_index) = Eint; } } auto problem_main() -> int { // Problem parameters - const double CFL_number = 0.25; + constexpr double seconds_in_year = 3.154e7; const double max_time = 2.0e6 * seconds_in_year; // 2 Myr - const int max_timesteps = 1e5; // Problem initialization - constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; + constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; amrex::Vector BCs_cc(ncomp_cc); for (int n = 0; n < ncomp_cc; ++n) { - BCs_cc[n].setLo(0, amrex::BCType::int_dir); // periodic - BCs_cc[n].setHi(0, amrex::BCType::int_dir); + BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet + BCs_cc[n].setHi(0, amrex::BCType::foextrap); // extrapolate - BCs_cc[n].setLo(1, amrex::BCType::foextrap); // extrapolate - BCs_cc[n].setHi(1, amrex::BCType::ext_dir); // Dirichlet + BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic + BCs_cc[n].setHi(1, amrex::BCType::int_dir); BCs_cc[n].setLo(2, amrex::BCType::int_dir); BCs_cc[n].setHi(2, amrex::BCType::int_dir); } - RadhydroSimulation sim(BCs_cc); - - // Standard PPM gives unphysically enormous temperatures when used for - // this problem (e.g., ~1e14 K or higher), but can be fixed by - // reconstructing the temperature instead of the pressure - sim.reconstructionOrder_ = 3; // PLM - sim.densityFloor_ = 1.0e-2 * rho0; // density floor (to prevent vacuum) - - sim.cflNumber_ = CFL_number; - sim.maxTimesteps_ = max_timesteps; + RadhydroSimulation sim(BCs_cc); sim.stopTime_ = max_time; - sim.plotfileInterval_ = 100; - sim.checkpointInterval_ = 2000; // Set initial conditions sim.setInitialConditions(); From 1ea67acb5aff3d935628ed7d8261d6fb74eacc43 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 18:35:00 +0000 Subject: [PATCH 23/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/NSCBC/channel.cpp | 2 +- src/RadhydroSimulation.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 24c4e9bdd..34e12cb4b 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -146,7 +146,7 @@ auto problem_main() -> int constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; amrex::Vector BCs_cc(ncomp_cc); for (int n = 0; n < ncomp_cc; ++n) { - BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet + BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet BCs_cc[n].setHi(0, amrex::BCType::foextrap); // extrapolate BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index 8fb40f3a7..e44734cc3 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -47,9 +47,9 @@ #include "AMReX_YAFluxRegister.H" #ifdef AMREX_USE_ASCENT +#include "AMReX_Conduit_Blueprint.H" #include #include -#include "AMReX_Conduit_Blueprint.H" #endif #include "Chemistry.hpp" From 26e762e9cb5518fdb8bafa129c427ecd70deafb7 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:35:57 -0400 Subject: [PATCH 24/64] allow build in 1d --- src/NSCBC/CMakeLists.txt | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt index 96a9d47b8..ef6ddc0bb 100644 --- a/src/NSCBC/CMakeLists.txt +++ b/src/NSCBC/CMakeLists.txt @@ -1,8 +1,5 @@ -if (AMReX_SPACEDIM GREATER_EQUAL 2) - add_executable(test_channel_flow channel.cpp ${QuokkaObjSources}) +add_executable(test_channel_flow channel.cpp ${QuokkaObjSources}) - if(AMReX_GPU_BACKEND MATCHES "CUDA") - setup_target_for_cuda_compilation(test_channel_flow) - endif(AMReX_GPU_BACKEND MATCHES "CUDA") - -endif(AMReX_SPACEDIM GREATER_EQUAL 2) +if(AMReX_GPU_BACKEND MATCHES "CUDA") + setup_target_for_cuda_compilation(test_channel_flow) +endif(AMReX_GPU_BACKEND MATCHES "CUDA") From f5b3fe0307822aeb97d41ccc75f4b3a1e81f9331 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:39:01 -0400 Subject: [PATCH 25/64] remove table_data --- src/NSCBC/channel.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 24c4e9bdd..975f65ac8 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -72,7 +72,6 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: amrex::GpuArray prob_hi = grid_elem.prob_hi_; const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; - auto const &phase_table = userData_.table_data->const_table(); Real const Lx = (prob_hi[0] - prob_lo[0]); Real const Ly = (prob_hi[1] - prob_lo[1]); From 30e3652551a08e913705e77f576fcb2f196d1721 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:42:43 -0400 Subject: [PATCH 26/64] Update src/simulation.hpp Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/simulation.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/simulation.hpp b/src/simulation.hpp index 9b7f3eaef..6bae20985 100644 --- a/src/simulation.hpp +++ b/src/simulation.hpp @@ -1545,7 +1545,7 @@ template auto AMRSimulation::PlotFileName(int le // get plotfile name template auto AMRSimulation::CustomPlotFileName(const char *base, int lev) const -> std::string { - std::string base_str(base); +const return amrex::Concatenate(base_str, lev, 5); } From f788b1c0ec6188596b3fd8e57c3021d4fddf49fe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 18:43:35 +0000 Subject: [PATCH 27/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/simulation.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/simulation.hpp b/src/simulation.hpp index 6bae20985..7eac21f7a 100644 --- a/src/simulation.hpp +++ b/src/simulation.hpp @@ -1545,8 +1545,7 @@ template auto AMRSimulation::PlotFileName(int le // get plotfile name template auto AMRSimulation::CustomPlotFileName(const char *base, int lev) const -> std::string { -const - return amrex::Concatenate(base_str, lev, 5); + const return amrex::Concatenate(base_str, lev, 5); } template From a4bd97467ebd5c21d4676d30c130e2b3680356b6 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:45:02 -0400 Subject: [PATCH 28/64] move globals to namespace --- src/NSCBC/channel.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 53ac32fdc..39ea1d30d 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -54,15 +54,17 @@ template <> struct Physics_Traits { constexpr Real Tgas0 = 1.0e7; // K constexpr Real nH0 = 1.0e-4; // cm^-3 constexpr Real M0 = 2.0; // Mach number of shock - constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 // cloud-tracking variables needed for Dirichlet boundary condition -AMREX_GPU_MANAGED static Real rho_wind = 0; -AMREX_GPU_MANAGED static Real v_wind = 0; -AMREX_GPU_MANAGED static Real P_wind = 0; -AMREX_GPU_MANAGED static Real delta_vx = 0; +namespace +{ +AMREX_GPU_MANAGED Real rho_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real delta_vx = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { From db1da8e8c4e19cc7713c20a40fe58b8752bac302 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 14:46:27 -0400 Subject: [PATCH 29/64] fix bad clang-tidy suggestion --- src/simulation.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/simulation.hpp b/src/simulation.hpp index 7eac21f7a..7f3c117b4 100644 --- a/src/simulation.hpp +++ b/src/simulation.hpp @@ -1545,7 +1545,8 @@ template auto AMRSimulation::PlotFileName(int le // get plotfile name template auto AMRSimulation::CustomPlotFileName(const char *base, int lev) const -> std::string { - const return amrex::Concatenate(base_str, lev, 5); + const std::string base_str(base); + return amrex::Concatenate(base_str, lev, 5); } template From 39b0f8c7a32a969473168a4f3e38dffb28a52e9d Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 21 Aug 2023 18:47:48 +0000 Subject: [PATCH 30/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/NSCBC/channel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 39ea1d30d..80e4c1a64 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -51,9 +51,9 @@ template <> struct Physics_Traits { static constexpr bool is_radiation_enabled = false; }; -constexpr Real Tgas0 = 1.0e7; // K -constexpr Real nH0 = 1.0e-4; // cm^-3 -constexpr Real M0 = 2.0; // Mach number of shock +constexpr Real Tgas0 = 1.0e7; // K +constexpr Real nH0 = 1.0e-4; // cm^-3 +constexpr Real M0 = 2.0; // Mach number of shock constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 From 2eaf0b93bfb68f309aecd4ea7f9ae755976b0311 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 15:06:35 -0400 Subject: [PATCH 31/64] clean-up channel problem --- src/NSCBC/channel.cpp | 31 ++++++++++--------------------- tests/NSCBC_Channel.in | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 21 deletions(-) create mode 100644 tests/NSCBC_Channel.in diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 80e4c1a64..ef463ae40 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -38,7 +38,7 @@ struct Channel { template <> struct quokka::EOS_Traits { static constexpr double gamma = 5. / 3.; // default value - static constexpr double mean_molecular_weight = 1.0; + static constexpr double mean_molecular_weight = C::m_p + C::m_e; static constexpr double boltzmann_constant = C::k_B; }; @@ -51,8 +51,8 @@ template <> struct Physics_Traits { static constexpr bool is_radiation_enabled = false; }; -constexpr Real Tgas0 = 1.0e7; // K -constexpr Real nH0 = 1.0e-4; // cm^-3 +constexpr Real Tgas0 = 300; // K +constexpr Real nH0 = 1.0; // cm^-3 constexpr Real M0 = 2.0; // Mach number of shock constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 @@ -75,14 +75,6 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; - Real const Lx = (prob_hi[0] - prob_lo[0]); - Real const Ly = (prob_hi[1] - prob_lo[1]); - Real const Lz = (prob_hi[2] - prob_lo[2]); - - Real const x0 = prob_lo[0] + 0.5 * (prob_hi[0] - prob_lo[0]); - Real const y0 = prob_lo[1] + 0.8 * (prob_hi[1] - prob_lo[1]); - Real const z0 = prob_lo[2] + 0.5 * (prob_hi[2] - prob_lo[2]); - amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { Real const rho = rho0; Real const xmom = 0; @@ -139,10 +131,6 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda auto problem_main() -> int { - // Problem parameters - constexpr double seconds_in_year = 3.154e7; - const double max_time = 2.0e6 * seconds_in_year; // 2 Myr - // Problem initialization constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; amrex::Vector BCs_cc(ncomp_cc); @@ -150,15 +138,16 @@ auto problem_main() -> int BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet BCs_cc[n].setHi(0, amrex::BCType::foextrap); // extrapolate - BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic - BCs_cc[n].setHi(1, amrex::BCType::int_dir); - - BCs_cc[n].setLo(2, amrex::BCType::int_dir); - BCs_cc[n].setHi(2, amrex::BCType::int_dir); + if constexpr (AMREX_SPACEDIM >= 2) { + BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic + BCs_cc[n].setHi(1, amrex::BCType::int_dir); + } else if (AMREX_SPACEDIM == 3) { + BCs_cc[n].setLo(2, amrex::BCType::int_dir); + BCs_cc[n].setHi(2, amrex::BCType::int_dir); + } } RadhydroSimulation sim(BCs_cc); - sim.stopTime_ = max_time; // Set initial conditions sim.setInitialConditions(); diff --git a/tests/NSCBC_Channel.in b/tests/NSCBC_Channel.in new file mode 100644 index 000000000..71b113b02 --- /dev/null +++ b/tests/NSCBC_Channel.in @@ -0,0 +1,39 @@ +# ***************************************************************** +# Problem size and geometry +# ***************************************************************** +geometry.prob_lo = 0.0 0.0 0.0 +geometry.prob_hi = 1.0 1.0 1.0 +geometry.is_periodic = 0 1 1 + +# ***************************************************************** +# VERBOSITY +# ***************************************************************** +amr.v = 1 # verbosity in Amr + +# ***************************************************************** +# Resolution and refinement +# ***************************************************************** +amr.n_cell = 64 16 16 +amr.max_level = 0 # number of levels = max_level + 1 +amr.blocking_factor_x = 64 +amr.blocking_factor_y = 16 +amr.blocking_factor_z = 16 # grid size must be divisible by this +amr.max_grid_size = 64 + +# ***************************************************************** +# Quokka options +# ***************************************************************** +cfl = 0.3 +do_reflux = 1 +do_subcycle = 1 +max_timesteps = 1000 +stop_time = 1.0 + +checkpoint_interval = 5000 +plotfile_interval = 100 +ascent_interval = 1 + +hydro.rk_integrator_order = 1 +hydro.reconstruction_order = 1 +hydro.use_dual_energy = 0 +hydro.low_level_debugging_output = 0 From 3da896b7e67e8ff9394148f40f190b30bf9bee4f Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 16:32:11 -0400 Subject: [PATCH 32/64] add sympy notebook --- src/NSCBC/channel.cpp | 71 +++++++-- src/NSCBC/dQ_dx.ipynb | 342 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 400 insertions(+), 13 deletions(-) create mode 100644 src/NSCBC/dQ_dx.ipynb diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index ef463ae40..e778a18c8 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -26,10 +26,14 @@ #include "AMReX_TableData.H" #include "AMReX_iMultiFab.H" +#include "EOS.hpp" #include "RadhydroSimulation.hpp" #include "channel.hpp" #include "hydro_system.hpp" +#include "physics_info.hpp" +#include "physics_numVars.hpp" #include "radiation_system.hpp" +#include "valarray.hpp" using amrex::Real; @@ -92,6 +96,36 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: }); } +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray::nvar_> const &Q, const Real p_t) + -> quokka::valarray::nvar_> +{ + // return dQ/dx + const Real rho = Q[0]; + const Real u = Q[1]; + const Real v = Q[2]; + const Real w = Q[3]; + const Real p = Q[4]; + + const Real drho_dx = dQ_dx_data[0]; + const Real du_dx = dQ_dx_data[1]; + const Real dv_dx = dQ_dx_data[2]; + const Real dp_dx = dQ_dx_data[4]; + + // compute sub-expressions + const Real c = quokka::EOS::ComputeSoundSpeed(rho, p); + const Real M = std::sqrt(u * u + v * v + w * w) / c; + amrex::Real const K = 0.25 * c * (1 - M * M) / L_x; + + quokka::valarray::nvar_> dQ_dx{}; + dQ_dx[0] = (1.0 / 2.0) * (-K * (p - p_t) + (c - u) * (2 * std::pow(c, 2) * drho_dx + c * du_dx * rho - dp_dx)) / (std::pow(c, 2) * (c - u)); + dQ_dx[1] = (1.0 / 2.0) * (K * (p - p_t) + (c - u) * (c * du_dx * rho + dp_dx)) / (c * rho * (c - u)); + dQ_dx[2] = dv_dx; + dQ_dx[3] = NAN; + dQ_dx[4] = 0.5 * (-K * (p - p_t) + (c - u) * (c * du_dx * rho + dp_dx)) / (c - u); + + return dQ_dx; +} + template <> AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundaryConditions(const amrex::IntVect &iv, amrex::Array4 const &consVar, int /*dcomp*/, int /*numcomp*/, amrex::GeometryData const &geom, @@ -104,21 +138,32 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda const auto &domain_lo = box.loVect3d(); const auto &domain_hi = box.hiVect3d(); const int ilo = domain_lo[0]; + constexpr int nvar = HydroSystem::nvar_; + constexpr Real gamma = quokka::EOS_Traits::gamma; if (i < ilo) { - // x1 lower boundary -- constant - // compute downstream shock conditions from rho0, P0, and M0 - constexpr Real gamma = quokka::EOS_Traits::gamma; - constexpr Real rho2 = rho0 * (gamma + 1.) * M0 * M0 / ((gamma - 1.) * M0 * M0 + 2.); - constexpr Real P2 = P0 * (2. * gamma * M0 * M0 - (gamma - 1.)) / (gamma + 1.); - Real const v2 = M0 * std::sqrt(gamma * P2 / rho2); - - Real const rho = rho2; - Real const xmom = rho2 * v2; - Real const ymom = 0; - Real const zmom = 0; - Real const Eint = (gamma - 1.) * P2; - Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + // x1 lower boundary -- subsonic inflow + const Real dx = geom.CellSize(0); + + // compute dQ/dx + quokka::valarray dQ_dx = Compute_dQ_dx(Q); + + const Real rho_ip1 = consVar(ilo + 1, j, k, HydroSystem::density_index); + const Real x1mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x1Momentum_index); + const Real x2mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x2Momentum_index); + const Real x3mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x3Momentum_index); + const Real E_ip1 = consVar(ilo + 1, j, k, HydroSystem::energy_index); + const Real Eint_ip1 = E_ip1 - 0.5 * (x1mom_ip1 * x1mom_ip1 + x2mom_ip1 * x2mom_ip1 + x3mom_ip1 * x3mom_ip1) / rho_ip1; + + quokka::valarray Q_ip1{rho_ip1, x1mom_ip1 / rho_ip1, x2mom_ip1 / rho_ip1, x3mom_ip1 / rho_ip1, Eint_ip1 / (gamma - 1.)}; + quokka::valarray Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; + + Real const rho = Q_im1[0]; + Real const xmom = rho * Q_im1[1]; + Real const ymom = rho * Q_im1[2]; + Real const zmom = rho * Q_im1[3]; + Real const Eint = (gamma - 1.) * Q_im1[4]; + Real const Egas = Eint + 0.5 * (xmom * xmom + ymom * ymom + zmom * zmom) / rho; consVar(i, j, k, HydroSystem::density_index) = rho; consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb new file mode 100644 index 000000000..1b7083662 --- /dev/null +++ b/src/NSCBC/dQ_dx.ipynb @@ -0,0 +1,342 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import *\n", + "init_printing(use_unicode=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & \\frac{1}{c^{2}} & 0 & \\frac{1}{2 c^{2}}\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & \\frac{1}{2 c \\rho}\\\\0 & 0 & 1 & 0\\\\0.5 & 0 & 0 & 0.5\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 1 1 1 ⎤\n", + "⎢──── ── 0 ──── ⎥\n", + "⎢ 2 2 2 ⎥\n", + "⎢2⋅c c 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ -1 1 ⎥\n", + "⎢───── 0 0 ─────⎥\n", + "⎢2⋅c⋅ρ 2⋅c⋅ρ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 0.5 0 0 0.5 ⎦" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the eigenvector matrix S\n", + "c = Symbol('c')\n", + "rho = Symbol('rho')\n", + "S = Matrix([[1/(2*c**2), 1/c**2, 0, 1/(2*c**2)],\n", + " [-1/(2*rho*c), 0, 0, 1/(2*rho*c)],\n", + " [0, 0, 1, 0],\n", + " [1/2, 0, 0, 1/2]])\n", + "S" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- c + u & 0 & 0 & 0\\\\0 & u & 0 & 0\\\\0 & 0 & u & 0\\\\0 & 0 & 0 & c + u\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡-c + u 0 0 0 ⎤\n", + "⎢ ⎥\n", + "⎢ 0 u 0 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 u 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 c + u⎦" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute eigenvalue matrix \\lambda\n", + "u = Symbol('u')\n", + "lambda_waves = diag(u-c, u, u, u+c)\n", + "lambda_waves" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKkAAABkCAYAAAD9oxBFAAAACXBIWXMAAA7EAAAOxAGVKw4bAAALF0lEQVR4Ae1d7Y3cNhDdC+53YCdAClh3cHYqiK+Ds12B7Q58yC/738HuwEkFsa8DXyq483VgFxAghpEK8p6WI3Al6iRRpMRZzQBaSiRFDh+fhh+iuEevX78+2Ww2n3GE5PLNmzdPQgHmZwikQgAc+4K0tqH0EHZ07AW8wzkj+/LVv7BzQyATAm8D6Z7C74z+Pknfg7VGygBa5pUXAfDuj2YO8KNXi6TNeL3XSEiegH8R+QGOt0b0XtiiImjAGjqy6/gRx0Ocf48qaOAm35IGgru9oAT7sRdwLxkL7j04n+Ge4jCLTFASCfAsFmtX73+iqN9wPMIR7FtOgeKHmJuh2Avcdw9uRVCmgXM+Obx+z2uTNAiUjjXrHccTHC9R4r/SlHo/lSiSIgmO+G/3k6qurvH7GArTqpqkQWD1WMeS9DHwp3lvijTzDDdJg8DqsR7dJx1oJX9KUz/zpoKycSDIQSCF3Zcb+LVaDPiROLRwjLPFcQ4/eUBxmUaQ5pAWSSXWYxAaTVIkLqCwgrpkCLhd987uDzKQaJ9wkGwyEGTfmkTkfF0tCCeR2R9nH2wDl4TlwOY+rxPLwWEdg09sc9+X1899EQoLJ0H5dq0eCOL6KQ7614Jwztudwa0I6gJu4JK0JOsSog3r0RjFWNJQX1Qylidfmkzxz+aCHLTaf+MYY705Gq2acbi0mLSkFzhqgX/IMnKq5byOtDvhvZQx+e/u6P8tCut+dfPEGE1SVB6nHKhNqFLEL3n/rKv41AdhD7vCB/jTYl65dDqjI5yWkuX70IhEf0qr77rzjv+lTjiYgODqJyZ+s2HtZz7neWxzfwUlxYL4+oolZXjxAgKwonnsNesdildTQSROI/wZrr/CPxdZDgLrBmajLmNJyldffLvQFFq020BFNuMVce3p2SRepR/CxUrymufsf9aC8BNc8CCBc8lBYD0FnCiSonK4IOAb3GoBABXAOS0Sm87nvFYkLEuLZCgPR/FVn9CVjS2HtBRSXhLoJcKTN/VItxKkrQlrGcTVOEk5prjHE26m1eSCkl/hcqBE97ecFYb0kwv0JclYDpJSlirygeO6BLGwYlE5RfXKKcEFNfUAzPnlcorGGpjwYaUITh/hx+7PJ7itFU5VzBE/0SRF5qxAfypmRLZlRUVZmiP2poKcK2U3hsBz3e2sUjrW0K/VEqUEKKq5T6mAkrRoIVQMBpXgOUpNI2kPXLASbPrZH73uiWrBmRAwkvYDK7MYZkn7scoSw0jaDyunnbiQWwZR/XdYjKQIRA+ckmpRcGKOnGZFF6wjs6QLgm9ZD0PASDoMJ4u1IALJmns3Cv7dlWXr3OfWl1uwdg8k62QkBR58a1NP7uOcS+C4GJhvZkwMgWgEUjb3L0BMTnqL8DXjFn5cgGFiCEQjkNKS0orurRKK1mqmG/EA8UGicO1B0ZtbaNK1QjTw4wwW3/OP2jwiGUmhQHMhAUnLdZbZVggFcBjsBb3YFVGxuYUmXZsVAN35xo5fNHBFGV+MyHgFp8MkZXNf5wjF2MRzGR9X7xQn0E/N5haadA1VNPTn1wWTNo9ITlIoxCeFzegokx4qYEY/rtoJWXi+ny9tcwtNumapsmTNPbVzBOWay+ozYHdN/1yfVsSCwgFes3vCtERPhl/SowDRpGsWuEaTFISjleRAg8L32dUGCo6QnHYiSWVEz35p31pNRJlPoBv7SH2SdGV5X2Zd4Zp07SpDCv/BJHUk5AdrXRsocCBCAtCtBffVc6e157InQkA+YF0yhMhd96b016RrynLvpTWYpLiLBA1toHDBFEHG0HfqDNIo8q2OBt016RqFJ0n6o7tT3FZCIOCYDRRa9xfmwamQLhHLJd2Zrnhz+S+uK+qerUr05hsTgPpF7h1qSQdtoCCJluwCdDUbLpSgK3VAfS46lcgpqP8cqcTd45h7kvg0DdlAYe/egi80bbigSdeUVf6PJNY7T+qeJMbnE9UShD9ueZbvwVdz8lmIry0tRmmbW2jS1ccy2XkvSV1OnFNsfbYKgnI66q5+UzJFUyYEvVkeFZtbaNJ1QB3JIE/6/gNu2f+LnM4bANSQDRQ67y80gFZTy+YWmnRtVTf4w9aAIq3uqM0jjrx/xHuAxOSNyy5J+zUEFkIAXOT6Cv632NHQ5n4hVS1bQ2CzMZIaC4pHwEhafBWZgkZS40DxCBhJi68iU9BIahwoHgGSlNNOXE6nblK+eHRNwSkI8HVwtcyTJN3i4CqnUW8BEN/EEMiJACf+yUubgsqJsqWdBgHrk6bB0VLJiMDQ9aRBFfDKSs3mCqECaNMf+p6gHHwPXtyXuDmxjCYplOK3TCo2V+ggqAr9gTPX8k7aXCFU/pR+ubkQ1dxDKTWbK4QqQ5P+0HXy5gohDFL5zYFlFElRQO0bFmjXPxXHUqSTHctYknJ6IDSvKkv9GF6yaNe/JGyzYzmapDDv7CP1SbFzrtr17wN+zvC5sBxNUoAgBAx+8+RAGkLkOfH089Kuv1+Wpc9nwTKGpEOAkW9ZhsQtMY52/UvCdDKWMSQN9UUFFHmyStlcQfTyXe36+2VZ+nwWLEeTFP0QaeZDTbr4yQBqaRBb+WvXv1WgBT3mwnI0SR0m2jcs0K7/gtRsZZ0dy1iSat+wQLv+LaYs6JEdyyiSwsyr2VwhVHmK9ZdBiPT9Q8Wb1W8OLI8nlOgh7tWyuUKomGr0BxForSjykmTU5gq7W7P+ZsXSNofIWneWeCwCeDBtc4hY8Oy++RGI6pPOr6bluGYEjKRrrn0lZTeSKqmoNatpJF1z7Sspu5FUSUWtWU0j6ZprX0nZjaRKKmrNahpJ11z7SspuJFVSUWtWc8q7+w1eXaneHEJTxWvAGjqeAFOuM0i6eUU0SaGQis0VNBGxS9eSsYZuXOiedfOKqOYeiqneHKKLDCX6l4419Mu+eUUUSVGZ2TcEKJEwC+m0eqxjScp1jaGPsOTbJln3uFC9HlS2q8d6dJ/U9UH6WFDMynFfUejOgZ58ycoPCm/gd+vH4Tn8SAxaMMbZ4jiHnzyAuJxHkKd82HhXhkVifZfCY8NGkxQZCCiswC4ZAm7Xvcn9UdkkGv9lmmS7ZAZwuYswiXjKaxH4k8j34FZbYcMlYTlIvC9xZnTVYZ0Dm9jmvk8X+RanL95c4SToJQhXEdRl+hQu/WtB+BkuzoSgLuAGLklLspYopWGdHKMYSxrqi4pi8uRLkyr+i7kgFy0mLemFrwT8Q5aRUynnfjyc817KEq2DKqx3MKX/HW1JUbnSzIcqTfxm77/dAQ0t5pWndzAqwmkpqf+HRgSxoK2+ayNe8ktPZ8HVz0P8SsLa1y/Z+WiSupyzbwiQooSoZFYkj71mvSPtaqrHI4ZEe4aTr/BfigwqsBawcrixJM2+IUCKwnqE+x5KD+FiJRnMc/Y/a0H4CS54kMBLiQqsc4ITRVJUnqbNIahri2QoA0fxVZ8P57S2WxzSp944PxLkJc5nb+qRbyXIWxPWMoircZRyTHGPJ9ycdUOACXrt3YpKJsm4iQVJ+cUFkpT8UwqxsGJROUX1ysV5APcJrhcjqNODTtFYAyM+zBTBMenmFdEkdRVczSXu9Cv3F7o2R+xNZTlXeot47He+awYufV061tCv1VKlxCyquU+pQCFp0QJwgGJSIAKrJymsgPRHrwusH1MJCKyepMDgkWOCWdJCHwkj6W7a6dT1+wqtpnWrFT1wOhTYHDnNihZcoT5Jv6DCmqpyUUbWkVszQ7teHwLgGKcGt10lJ0k57dI1lbTUq8Aufc3/MBHgHHan/A8BZA3DWzQZSgAAAABJRU5ErkJggg==", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & - c \\rho & 0 & 1\\\\c^{2} & 0 & 0 & -1\\\\0 & 0 & 1 & 0\\\\0 & c \\rho & 0 & 1\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡0 -c⋅ρ 0 1 ⎤\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢c 0 0 -1⎥\n", + "⎢ ⎥\n", + "⎢0 0 1 0 ⎥\n", + "⎢ ⎥\n", + "⎣0 c⋅ρ 0 1 ⎦" + ] + }, + "execution_count": 33, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Sinv = Matrix([[0, -rho*c, 0, 1],\n", + " [c**2, 0, 0, -1],\n", + " [0, 0, 1, 0],\n", + " [0, rho*c, 0, 1]])\n", + "Sinv" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dp_{dx}\\right)\\\\u \\left(c^{2} drho_{dx} - dp_{dx}\\right)\\\\dv_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡(c - u)⋅(c⋅du_dx⋅ρ - dp_dx)⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ u⋅⎝c ⋅drho_dx - dp_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎣(c + u)⋅(c⋅du_dx⋅ρ + dp_dx)⎦" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the \\mathcal{L} matrix\n", + "#drho_dx = Symbol(r'\\frac{\\partial \\rho}{\\partial x}')\n", + "#du_dx = Symbol(r'\\frac{\\partial u}{\\partial x}')\n", + "#dv_vx = Symbol(r'\\frac{\\partial v}{\\partial x}')\n", + "#dp_dx = Symbol(r'\\frac{\\partial p}{\\partial x}')\n", + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_vx = Symbol('dv_dx')\n", + "dp_dx = Symbol('dp_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_vx, dp_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "L" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}K \\left(p - p_{t}\\right)\\\\u \\left(c^{2} drho_{dx} - dp_{dx}\\right)\\\\dv_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ K⋅(p - pₜ) ⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ u⋅⎝c ⋅drho_dx - dp_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎣(c + u)⋅(c⋅du_dx⋅ρ + dp_dx)⎦" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "K = Symbol('K')\n", + "p = Symbol('p')\n", + "p_t = Symbol('p_t')\n", + "L_outflow_x1_upper = Matrix([K*(p-p_t), L[1], L[2], L[3]])\n", + "L_outflow_x1_upper" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(p - p_{t}\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dp_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(p - p_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\\\frac{0.5 \\left(- K \\left(p - p_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)\\right)}{c - u}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ ⎛ 2 ⎞⎤\n", + "⎢-K⋅(p - pₜ) + (c - u)⋅⎝2⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dp_dx⎠⎥\n", + "⎢────────────────────────────────────────────────────────⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅c ⋅(c - u) ⎥\n", + "⎢ ⎥\n", + "⎢ K⋅(p - pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dp_dx) ⎥\n", + "⎢ ──────────────────────────────────────── ⎥\n", + "⎢ 2⋅c⋅ρ⋅(c - u) ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx ⎥\n", + "⎢ ⎥\n", + "⎢ 0.5⋅(-K⋅(p - pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dp_dx)) ⎥\n", + "⎢ ─────────────────────────────────────────────── ⎥\n", + "⎣ c - u ⎦" + ] + }, + "execution_count": 68, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", + "dQ_dx_outflow_x1_upper" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'(1.0/2.0)*(-K*(p - p_t) + (c - u)*(2*std::pow(c, 2)*drho_dx + c*du_dx*rho - dp_dx))/(std::pow(c, 2)*(c - u))'" + ] + }, + "execution_count": 81, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_outflow_x1_upper[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'(1.0/2.0)*(K*(p - p_t) + (c - u)*(c*du_dx*rho + dp_dx))/(c*rho*(c - u))'" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_outflow_x1_upper[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'dv_dx'" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_outflow_x1_upper[2])" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.5*(-K*(p - p_t) + (c - u)*(c*du_dx*rho + dp_dx))/(c - u)'" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_outflow_x1_upper[3])" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.4" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 6b994533c5aecef51f77e177e0ca18fbe51e1411 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 18:17:36 -0400 Subject: [PATCH 33/64] add prototype implementation --- src/NSCBC/channel.cpp | 101 +++++++-- src/NSCBC/dQ_dx.ipynb | 516 +++++++++++++++++++++++++++++++++--------- 2 files changed, 483 insertions(+), 134 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index e778a18c8..56dbe63fb 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -57,17 +57,16 @@ template <> struct Physics_Traits { constexpr Real Tgas0 = 300; // K constexpr Real nH0 = 1.0; // cm^-3 -constexpr Real M0 = 2.0; // Mach number of shock constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 -// cloud-tracking variables needed for Dirichlet boundary condition +// global variables needed for Dirichlet boundary condition namespace { -AMREX_GPU_MANAGED Real rho_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_wind = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real delta_vx = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) }; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) @@ -96,32 +95,72 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: }); } -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray::nvar_> const &Q, const Real p_t) - -> quokka::valarray::nvar_> +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const &Q, quokka::valarray const &dQ_dx_data, const Real P_t, + const Real L_x) -> quokka::valarray { - // return dQ/dx + // return dQ/dx corresponding to subsonic outflow on the x1 upper boundary const Real rho = Q[0]; const Real u = Q[1]; const Real v = Q[2]; const Real w = Q[3]; - const Real p = Q[4]; + const Real P = Q[4]; const Real drho_dx = dQ_dx_data[0]; const Real du_dx = dQ_dx_data[1]; const Real dv_dx = dQ_dx_data[2]; - const Real dp_dx = dQ_dx_data[4]; + const Real dw_dx = dQ_dx_data[3]; + const Real dP_dx = dQ_dx_data[4]; - // compute sub-expressions - const Real c = quokka::EOS::ComputeSoundSpeed(rho, p); + const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); const Real M = std::sqrt(u * u + v * v + w * w) / c; amrex::Real const K = 0.25 * c * (1 - M * M) / L_x; - quokka::valarray::nvar_> dQ_dx{}; - dQ_dx[0] = (1.0 / 2.0) * (-K * (p - p_t) + (c - u) * (2 * std::pow(c, 2) * drho_dx + c * du_dx * rho - dp_dx)) / (std::pow(c, 2) * (c - u)); - dQ_dx[1] = (1.0 / 2.0) * (K * (p - p_t) + (c - u) * (c * du_dx * rho + dp_dx)) / (c * rho * (c - u)); + // see SymPy notebook for derivation + quokka::valarray dQ_dx{}; + dQ_dx[0] = (1.0 / 2.0) * (-K * (P - P_t) + (c - u) * (2.0 * std::pow(c, 2) * drho_dx + c * du_dx * rho - 1.0 * dP_dx)) / (std::pow(c, 2) * (c - u)); + dQ_dx[1] = (1.0 / 2.0) * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); dQ_dx[2] = dv_dx; - dQ_dx[3] = NAN; - dQ_dx[4] = 0.5 * (-K * (p - p_t) + (c - u) * (c * du_dx * rho + dp_dx)) / (c - u); + dQ_dx[3] = dw_dx; + dQ_dx[4] = 0.5 * (-K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); + + return dQ_dx; +} + +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray const &Q, quokka::valarray const &dQ_dx_data, const Real P_t, + const Real u_t, const Real v_t, const Real w_t, const Real L_x) -> quokka::valarray +{ + // return dQ/dx corresponding to subsonic inflow on the x1 lower boundary + const Real rho = Q[0]; + const Real u = Q[1]; + const Real v = Q[2]; + const Real w = Q[3]; + const Real P = Q[4]; + + const Real drho_dx = dQ_dx_data[0]; + const Real du_dx = dQ_dx_data[1]; + const Real dv_dx = dQ_dx_data[2]; + const Real dw_dx = dQ_dx_data[3]; + const Real dP_dx = dQ_dx_data[4]; + + const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); + const Real M = std::sqrt(u * u + v * v + w * w) / c; + + const Real eta_2 = −0.278; + const Real eta_3 = 1.0; + const Real eta_4 = 1.0; + const Real eta_5 = 0.278; + + // see SymPy notebook for derivation + quokka::valarray dQ_dx{}; + dQ_dx[0] = (1.0 / 2.0) * + (L_x * u * (c + u) * (-1.0 * c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * u * (std::pow(M, 2) - 1) * (u - u_t) + + 2 * c * eta_2 * (P - P_t) * (c + u)) / + (L_x * std::pow(c, 2) * u * (c + u)); + dQ_dx[1] = (1.0 / 2.0) * (L_x * (c + u) * (c * du_dx * rho - 1.0 * dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / + (L_x * c * rho * (c + u)); + dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); + dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); + dQ_dx[4] = 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / (L_x * (c + u)); return dQ_dx; } @@ -133,21 +172,23 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda int /*orig_comp*/) { auto [i, j, k] = iv.dim3(); - amrex::Box const &box = geom.Domain(); + const Real Lx = box.length(0); const auto &domain_lo = box.loVect3d(); const auto &domain_hi = box.hiVect3d(); const int ilo = domain_lo[0]; - constexpr int nvar = HydroSystem::nvar_; + constexpr Real gamma = quokka::EOS_Traits::gamma; + const Real P_inflow = ::P_inflow; + const Real u_inflow = ::u_inflow; + const Real v_inflow = ::v_inflow; + const Real w_inflow = ::w_inflow; if (i < ilo) { // x1 lower boundary -- subsonic inflow const Real dx = geom.CellSize(0); - // compute dQ/dx - quokka::valarray dQ_dx = Compute_dQ_dx(Q); - + // read in primitive vars const Real rho_ip1 = consVar(ilo + 1, j, k, HydroSystem::density_index); const Real x1mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x1Momentum_index); const Real x2mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x2Momentum_index); @@ -155,9 +196,19 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda const Real E_ip1 = consVar(ilo + 1, j, k, HydroSystem::energy_index); const Real Eint_ip1 = E_ip1 - 0.5 * (x1mom_ip1 * x1mom_ip1 + x2mom_ip1 * x2mom_ip1 + x3mom_ip1 * x3mom_ip1) / rho_ip1; - quokka::valarray Q_ip1{rho_ip1, x1mom_ip1 / rho_ip1, x2mom_ip1 / rho_ip1, x3mom_ip1 / rho_ip1, Eint_ip1 / (gamma - 1.)}; - quokka::valarray Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; + // compute one-sided dQ/dx from the data + quokka::valarray Q_i{}; + quokka::valarray Q_ip1{rho_ip1, x1mom_ip1 / rho_ip1, x2mom_ip1 / rho_ip1, x3mom_ip1 / rho_ip1, Eint_ip1 / (gamma - 1.)}; + quokka::valarray Q_ip2{}; + quokka::valarray dQ_dx_data = -3. * Q_i + 4. * Q_ip1 - Q_ip2 / (2. * dx); + + // compute dQ/dx with modified characteristics + quokka::valarray dQ_dx = dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, P_inflow, u_inflow, v_inflow, w_inflow, Lx); + + // compute centered ghost values + quokka::valarray Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; + // convert to conserved vars Real const rho = Q_im1[0]; Real const xmom = rho * Q_im1[1]; Real const ymom = rho * Q_im1[2]; diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index 1b7083662..a4f065302 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -12,31 +12,33 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 90, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & \\frac{1}{c^{2}} & 0 & \\frac{1}{2 c^{2}}\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & \\frac{1}{2 c \\rho}\\\\0 & 0 & 1 & 0\\\\0.5 & 0 & 0 & 0.5\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & \\frac{1}{c^{2}} & 0 & 0 & \\frac{1}{2 c^{2}}\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & 0 & \\frac{1}{2 c \\rho}\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0.5 & 0 & 0 & 0 & 0.5\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 1 1 1 ⎤\n", - "⎢──── ── 0 ──── ⎥\n", - "⎢ 2 2 2 ⎥\n", - "⎢2⋅c c 2⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ -1 1 ⎥\n", - "⎢───── 0 0 ─────⎥\n", - "⎢2⋅c⋅ρ 2⋅c⋅ρ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 1 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 0.5 0 0 0.5 ⎦" + "⎡ 1 1 1 ⎤\n", + "⎢──── ── 0 0 ──── ⎥\n", + "⎢ 2 2 2 ⎥\n", + "⎢2⋅c c 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ -1 1 ⎥\n", + "⎢───── 0 0 0 ─────⎥\n", + "⎢2⋅c⋅ρ 2⋅c⋅ρ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 0.5 0 0 0 0.5 ⎦" ] }, - "execution_count": 9, + "execution_count": 90, "metadata": {}, "output_type": "execute_result" } @@ -45,35 +47,38 @@ "# compute the eigenvector matrix S\n", "c = Symbol('c')\n", "rho = Symbol('rho')\n", - "S = Matrix([[1/(2*c**2), 1/c**2, 0, 1/(2*c**2)],\n", - " [-1/(2*rho*c), 0, 0, 1/(2*rho*c)],\n", - " [0, 0, 1, 0],\n", - " [1/2, 0, 0, 1/2]])\n", + "S = Matrix([[1/(2*c**2), 1/c**2, 0, 0, 1/(2*c**2)],\n", + " [-1/(2*rho*c), 0, 0, 0, 1/(2*rho*c)],\n", + " [0, 0, 1, 0, 0],\n", + " [0, 0, 0, 1, 0],\n", + " [1/2, 0, 0, 0, 1/2]])\n", "S" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 91, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- c + u & 0 & 0 & 0\\\\0 & u & 0 & 0\\\\0 & 0 & u & 0\\\\0 & 0 & 0 & c + u\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}- c + u & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & 0\\\\0 & 0 & u & 0 & 0\\\\0 & 0 & 0 & u & 0\\\\0 & 0 & 0 & 0 & c + u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡-c + u 0 0 0 ⎤\n", - "⎢ ⎥\n", - "⎢ 0 u 0 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 u 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 0 0 0 c + u⎦" + "⎡-c + u 0 0 0 0 ⎤\n", + "⎢ ⎥\n", + "⎢ 0 u 0 0 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 u 0 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 u 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 c + u⎦" ] }, - "execution_count": 30, + "execution_count": 91, "metadata": {}, "output_type": "execute_result" } @@ -81,68 +86,70 @@ "source": [ "# compute eigenvalue matrix \\lambda\n", "u = Symbol('u')\n", - "lambda_waves = diag(u-c, u, u, u+c)\n", + "lambda_waves = diag(u-c, u, u, u, u+c)\n", "lambda_waves" ] }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 99, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & - c \\rho & 0 & 1\\\\c^{2} & 0 & 0 & -1\\\\0 & 0 & 1 & 0\\\\0 & c \\rho & 0 & 1\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}0 & - 1.0 c \\rho & 0 & 0 & 1.0\\\\1.0 c^{2} & 0 & 0 & 0 & -1.0\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0 & 1.0 c \\rho & 0 & 0 & 1.0\\end{matrix}\\right]$" ], "text/plain": [ - "⎡0 -c⋅ρ 0 1 ⎤\n", - "⎢ ⎥\n", - "⎢ 2 ⎥\n", - "⎢c 0 0 -1⎥\n", - "⎢ ⎥\n", - "⎢0 0 1 0 ⎥\n", - "⎢ ⎥\n", - "⎣0 c⋅ρ 0 1 ⎦" + "⎡ 0 -1.0⋅c⋅ρ 0 0 1.0 ⎤\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢1.0⋅c 0 0 0 -1.0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 0 1.0⋅c⋅ρ 0 0 1.0 ⎦" ] }, - "execution_count": 33, + "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "Sinv = Matrix([[0, -rho*c, 0, 1],\n", - " [c**2, 0, 0, -1],\n", - " [0, 0, 1, 0],\n", - " [0, rho*c, 0, 1]])\n", + "# compute S^{-1}\n", + "Sinv = S.inv()\n", "Sinv" ] }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 132, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dp_{dx}\\right)\\\\u \\left(c^{2} drho_{dx} - dp_{dx}\\right)\\\\dv_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}1.0 \\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\1.0 u \\left(c^{2} drho_{dx} - dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\1.0 \\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\end{matrix}\\right]$" ], "text/plain": [ - "⎡(c - u)⋅(c⋅du_dx⋅ρ - dp_dx)⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢ u⋅⎝c ⋅drho_dx - dp_dx⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎣(c + u)⋅(c⋅du_dx⋅ρ + dp_dx)⎦" + "⎡1.0⋅(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ 1.0⋅u⋅⎝c ⋅drho_dx - dP_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎣1.0⋅(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" ] }, - "execution_count": 66, + "execution_count": 132, "metadata": {}, "output_type": "execute_result" } @@ -151,82 +158,117 @@ "# compute the \\mathcal{L} matrix\n", "#drho_dx = Symbol(r'\\frac{\\partial \\rho}{\\partial x}')\n", "#du_dx = Symbol(r'\\frac{\\partial u}{\\partial x}')\n", - "#dv_vx = Symbol(r'\\frac{\\partial v}{\\partial x}')\n", + "#dv_dx = Symbol(r'\\frac{\\partial v}{\\partial x}')\n", + "#dw_dx = Symbol(r'\\frac{\\partial w}{\\partial x}')\n", "#dp_dx = Symbol(r'\\frac{\\partial p}{\\partial x}')\n", "drho_dx = Symbol('drho_dx')\n", "du_dx = Symbol('du_dx')\n", - "dv_vx = Symbol('dv_dx')\n", - "dp_dx = Symbol('dp_dx')\n", - "dQ_dx_def = Matrix([drho_dx, du_dx, dv_vx, dp_dx])\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "L" ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 117, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(p - p_{t}\\right)\\\\u \\left(c^{2} drho_{dx} - dp_{dx}\\right)\\\\dv_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\1.0 u \\left(\\frac{\\partial \\rho}{\\partial x} c^{2} - \\frac{\\partial p}{\\partial x}\\right)\\\\\\frac{\\partial v}{\\partial x} u\\\\\\frac{\\partial w}{\\partial x} u\\\\1.0 \\left(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ K⋅(p - pₜ) ⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢ u⋅⎝c ⋅drho_dx - dp_dx⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎣(c + u)⋅(c⋅du_dx⋅ρ + dp_dx)⎦" + "⎡ K⋅(P - Pₜ) \n", + "⎢ \n", + "⎢ ⎛ 2 ⎞\n", + "⎢ 1.0⋅u⋅⎝\\frac{\\partial \\rho}{\\partial x}⋅c - \\frac{\\partial p}{\\partial x}⎠\n", + "⎢ \n", + "⎢ \\frac{\\partial v}{\\partial x}⋅u \n", + "⎢ \n", + "⎢ \\frac{\\partial w}{\\partial x}⋅u \n", + "⎢ \n", + "⎣1.0⋅(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x}⋅c⋅ρ)⋅(c + \n", + "\n", + " ⎤\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + "u)⎦" ] }, - "execution_count": 67, + "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "K = Symbol('K')\n", - "p = Symbol('p')\n", - "p_t = Symbol('p_t')\n", - "L_outflow_x1_upper = Matrix([K*(p-p_t), L[1], L[2], L[3]])\n", + "p = Symbol('P')\n", + "p_t = Symbol('P_t')\n", + "L_outflow_x1_upper = Matrix([K*(p-p_t), L[1], L[2], L[3], L[4]])\n", "L_outflow_x1_upper" ] }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 118, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(p - p_{t}\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dp_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(p - p_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\\\frac{0.5 \\left(- K \\left(p - p_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dp_{dx}\\right)\\right)}{c - u}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(2.0 \\frac{\\partial \\rho}{\\partial x} c^{2} - 1.0 \\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right) \\left(c - u\\right)}{2 c \\rho \\left(c - u\\right)}\\\\\\frac{\\partial v}{\\partial x}\\\\\\frac{\\partial w}{\\partial x}\\\\\\frac{0.5 \\left(- K \\left(P - P_{t}\\right) + \\left(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right) \\left(c - u\\right)\\right)}{c - u}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 ⎞⎤\n", - "⎢-K⋅(p - pₜ) + (c - u)⋅⎝2⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dp_dx⎠⎥\n", - "⎢────────────────────────────────────────────────────────⎥\n", - "⎢ 2 ⎥\n", - "⎢ 2⋅c ⋅(c - u) ⎥\n", - "⎢ ⎥\n", - "⎢ K⋅(p - pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dp_dx) ⎥\n", - "⎢ ──────────────────────────────────────── ⎥\n", - "⎢ 2⋅c⋅ρ⋅(c - u) ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx ⎥\n", - "⎢ ⎥\n", - "⎢ 0.5⋅(-K⋅(p - pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dp_dx)) ⎥\n", - "⎢ ─────────────────────────────────────────────── ⎥\n", - "⎣ c - u ⎦" + "⎡ ⎛ 2 \n", + "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝2.0⋅\\frac{\\partial \\rho}{\\partial x}⋅c - \\frac{\\parti\n", + "⎢─────────────────────────────────────────────────────────────────────────────\n", + "⎢ 2 \n", + "⎢ 2⋅c ⋅(c - u) \n", + "⎢ \n", + "⎢ K⋅(P - Pₜ) + (\\frac{\\partial p}{\\partial x} + \\frac{\\par\n", + "⎢ ────────────────────────────────────────────────────────\n", + "⎢ 2⋅c⋅ρ⋅(c - u) \n", + "⎢ \n", + "⎢ \\frac{\\partial v}{\\partial\n", + "⎢ \n", + "⎢ \\frac{\\partial w}{\\partial\n", + "⎢ \n", + "⎢ 0.5⋅(-K⋅(P - Pₜ) + (\\frac{\\partial p}{\\partial x} + \\frac{\\\n", + "⎢ ───────────────────────────────────────────────────────────\n", + "⎣ c - u \n", + "\n", + " ⎞⎤\n", + "al p}{\\partial x} + \\frac{\\partial u}{\\partial x}⋅c⋅ρ⎠⎥\n", + "──────────────────────────────────────────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + "tial u}{\\partial x}⋅c⋅ρ)⋅(c - u) ⎥\n", + "──────────────────────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " x} ⎥\n", + " ⎥\n", + " x} ⎥\n", + " ⎥\n", + "partial u}{\\partial x}⋅c⋅ρ)⋅(c - u)) ⎥\n", + "──────────────────────────────────── ⎥\n", + " ⎦" ] }, - "execution_count": 68, + "execution_count": 118, "metadata": {}, "output_type": "execute_result" } @@ -238,16 +280,16 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'(1.0/2.0)*(-K*(p - p_t) + (c - u)*(2*std::pow(c, 2)*drho_dx + c*du_dx*rho - dp_dx))/(std::pow(c, 2)*(c - u))'" + "'(1.0/2.0)*(-K*(P - P_t) + (c - u)*(2.0*std::pow(c, 2)*drho_dx + c*du_dx*rho - 1.0*dP_dx))/(std::pow(c, 2)*(c - u))'" ] }, - "execution_count": 81, + "execution_count": 111, "metadata": {}, "output_type": "execute_result" } @@ -258,16 +300,16 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'(1.0/2.0)*(K*(p - p_t) + (c - u)*(c*du_dx*rho + dp_dx))/(c*rho*(c - u))'" + "'(1.0/2.0)*(K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u))'" ] }, - "execution_count": 78, + "execution_count": 112, "metadata": {}, "output_type": "execute_result" } @@ -278,7 +320,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 113, "metadata": {}, "outputs": [ { @@ -287,7 +329,7 @@ "'dv_dx'" ] }, - "execution_count": 79, + "execution_count": 113, "metadata": {}, "output_type": "execute_result" } @@ -298,16 +340,16 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'0.5*(-K*(p - p_t) + (c - u)*(c*du_dx*rho + dp_dx))/(c - u)'" + "'dw_dx'" ] }, - "execution_count": 76, + "execution_count": 114, "metadata": {}, "output_type": "execute_result" } @@ -315,6 +357,262 @@ "source": [ "cxxcode(dQ_dx_outflow_x1_upper[3])" ] + }, + { + "cell_type": "code", + "execution_count": 115, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.5*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u)'" + ] + }, + "execution_count": 115, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_outflow_x1_upper[4])" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}1.0 \\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡1.0⋅(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2⎞ ⎥\n", + "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", + "⎢ ───────────────────────── ⎥\n", + "⎣ Lₓ ⎦" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eta_2 = Symbol('eta_2')\n", + "eta_3 = Symbol('eta_3')\n", + "eta_4 = Symbol('eta_4')\n", + "eta_5 = Symbol('eta_5')\n", + "Lx = Symbol('L_x')\n", + "M = Symbol('M')\n", + "u_t = Symbol('u_t')\n", + "v = Symbol('v')\n", + "v_t = Symbol('v_t')\n", + "w = Symbol('w')\n", + "w_t = Symbol('w_t')\n", + "\n", + "L_inflow_x1_lower = Matrix([L[0],\n", + " eta_2*(c/Lx)*(p-p_t),\n", + " eta_3*(c/Lx)*(v-v_t),\n", + " eta_4*(c/Lx)*(w-w_t),\n", + " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + "L_inflow_x1_lower" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- 1.0 c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right) + 2 c \\eta_{2} \\left(P - P_{t}\\right) \\left(c + u\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - 1.0 dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{0.5 \\left(L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)\\right)}{L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 2 ⎛ 2 ⎞ \n", + "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅u⋅⎝M - 1⎠⋅(u - uₜ) + 2⋅c⋅η₂⋅(P -\n", + "⎢─────────────────────────────────────────────────────────────────────────────\n", + "⎢ 2 \n", + "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", + "⎢ \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ────────────────────────────────────────────────────────── \n", + "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", + "⎢ \n", + "⎢ c⋅η₃⋅(v - vₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", + "⎢ \n", + "⎢ c⋅η₄⋅(w - wₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", + "⎢ \n", + "⎢ ⎛ 2 ⎛ 2 ⎞ ⎞\n", + "⎢ 0.5⋅⎝Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ)⎠\n", + "⎢ ─────────────────────────────────────────────────────────────────\n", + "⎣ Lₓ⋅(c + u) \n", + "\n", + " ⎤\n", + " Pₜ)⋅(c + u)⎥\n", + "────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", + "dQ_dx_inflow_x1_lower" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'(1.0/2.0)*(L_x*u*(c + u)*(-1.0*c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t) + 2*c*eta_2*(P - P_t)*(c + u))/(L_x*std::pow(c, 2)*u*(c + u))'" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_inflow_x1_lower[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'(1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - 1.0*dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u))'" + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_inflow_x1_lower[1])" + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'c*eta_3*(v - v_t)/(L_x*u)'" + ] + }, + "execution_count": 142, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_inflow_x1_lower[2])" + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'c*eta_4*(w - w_t)/(L_x*u)'" + ] + }, + "execution_count": 143, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_inflow_x1_lower[3])" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'0.5*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u))'" + ] + }, + "execution_count": 144, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "cxxcode(dQ_dx_inflow_x1_lower[4])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From be7ccae7759041450e158e36bb30e996d1051fc1 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 18:22:42 -0400 Subject: [PATCH 34/64] fix unicode error --- src/NSCBC/channel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 56dbe63fb..adb72bf81 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -145,7 +145,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); const Real M = std::sqrt(u * u + v * v + w * w) / c; - const Real eta_2 = −0.278; + const Real eta_2 = -0.278; const Real eta_3 = 1.0; const Real eta_4 = 1.0; const Real eta_5 = 0.278; From b9e1246bf21307bb27be48ffa9da6b0d70ca76e2 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 19:48:13 -0400 Subject: [PATCH 35/64] fix cxxcode output --- src/NSCBC/dQ_dx.ipynb | 343 +++++++++++------------------------------- 1 file changed, 86 insertions(+), 257 deletions(-) diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index a4f065302..20794479a 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -10,9 +10,16 @@ "init_printing(use_unicode=True)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Low-order primitive Eigensystem" + ] + }, { "cell_type": "code", - "execution_count": 90, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -38,7 +45,7 @@ "⎣ 0.5 0 0 0 0.5 ⎦" ] }, - "execution_count": 90, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -57,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -78,7 +85,7 @@ "⎣ 0 0 0 0 c + u⎦" ] }, - "execution_count": 91, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -92,7 +99,7 @@ }, { "cell_type": "code", - "execution_count": 99, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -114,7 +121,7 @@ "⎣ 0 1.0⋅c⋅ρ 0 0 1.0 ⎦" ] }, - "execution_count": 99, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -127,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 132, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -149,18 +156,13 @@ "⎣1.0⋅(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" ] }, - "execution_count": 132, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute the \\mathcal{L} matrix\n", - "#drho_dx = Symbol(r'\\frac{\\partial \\rho}{\\partial x}')\n", - "#du_dx = Symbol(r'\\frac{\\partial u}{\\partial x}')\n", - "#dv_dx = Symbol(r'\\frac{\\partial v}{\\partial x}')\n", - "#dw_dx = Symbol(r'\\frac{\\partial w}{\\partial x}')\n", - "#dp_dx = Symbol(r'\\frac{\\partial p}{\\partial x}')\n", "drho_dx = Symbol('drho_dx')\n", "du_dx = Symbol('du_dx')\n", "dv_dx = Symbol('dv_dx')\n", @@ -171,42 +173,38 @@ "L" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### x1 Upper Outflow" + ] + }, { "cell_type": "code", - "execution_count": 117, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\1.0 u \\left(\\frac{\\partial \\rho}{\\partial x} c^{2} - \\frac{\\partial p}{\\partial x}\\right)\\\\\\frac{\\partial v}{\\partial x} u\\\\\\frac{\\partial w}{\\partial x} u\\\\1.0 \\left(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\1.0 u \\left(c^{2} drho_{dx} - dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\1.0 \\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ K⋅(P - Pₜ) \n", - "⎢ \n", - "⎢ ⎛ 2 ⎞\n", - "⎢ 1.0⋅u⋅⎝\\frac{\\partial \\rho}{\\partial x}⋅c - \\frac{\\partial p}{\\partial x}⎠\n", - "⎢ \n", - "⎢ \\frac{\\partial v}{\\partial x}⋅u \n", - "⎢ \n", - "⎢ \\frac{\\partial w}{\\partial x}⋅u \n", - "⎢ \n", - "⎣1.0⋅(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x}⋅c⋅ρ)⋅(c + \n", - "\n", - " ⎤\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - "u)⎦" + "⎡ K⋅(P - Pₜ) ⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ 1.0⋅u⋅⎝c ⋅drho_dx - dP_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎣1.0⋅(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" ] }, - "execution_count": 117, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -221,54 +219,36 @@ }, { "cell_type": "code", - "execution_count": 118, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(2.0 \\frac{\\partial \\rho}{\\partial x} c^{2} - 1.0 \\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right) \\left(c - u\\right)}{2 c \\rho \\left(c - u\\right)}\\\\\\frac{\\partial v}{\\partial x}\\\\\\frac{\\partial w}{\\partial x}\\\\\\frac{0.5 \\left(- K \\left(P - P_{t}\\right) + \\left(\\frac{\\partial p}{\\partial x} + \\frac{\\partial u}{\\partial x} c \\rho\\right) \\left(c - u\\right)\\right)}{c - u}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(2.0 c^{2} drho_{dx} + c du_{dx} \\rho - 1.0 dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{0.5 \\left(- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\right)}{c - u}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 \n", - "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝2.0⋅\\frac{\\partial \\rho}{\\partial x}⋅c - \\frac{\\parti\n", - "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅c ⋅(c - u) \n", - "⎢ \n", - "⎢ K⋅(P - Pₜ) + (\\frac{\\partial p}{\\partial x} + \\frac{\\par\n", - "⎢ ────────────────────────────────────────────────────────\n", - "⎢ 2⋅c⋅ρ⋅(c - u) \n", - "⎢ \n", - "⎢ \\frac{\\partial v}{\\partial\n", - "⎢ \n", - "⎢ \\frac{\\partial w}{\\partial\n", - "⎢ \n", - "⎢ 0.5⋅(-K⋅(P - Pₜ) + (\\frac{\\partial p}{\\partial x} + \\frac{\\\n", - "⎢ ───────────────────────────────────────────────────────────\n", - "⎣ c - u \n", - "\n", - " ⎞⎤\n", - "al p}{\\partial x} + \\frac{\\partial u}{\\partial x}⋅c⋅ρ⎠⎥\n", - "──────────────────────────────────────────────────────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - "tial u}{\\partial x}⋅c⋅ρ)⋅(c - u) ⎥\n", - "──────────────────────────────── ⎥\n", - " ⎥\n", - " ⎥\n", - " x} ⎥\n", - " ⎥\n", - " x} ⎥\n", - " ⎥\n", - "partial u}{\\partial x}⋅c⋅ρ)⋅(c - u)) ⎥\n", - "──────────────────────────────────── ⎥\n", - " ⎦" + "⎡ ⎛ 2 ⎞⎤\n", + "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝2.0⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", + "⎢──────────────────────────────────────────────────────────⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅c ⋅(c - u) ⎥\n", + "⎢ ⎥\n", + "⎢ K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "⎢ ──────────────────────────────────────── ⎥\n", + "⎢ 2⋅c⋅ρ⋅(c - u) ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx ⎥\n", + "⎢ ⎥\n", + "⎢ 0.5⋅(-K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx)) ⎥\n", + "⎢ ─────────────────────────────────────────────── ⎥\n", + "⎣ c - u ⎦" ] }, - "execution_count": 118, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -280,107 +260,35 @@ }, { "cell_type": "code", - "execution_count": 111, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'(1.0/2.0)*(-K*(P - P_t) + (c - u)*(2.0*std::pow(c, 2)*drho_dx + c*du_dx*rho - 1.0*dP_dx))/(std::pow(c, 2)*(c - u))'" - ] - }, - "execution_count": 111, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_outflow_x1_upper[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 112, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'(1.0/2.0)*(K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u))'" - ] - }, - "execution_count": 112, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_outflow_x1_upper[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 113, + "execution_count": 15, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "'dv_dx'" - ] - }, - "execution_count": 113, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(2.0*std::pow(c, 2)*drho_dx + c*du_dx*rho - 1.0*dP_dx))/(std::pow(c, 2)*(c - u));\n", + "dQ_dx[1] = (1.0/2.0)*(K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u));\n", + "dQ_dx[2] = dv_dx;\n", + "dQ_dx[3] = dw_dx;\n", + "dQ_dx[4] = 0.5*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n" + ] } ], "source": [ - "cxxcode(dQ_dx_outflow_x1_upper[2])" + "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" ] }, { - "cell_type": "code", - "execution_count": 114, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'dw_dx'" - ] - }, - "execution_count": 114, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "cxxcode(dQ_dx_outflow_x1_upper[3])" + "### x1 Lower Inflow" ] }, { "cell_type": "code", - "execution_count": 115, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0.5*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u)'" - ] - }, - "execution_count": 115, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_outflow_x1_upper[4])" - ] - }, - { - "cell_type": "code", - "execution_count": 133, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -410,7 +318,7 @@ "⎣ Lₓ ⎦" ] }, - "execution_count": 133, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -438,7 +346,7 @@ }, { "cell_type": "code", - "execution_count": 134, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -497,7 +405,7 @@ " ⎦" ] }, - "execution_count": 134, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -509,102 +417,23 @@ }, { "cell_type": "code", - "execution_count": 140, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'(1.0/2.0)*(L_x*u*(c + u)*(-1.0*c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t) + 2*c*eta_2*(P - P_t)*(c + u))/(L_x*std::pow(c, 2)*u*(c + u))'" - ] - }, - "execution_count": 140, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_inflow_x1_lower[0])" - ] - }, - { - "cell_type": "code", - "execution_count": 141, + "execution_count": 16, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "'(1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - 1.0*dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u))'" - ] - }, - "execution_count": 141, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_inflow_x1_lower[1])" - ] - }, - { - "cell_type": "code", - "execution_count": 142, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'c*eta_3*(v - v_t)/(L_x*u)'" - ] - }, - "execution_count": 142, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_inflow_x1_lower[2])" - ] - }, - { - "cell_type": "code", - "execution_count": 143, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'c*eta_4*(w - w_t)/(L_x*u)'" - ] - }, - "execution_count": 143, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "cxxcode(dQ_dx_inflow_x1_lower[3])" - ] - }, - { - "cell_type": "code", - "execution_count": 144, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'0.5*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u))'" - ] - }, - "execution_count": 144, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-1.0*c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t) + 2*c*eta_2*(P - P_t)*(c + u))/(L_x*std::pow(c, 2)*u*(c + u));\n", + "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - 1.0*dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", + "dQ_dx[2] = c*eta_3*(v - v_t)/(L_x*u);\n", + "dQ_dx[3] = c*eta_4*(w - w_t)/(L_x*u);\n", + "dQ_dx[4] = 0.5*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n" + ] } ], "source": [ - "cxxcode(dQ_dx_inflow_x1_lower[4])" + "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" ] }, { From 5af30601ff49f9e63b8b455d63667dccadc9fdc5 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 21 Aug 2023 21:35:34 -0400 Subject: [PATCH 36/64] re-derive eigensystem --- src/NSCBC/channel.cpp | 17 +- src/NSCBC/dQ_dx.ipynb | 440 +++++++++++++++++++++++++----------------- 2 files changed, 267 insertions(+), 190 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index adb72bf81..db3c61343 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -117,8 +117,8 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray // see SymPy notebook for derivation quokka::valarray dQ_dx{}; - dQ_dx[0] = (1.0 / 2.0) * (-K * (P - P_t) + (c - u) * (2.0 * std::pow(c, 2) * drho_dx + c * du_dx * rho - 1.0 * dP_dx)) / (std::pow(c, 2) * (c - u)); - dQ_dx[1] = (1.0 / 2.0) * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); + dQ_dx[0] = 0.5 * (-K * (P - P_t) + (c - u) * (2.0 * c * c * drho_dx + c * du_dx * rho - dP_dx)) / (c * c * (c - u)); + dQ_dx[1] = 0.5 * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); dQ_dx[2] = dv_dx; dQ_dx[3] = dw_dx; dQ_dx[4] = 0.5 * (-K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); @@ -152,15 +152,14 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< // see SymPy notebook for derivation quokka::valarray dQ_dx{}; - dQ_dx[0] = (1.0 / 2.0) * - (L_x * u * (c + u) * (-1.0 * c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * u * (std::pow(M, 2) - 1) * (u - u_t) + - 2 * c * eta_2 * (P - P_t) * (c + u)) / - (L_x * std::pow(c, 2) * u * (c + u)); - dQ_dx[1] = (1.0 / 2.0) * (L_x * (c + u) * (c * du_dx * rho - 1.0 * dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / - (L_x * c * rho * (c + u)); + dQ_dx[0] = + 0.5 * + (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * u * ((M * M) - 1) * (u - u_t) - 2 * c * eta_2 * (P - P_t) * (c + u)) / + (L_x * (c * c) * u * (c + u)); + dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * c * rho * (c + u)); dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); - dQ_dx[4] = 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / (L_x * (c + u)); + dQ_dx[4] = 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * (c + u)); return dQ_dx; } diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index 20794479a..6945533b9 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -14,38 +14,79 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Low-order primitive Eigensystem" + "## Primitive variable eigensystem" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 39, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & \\frac{1}{c^{2}} & 0 & 0 & \\frac{1}{2 c^{2}}\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & 0 & \\frac{1}{2 c \\rho}\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0.5 & 0 & 0 & 0 & 0.5\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}u & \\rho & 0 & 0 & 0\\\\0 & u & 0 & 0 & \\frac{1}{\\rho}\\\\0 & 0 & u & 0 & 0\\\\0 & 0 & 0 & u & 0\\\\0 & c^{2} \\rho & 0 & 0 & u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 1 1 1 ⎤\n", - "⎢──── ── 0 0 ──── ⎥\n", - "⎢ 2 2 2 ⎥\n", - "⎢2⋅c c 2⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ -1 1 ⎥\n", - "⎢───── 0 0 0 ─────⎥\n", - "⎢2⋅c⋅ρ 2⋅c⋅ρ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 1 0 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 1 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 0.5 0 0 0 0.5 ⎦" + "⎡u ρ 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢ 1⎥\n", + "⎢0 u 0 0 ─⎥\n", + "⎢ ρ⎥\n", + "⎢ ⎥\n", + "⎢0 0 u 0 0⎥\n", + "⎢ ⎥\n", + "⎢0 0 0 u 0⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎣0 c ⋅ρ 0 0 u⎦" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rho = Symbol('rho', positive=True) # density\n", + "c = Symbol('c', positive=True) # sound speed\n", + "u = Symbol('u') # normal velocity\n", + "\n", + "# Jacobian for primitive variable Euler equations\n", + "F = Matrix([[u, rho, 0, 0, 0],\n", + " [0, u, 0, 0, 1/rho],\n", + " [0, 0, u, 0, 0],\n", + " [0, 0, 0, u, 0],\n", + " [0, rho*c**2, 0, 0, u]])\n", + "F" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & - c \\rho & 0 & 0 & 1\\\\- c^{2} & 0 & 0 & 0 & 1\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0 & c \\rho & 0 & 0 & 1\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 0 -c⋅ρ 0 0 1⎤\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢-c 0 0 0 1⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 c⋅ρ 0 0 1⎦" ] }, - "execution_count": 2, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -54,17 +95,15 @@ "# compute the eigenvector matrix S\n", "c = Symbol('c')\n", "rho = Symbol('rho')\n", - "S = Matrix([[1/(2*c**2), 1/c**2, 0, 0, 1/(2*c**2)],\n", - " [-1/(2*rho*c), 0, 0, 0, 1/(2*rho*c)],\n", - " [0, 0, 1, 0, 0],\n", - " [0, 0, 0, 1, 0],\n", - " [1/2, 0, 0, 0, 1/2]])\n", - "S" + "lambda_list = [eval for (eval, n, es) in F.left_eigenvects()]\n", + "Sinv_list = [[ev for ev in es] for (v, n, es) in F.left_eigenvects()]\n", + "Sinv = Matrix([S_list[1][0], S_list[0][2], S_list[0][0], S_list[0][1], S_list[2][0]])\n", + "Sinv" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 57, "metadata": {}, "outputs": [ { @@ -85,89 +124,93 @@ "⎣ 0 0 0 0 c + u⎦" ] }, - "execution_count": 3, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute eigenvalue matrix \\lambda\n", - "u = Symbol('u')\n", - "lambda_waves = diag(u-c, u, u, u, u+c)\n", + "lambda_waves = diag(lambda_list[1], lambda_list[0], lambda_list[0], lambda_list[0], lambda_list[2])\n", "lambda_waves" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 58, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & - 1.0 c \\rho & 0 & 0 & 1.0\\\\1.0 c^{2} & 0 & 0 & 0 & -1.0\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0 & 1.0 c \\rho & 0 & 0 & 1.0\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & - \\frac{1}{c^{2}} & 0 & 0 & \\frac{1}{2 c^{2}}\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & 0 & \\frac{1}{2 c \\rho}\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\\\frac{1}{2} & 0 & 0 & 0 & \\frac{1}{2}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 0 -1.0⋅c⋅ρ 0 0 1.0 ⎤\n", - "⎢ ⎥\n", - "⎢ 2 ⎥\n", - "⎢1.0⋅c 0 0 0 -1.0⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 1 0 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 1 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 0 1.0⋅c⋅ρ 0 0 1.0 ⎦" + "⎡ 1 -1 1 ⎤\n", + "⎢──── ─── 0 0 ──── ⎥\n", + "⎢ 2 2 2 ⎥\n", + "⎢2⋅c c 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ -1 1 ⎥\n", + "⎢───── 0 0 0 ─────⎥\n", + "⎢2⋅c⋅ρ 2⋅c⋅ρ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 1/2 0 0 0 1/2 ⎦" ] }, - "execution_count": 4, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute S^{-1}\n", - "Sinv = S.inv()\n", - "Sinv" + "S = Sinv.inv()\n", + "S" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 73, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}1.0 \\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\1.0 u \\left(c^{2} drho_{dx} - dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\1.0 \\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" ], "text/plain": [ - "⎡1.0⋅(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢ 1.0⋅u⋅⎝c ⋅drho_dx - dP_dx⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ dw_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎣1.0⋅(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" + "⎡(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u)⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2⎞ ⎥\n", + "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dv}{dx}⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dw}{dx}⋅u ⎥\n", + "⎢ ⎥\n", + "⎣(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) ⎦" ] }, - "execution_count": 12, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute the \\mathcal{L} matrix\n", - "drho_dx = Symbol('drho_dx')\n", - "du_dx = Symbol('du_dx')\n", - "dv_dx = Symbol('dv_dx')\n", - "dw_dx = Symbol('dw_dx')\n", - "dp_dx = Symbol('dP_dx')\n", + "drho_dx = Symbol(r'\\frac{d\\rho}{dx}')\n", + "du_dx = Symbol(r'\\frac{du}{dx}')\n", + "dv_dx = Symbol(r'\\frac{dv}{dx}')\n", + "dw_dx = Symbol(r'\\frac{dw}{dx}')\n", + "dp_dx = Symbol(r'\\frac{dP}{dx}')\n", + "\n", "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "L" @@ -182,29 +225,29 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 68, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQIAAAB9CAYAAABJTG3wAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAdmUlEQVR4Ae2dXdIdtRGGj12+ToFdlXucHRh7BcAOAl4BZgdO+crcuWAH4BUY2EHCCnDYAcl9qnC+ygbI++hTy5o5mhnN75lzTnfVHM3RT6v1St1qaf7uvHz58tHhcPinjhL99PXXX39eSvA4R8AROB8EpMe/SdqHJYmVdudulvCtzr9qHd9l6X56YgTUYcWOPLFYm1bvGEyG+xuVbOv3T8btnp0o/E4g/yv776c7QkB981zi0D/X3kcPhcVfdTBxOVUiILy+b2dVHFF/5Sc3BPx3moiAQEVRn+gIwCr8h44bxTeWVvr/Y8xzo/Ctjr8p7leFnaR0eD5QWBz8iqfuz3R8GpmEuuP5Bwrv67C6qPcktISc4vEPHY90PNNxNLhP0rALqPROtkfwFwF77bPN7C4Vhn+Iyb8U/qXETPEo9VMdX+p8UCmVB0X+WeHHJX55nPJQ96+lvIr7u9Ie6/hI54P15nyXPl9CTvFgX+uTU7dlaWy25Cfsnqk+VgKNPYItZbjIugQoG69QWnvd/r39jcAfFH6uo1YZWdsN7tWIn9X9Jq8zO4cHRoXOPxktKCftARunBRDINwsXYHf1LMw1Z/ZNpMH/gQ4GLW5t0UikzMcnX6hMjQtsdbMsKJFtND4oJW4Yt4icEROwwbg5zUTg3szyXryJAC7/QYMzKaPOmamfKvxbM+vwP5VhGVG7XGOP4KAyXfsNIV1ZujwGim9BS8oJNl/oqDGUW7TtbOtwj2DZrkPpkyJKKXHDv1I42ghEsVCaZFRiXFfATFvMq/qRi/TBjcku5gvGLykn7TUDt6CI18fKPYKF+lzKxgCHgjLqPzv5LAdqZ3TKtonNvTH7A+0lCcsBrh3jWbAvMXZZomLLUTRIMFxKTm6SMdyXE/QKObkhWK7TbWb6XQP+Gx3Mvlw54DIX172nKCHr33cVIpoyPFE9+QYaivJ3xU31SCqqHpVlaTnBxvY+RgnimZsIuCFo4jHnnw1y7h2w6/0oJcuDFzqmGIL7KldzdcHW3Y17FlR2FEluDM/POsZswOFppOXQQIWj5BRfLhHCv8urIn6MrAPiXW+yG4Ll+p51OFcF0sYVA1gHS4VPFXITTK3CjJUKIzSbt+TD6AzerzBWuCx/tZySBQUHsy4jANtaQ5mJ4KclBHyzsITKyDgNVvMGGmvfyMZcdbyCsYTr2zvjqW4MEFTcKLxNOv3vBDlrjAbYgJHTTATcEMwEMBa3/YEjZZQCEMesxj5Br1IXRKHc0Bq4zwgVWJ4sqkpOYcSzBBjPYEA512HGri08HkGfx9DO7/87ELjXEe/R4xBgV/6gAdvlnttdcHgFYzbu4MfzC330lETVfWSE+gqdIK1KTrUDxWajFcPxSmHf3grLmC7MT9DE863SDcHEvtMAZXZ/rYMwzNqK44GiXxTaZuFB57ZhqKTDc/1nduPegpqZ7I3ywvOIVB7jQr1httR/liVcIUh1HxU6QcQMOWnXkHHDWHB51GkmAv7Q0UwA1y4uReIS4Jid+bVFWp2/2oyC/6jww67KlIYRxPAVH+7qKufx7xEQdv7Q0Xs4dn+GR3Fts17yBjRYeU4jeD2tnmKJFfYRWvH+dwICdyeU8SIbIiAl4HIkG2hh+bFh1aesiln+lygA+yqNZVTEAkzSpdpTCnsJdbshOI9e5EYh9gSuhWgr78fAdX2j8KbVcNKvzUtqQbDsX98sXBbPVbihCDrYYGSzcVebgWs0WG3kSkBR0cGANIUNL2ENOa6JpxuCM+ntOPAv3ggMdYdwuHoMhjCaku5LgymoeRlH4MIQcENwYR3qzXEEpiDgS4MK1OSOsmllDxANllB+bjJitxuy3f6ql5XeFvHfa0JA44UXiBb3RLbCwT2CAaTVQdw+/LHCobvcck72PgJulWXH/52Orq9J5eX8/DoRYLyUHljbDA03BD1Qq3PCzK5wrLXmZSTcHWfEjS9c9y7dGGN5PLxSBDQuuALCnZRcETkJuSHoh537/Kdcv8dwvO1n7amOwHsEZAS4OYrLokw+m9PmewRqKLMiCoa73b5RpBcA5bdbSn9XRu4+w6Va5Xqy+LK2f6zQHjHulS1PVJn2HW8YBvYYqp6UUz4w4oEmZPhB/6s9EuVlIIEv7zt8p/9+L76AMBrCVunMyvS5eXQsCW2cgu19HRh5ln0Wr7+LEJMO/T7rTVNTJNnEEAgwAKSBrJUZoAzwUSQerLFfKQyPpUae/1T4mY41jAH3srcVepTMZJZsKHXYZ6gtrDIYDAwlXy4atXZUGQYnmICXeyUCIachbJXOfQrfKrSvRh1NBEqjT/6tcOmvRjHemNx4vmJpI5PDcHS+ydKARungCTpmtjdHUgxEqBy79oATjADZdQ5Q/J/iusNiiKhzlBK2GUpGDB5ezBTvJ5+R2qxr/mOAZslfU8k55lG/9GKrdLCDusYqY47JjTGyGMUxzSTwxWJMKxltYggqZenLhqtUcqt5MOVTAUinLEbZQJg8o4oHRgD3kdkZQzj2wSFmIpYTo2cGlekd6IsBdb6MhrAdwo++hdb4ahRj7jKXBgGyeT90TMlNtyUB6clbmFdVKA2/SUpIaZReAbMGhsBmF7whlhu1hAxjLlnmfIcGep73Gs+HsA3LAfVdafIBr5CusMtjmIMp75/Y3CO4N0fiLcqqM2pm+/vIEvPirrFBxv5Bw3joP5toNTf2PFG+wZlY/HD72biEyP9WcQwe1ufITZhIacVNP8VjOOCFYYMfBgAD8kpHIOXhP6/74s2+eBnB49B/6v1N//O2hoGuOPYmwAY8KN/5sI7y5m2h/dzkMtUQqfg+SG0YxLYgaaehED9wJB0j32UoCiyro+DJMphjcAxWcx3IuHtDIPkZyFAfKCgd9ELg0UEowGsdSTkUh4HgBaI1bhf83ukokngwuFh/U1fwRBTiAcAbJe18s47SG6S8DCq7ihI8HMXZ2j5XxKeKpz7eykNdLDdQbBSYI7RV/5GdwQqlqyqKpw7yNdqveGsLvEJ9MQ7jwqPA5nXB76xIstdim9qlMoad9UFIUzw4YcgZW+x3LemBhjrij4076lvD0OR1pXMMwZ/iPwtT4hmdPIgdyJ4BhOtmgIaIGFcLLManTwEYJD+1BgPuXJrBdT5IKo/SoqAoeF4f578q7gYmChkUuIwQsrHfYJcF4ZEMns4Z/BCeT86TOPK2ibY0Zn/KxbIM/OJyRukYFS61sRFai6uyb0OSqQrbgjSG35PYRssC/r1fjVoIk9Dnqot+Xpv+bBVgCPZObYXO5TWwcKfz6/QlpaSDaxWVQVSsV53NbIxiNngpvtoLUFkjlAkXMFdk0pA1n3GQ5wcSRI90oKCBVDadxyiMIEakrZyUy3kelCe0RWHp0V6wpZ1dRFnej9Cupyt/Z7x40L6fdRDW0tB7HGuxbddn+wMNz6mdqeP/EpgUx11HfYtFYwj+F7lZuBjzJRhpkOACw6o0SCwubewpL0pEfFIuxTGgictdbf3tpBuloAglwsjwRSPyzKXAK2civsiJvMk1VVxQNoW0DTKjcPuv+UuetsLDj+NNM2vYlDrCRPUYXuZhtYqFv7jIR2VLGYfiVB9YLv2FpSpsC7KB31TjtgQmNu62MAj/sfbfs5Odhww4BmebDLR8QGLJk2GIBeiggwbc1A4ObFQeJeVIShoSJvz08GIAI2veJquh1DZLo8yREYmJeA0Y1NT+mLerLeZlJIMS878QH1xkyrFx2TAsyvNccRDLFmZkcA/nSmsvU5S0DvW0rQ/bg8o9ihKVsD8SNtazNCZgC93cBtv83t2mmtm1sI5+XOASPnChDslBw2CkAR/L4O6FzlXeZ7EDC+xSFIPWOiRFZvXk9eXpNmOnuIqTtoIE155yqo/NzdwAHs32Lf5dA52NUttMpP3sMVgbLMxZkZ+764JsCsGCKyDsJcAHLFGapDCKxwiwb8IyAwNNXs7pN1MwnW5KY7BFMOu/QUOvtq2FCdhBW3gEtzXp9xSGwG7CsAYnYQBXxx862pfdGHzcNx9mdgronI5g4H/J/4wana98DEIGoxkHdsJLgz9jEd6gWzI85EGWo/WjeDIDVndelAFFSoquONqHvG91QFyBMGUkH0ffIE0Gj8IZgZXN3vmVANpCmUSqD/4835BvEtI2lkNtbA1TyuNxWDr1mZxsWibPgoxrk+qjf6uxzeTByzmofDJwWVr7dC1M6GOwHBqjbXlm/d9saaCGMatDZnV57JKBw04sA/Kg0AaTKQLRRsz+XA57opDNQcJP9D8fjIoKu9yvFU9HhU1EhVaWWcsUQqedBE+MEkejQ/Q/XLKL/G0nn4H/qp23k/v7BAwKsiIXBhLZUEzaSRybT0YMEJY8fYMUOQxnK0eIUnP58VMdScF1nrcFrMyNb9eBwc2NH33YyCNeoQ8VD5EelheKb/dPyLDBTzW2khGcwRcjfNB/jBjjEo+mi9bChLHawLZLgCXj/UtHHWhqEPxXSexMb94pHSKdJFrtx7iARfIkFBcURXHJgJtwSkOZflYYrqIoZBlinoJlO+tQ7VkNE/HGG7Yl2Ko4qS6WgNR15+6qNZ038x8kfsNtPu/mTJNeg+RGJTkC6T+Kbh4Bs+JBcSg7xgLCvc4VP3kgIfUCftTWVTARXwwM+DL2NqV7m9Z2XpXhLnJt++IG8oRuwM3mpidmq3cRExSeuw+DUihkX4HlTNgbiOf6e7H4rYEJhpUN12R4AXAL8qVBD8rqENbbbxRuutnVI5InXTACGmfsOaUN4rWbqvp8aVAJ8pfKx3ViJ0dgVQQypcyXVavWmTP3PYIcjda5OgcXjasBXIFwcgRWQUDjiysWbEz3XaVYpW5jiiHAAnGph7WfUwsBdQ7LAtbCbJA5OQJrIMA+VH55do06Sjy5IhYu87JZiDViY4zIzTcpVOfuSUYgv0a+e3ldwPNCQOPLbuneWnAmN3T/e18abA291+cI7BABNwQ77BQXyRHYGgG/j2BrxBeqT+4kN5681sHSjmv4p3IvF2qRszklAm4ITon+jLql+NzDP+nbBzOq9aIXioAvDc64Y2UM2OyBrvp5iFsI/HcOAm4I5qB3+rI8C9F+CcvppXIJzg4BNwRn12UNgfEI3BtoQOJ/piDgewRTUDtBGS0D2BTkDkduAOPdARgANgxf6QikPB/ohPvHebcBN0Gl+x90zn3sPDi06HMTWZ28y2DOtyRU3OlUCLhHcCrkR9QrZWPm58k/FJmDW1HttufcI3gR037J0nUa6L5+eWJwabI6eerQZAp1SBaMEq9b8xvVlkZ9YX5uCBYGdGl2UiJmeZ6CxADkD6Rwnn/7AO8AAwCFvYPb0/TLA1R5+ZQw9UTytOts36aOHFzdcNo5AiwN/hRltHDnIl+deMyyvDItufkRAbyE3M1n09CUjufa05Ih5u81AipLPbxPYMwHS4bqRMa2HFEcD3aAwJ9NBjyC/8U/Flqah/tAAKXO3f+DlBYvgT2D8BIQxFRccL8V8gJU0o8Mh9Jyw0GxnLjnHD5mTPK04rnyWp0ofKNOpSEfcQ3Zi4w88lQI/Mcq9qWBIbHDUMqEInEkhY9iYhwOSi8pWdclRTYQ+wgDUuLXV8bSeHKufRkTfshYbViMmYfbI8DSwGn/CLTd+rT2lqKhcOwVWB5m4obyxTxhxremKg4D80IHVxM4ZyPxjY5EysNSARr6YMlRnSqDjMGwiA+bhtwGfaPQaYcIuEeww04xkaLioEwoWiDFofhs0r29jTl6tRVGIM/PeeNNwuKB4udvy6UOeCaPQHkwArUfLDEjpCLBC4DXYx1mkGq+JUFRpxMh4B7BiYAfUS1ud+23Dw5SYK4u8IpqrjSEJYXO22++YWNwzgdLTMGtGbxYY+63JIyXhydAwA3BCUAfU6WUGHe69PaaUlxgrTJDTyKyx5CXZ7MveQMwEY98s5H0wFPxbSNA3tEyUofTfhDwpcF++mITSaS0LAs4cnee9Txf9glfd8oFURxu/o3CkF9hWnbk+fz8vBFwQ3De/TdaeikyszdHoKjo5hHY1Yir+mCJYXHNoS8NrrP3WRawl+AfLLnO/j9qtRuCI0guP0IGgP2Axp5Au9XKk+8z9OZtl/X/54eALw3Or89cYkdgcQTcECwOqTN0BM4PAQwBu8G4ge/OT3yX2BFwBGYgwJIvLAExBA91cPvpfR1OjoAjcD0IcLUo3HruS4Pr6XRvqSPQiYAbgk5oPMERuB4E/PLhmfV1vAHotcRmSecfNjmz/turuG4I9tozHXLJEHCvv3/YpAMfj56GgC8NpuF20lIyBmzyQH6jzy0O/jsTATcEMwE8UfGutxCdSByv9twRcENwnj2IR+DewHn23S6l9j2CXXbLe6G0DGBTkBeJcOPXlA+b8BjxV+Jj7xPgDUfwY58hPYWo/7NIvHi0mVeS+YdOZiF5msLuEZwG96papVzM/HM/bMJ7CTEmRig//3mV2JLkHzpZEs2Nebkh2Bjw2uriDDvlwybtW8UxJuktyOLLkoIrD/mLSRpiKc83Ov7QgTcxSDFf/nGVtgzpZauDzDzDSRBwQ3AS2KsqxX3v+rBJvj/Aa8TtewW8WCTcMkoNUUFx2fP8JL1VWqchUHrgoTwYjBrqlCEWxhi9qWHkeU6DgBuC0+BeUytK3VBgKSZKjVufz/C4+gelsfYnvf2uQV4z1lZoXmHeR/Bq1N2XWfxNBhS+IYPSkJe4an59dXnaOgjcW4etc52DgJQHxeFICh/52avESkoV3G9TypifuEZepePuNwxDrI+9hLnfOODNR/6hE4FwbuQewb57rO2+p7W2lJevDDPbGnHezl+Ke6pyyThEI7DUNw6or2Fk9D8ZI9X1LNZnMnu4EwTu7kQOFyNDQMpyo78oK4oVSHG468zmfR82wYsIpPy46fd15DyIa3sZ7EXM+caB7U+ITdMQSQbk5eqEGQf/0Ako7ZB8abDDToki4WZP+bAJG30YEu45+CjysLjfpJz5HoKSDyw3lvrGgX/oBETPkNwQ7LTTpLAoc66gJmkpLqSpTP7C0Zr8eBAc+ZICVz584wAGUQ5OOWeGb3zjQHGpbMxbkq8UF3j6zz4Q8KXBPvrhJFJExcXgBIqKzvKBZYltTPo3Dm7huehf9wguunurGsds7d84qILqcjO5Ibjcvq1qmbwAZv90FaFUSHnyJUdv3lJ5j9s/Ar402H8fuYSOwOoIuCFYHWKvwBHYPwJuCPbfRy6hI7A6Am4IVofYK3AE9o+AG4L995FL6AisjsDZGQLtYD9cHZWVK1iiDUvwWLmZzn5jBOaMibMyBGroc2HL3W3nTtykQ1sm0QXhMKn9XqgTgcnjavR9BBqEKCJvzhn9zjuV5QEXiPvgebcdb8JJt6iS0EXKx0M3DxR+25XnXOLVBh7yeaSDp/Ha9/73NkP5F8UBOVThax14Wv7BlF703ycO4aZ0DD23a3OnJsT9F3YXJ7d139fBA2TczGXx+judxGfyuLrz8uVLBgKPofJkWFEpFY/gDJZ3OniajDIfjmmA8lLHK4XhabXIk7jPdF6sV2mBYt6fFX5scZcQqj20/xOFVQNhTRzE+w/J8rnC/GnCS4B51TYM4RbTf1V4NHYVx5Og6NNHOq8aAzWNEa+qcaV8vGz2O4V3qpYGCKmDQcIdZqNfOaVyVMhrt9Ig0zkN5394LZbCPsKTqMnXx6M3TfJ8GuXszbdwIm0yL6mG9So40PZY+UXeNbhW3w7hpnQmTKhLZ+h/Jln0Y0kaO64OVYZgAQm5n92eSc/Z8cJLFBAw+ugL5RnlQvcx60hDhiE5OopOi45tom219a6FAy5s+81C0xq1z1Jr9e0QbkMG9mGE68GSsE0YV5sZAgBhWdEmWxIYYO30gxrFmtjyHaVfQARtC0/69bVlZRzA/yK9gT5MF0gbwg1DwRguTYIkhXSFXR4DeaZS1bgy5vfsZK1QINTMdmycdBFgDQ5S1YPb/HtkcqOQN/V2dUDMtkwQ2zj14x60jTYOeTyL4CBZmYXAioECXtSPC/tKR6CZ7TE2s0PJgaLhTdKfyM3G2kkmhRrcJF+bOg2F+IE56bRpjXFaO66CzKsbAtViSk5ndlGfsWAzpXN/IHYQmy4AahuR5GcAmcXV6arExz2oH++FTdWk1IrDQPB+QeQpES8MZUAM0WwcJAP12BWfoFCKAzsoN7Zz2nPLbeav5MJYsa8UnnyMsrMJ9uFM1qOLx7prcEu8VQZFhwzf8EfxGDTaxFhZc3O2dlwFubYwBKGigZ++NRJGorSsMJYA/ZMAThuR+o+rnWY4y7hGGDucvQ4Iw9OWlbg+i09+WyvqtJNm4SA5Kc9gbs+qGAR2tW+oeYH2wAY+KDKX0LjM3Nd+sjdI+VESjCeXmI3e6gTDwJ5SbrQsfZVQdVXhVqjcjPsT8QALIxSUN0DxWrcixfyTsMsY1o6rUGQLQ4BAXWTegrn0pXzkCYO0nSjAmPlRoobSK75z1ohlrJNylkEWpYcZKE/QOYrSNaOzyWYDvWSAqKshX4s3ishgG6K5ONgMm7yVWCHy5UZ0bnusHfTN8wwbi68J8araimLGshMr1UWdS/YtstbiRt6cgjfaM27yvO3zOdgZr9pxFfLfs1JrhQKCS4+wL3WgxQU3dYIMKB43UdzUllXekqIfFM8sxJ1Zo25YUv5Qt0IGIO1JiqY4Bi9xfTNYp4KrXC3V4BDy5AwlH7IhY3JfF2iPVQGefe22fI0ww/GHRsJ7BTej20oOXsiifRsrqMLtSJhbeTtlLeTPoyZhlzPQ+ahxtbohiMIxIMyi5/KGWVgRfQMGj4IB26A4iIlPg7iRYfs/eAztS3B06EGy9g0I2kAbh2gyDj1YMciRr4T/qPbEOl6I3RIfSUlLlQyUpzoH36mTRsaq7jS2qTTG+nA7qNyjWEMJ16PKYz1LYJfzrh1XoczdvOSK56xNHxf4c7dVqdPzrHT8kREReDcxk4V5GTqDGXpLQsa2wuMehsEgeZ7poHPahDGsGdxL4NCuJ+1fSLbSB1Oq2hPbxUYed6nhEdFmlCEpguKf6z97OXhctJm8nDMuTHF0Glx79gMSKR/pHF3Ls5R3pZMxuCGCjb3BSUptY0wshV3efDBuy52nN86nGALb2KOiBtEoHXxFl4Yl0n8GxzuFYYYkQecAgGX9kv89xGB80pEO36PBId6s65hBt6QG6JKBgcsgN2Xq+rhHMIYVgk7GQbJgLFHKZFAVR18goyld+1bvMe0B79kfSZFMjAlkTGMrxjGRfKVzw1J/1yfVNwU3BMN7Oah8MoT876BFsCvwrh1XoWj10kCNojMgs3Y/Ko7Bwg5oWBcrZD+AOBtc5DdCMB4yQqnZHCTkPvuhzn2jfFa3Tt+TyjI44AmYuKQQg4lnGujELYnNLT5Igiy0DxyszcyGtKNE4Flc27Yyz8UBg4l8yPJAB/zwCMCPODaochrTHgx6bpBpU0MJVEcYI7GC1GbF5/1vY4srG8gEceWAy2x5vpCw0U81bpIRDDFkGNiD/uMRoB99+05LYUeVOSWM88iu86qHjroKbxUvIFHyVQeD6mCGHL1ZOAcD1cmgYaDkl8k6WW6BQ2flHQmSCcP7Xx3poTXFBQVQXJogrLjSUBIeIAtXdhSCefA+FKJIjxViQBcj8du8b2uEl1yLYZfXJ75V40r5uMeFJdqduzmDHZ8zy9bMmnOagAdxCi+CttXSFjjUyhLyaRA1cNN/FN08Ama7g+JQdowFFDb9bk/DL56HkZWz/0uFDRmXYjqXjzBpyKX/c7DLxQHTMePqcBYeAS0USMwyLAXC7EHcOZPagdXGGuOeV9MecZBMKDAuNHtD73TQNpYf6VuLysNsj2eHi0+bWT5B3yuNJeUHOsdYrHm3HfXtipbALm+Q+FWPK+VNHsG9nMnOzxlo7BWMUpwdtwnFmOLl7A4HDSj2Axp7Am3clSdvaykvG6tQKe025QJ/F8IuR2bSuDqXpcFBgOFG4RHYJlLe+LM6j22Y5N1cEg6tTmODmSsX9LPTBATmjKuzWRpMwMWLOAKOQA8CMhzFpQHruXYxbgDBFXVyBByBM0ZAesz+DPsHRWKPgM23fP2WZ7yIjbm8QX7uCFwpAr1XEf4P0YdSNueNjF4AAAAASUVORK5CYII=", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\1.0 u \\left(c^{2} drho_{dx} - dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\1.0 \\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ K⋅(P - Pₜ) ⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢ 1.0⋅u⋅⎝c ⋅drho_dx - dP_dx⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ dw_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎣1.0⋅(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" + "⎡ K⋅(P - Pₜ) ⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2⎞ ⎥\n", + "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dv}{dx}⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dw}{dx}⋅u ⎥\n", + "⎢ ⎥\n", + "⎣(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u)⎦" ] }, - "execution_count": 6, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" } @@ -219,36 +262,54 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 70, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(2.0 c^{2} drho_{dx} + c du_{dx} \\rho - 1.0 dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{0.5 \\left(- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\right)}{c - u}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(- \\frac{dP}{dx} + 2 \\frac{d\\rho}{dx} c^{2} + \\frac{du}{dx} c \\rho\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 c \\rho \\left(c - u\\right)}\\\\\\frac{dv}{dx}\\\\\\frac{dw}{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 \\left(c - u\\right)}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 ⎞⎤\n", - "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝2.0⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", - "⎢──────────────────────────────────────────────────────────⎥\n", - "⎢ 2 ⎥\n", - "⎢ 2⋅c ⋅(c - u) ⎥\n", - "⎢ ⎥\n", - "⎢ K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", - "⎢ ──────────────────────────────────────── ⎥\n", - "⎢ 2⋅c⋅ρ⋅(c - u) ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx ⎥\n", - "⎢ ⎥\n", - "⎢ dw_dx ⎥\n", - "⎢ ⎥\n", - "⎢ 0.5⋅(-K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx)) ⎥\n", - "⎢ ─────────────────────────────────────────────── ⎥\n", - "⎣ c - u ⎦" + "⎡ ⎛ 2 \n", + "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝-\\frac{dP}{dx} + 2⋅\\frac{d\\rho}{dx}⋅c + \\frac{du}{dx}\n", + "⎢─────────────────────────────────────────────────────────────────────────────\n", + "⎢ 2 \n", + "⎢ 2⋅c ⋅(c - u) \n", + "⎢ \n", + "⎢ K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", + "⎢ ──────────────────────────────────────────────────────── \n", + "⎢ 2⋅c⋅ρ⋅(c - u) \n", + "⎢ \n", + "⎢ \\frac{dv}{dx} \n", + "⎢ \n", + "⎢ \\frac{dw}{dx} \n", + "⎢ \n", + "⎢ -K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", + "⎢ ───────────────────────────────────────────────────────── \n", + "⎣ 2⋅(c - u) \n", + "\n", + " ⎞⎤\n", + "⋅c⋅ρ⎠⎥\n", + "─────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, - "execution_count": 7, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -260,22 +321,32 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(2.0*std::pow(c, 2)*drho_dx + c*du_dx*rho - 1.0*dP_dx))/(std::pow(c, 2)*(c - u));\n", + "dQ_dx[0] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(2*std::pow(c, 2)*drho_dx + c*du_dx*rho - dP_dx))/(std::pow(c, 2)*(c - u));\n", "dQ_dx[1] = (1.0/2.0)*(K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u));\n", "dQ_dx[2] = dv_dx;\n", "dQ_dx[3] = dw_dx;\n", - "dQ_dx[4] = 0.5*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n" + "dQ_dx[4] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n" ] } ], "source": [ + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "\n", + "L_outflow_x1_upper = Matrix([K*(p-p_t), L[1], L[2], L[3], L[4]])\n", + "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" ] }, @@ -288,37 +359,37 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 74, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQIAAACXCAYAAAD+k1UUAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAfr0lEQVR4Ae2dS64et7HHPx1oHMgSkPlVgCzAklbg4x04EnDncnbgQCN7dmDvwPb8AlK8A8crsKwFXMDJPIDlgywgzv/HQzLs/tjd7OfXjyqgm+9iscgqFtns7nuff/75h6fT6SddOfjuiy+++FMu4VJxouexrr9fqv4p6p2iDVPgmKIthmM9HGgbE0r7WZQ+zlGrtHtXScJX8v+5dn2dpF/cK4I/ExEorq0Dyoy2DIId8WFQ+61QIwfaxtWXKlWX7+8CpnuJRfAHDbDOmVZ5EMS/6noi/21AVOIqP8QAv+j6g64vS+qkgPJ9IueZ3L8Q3jqoHSiCW7nf9GnL1HwQPvrzW13MFm8UZrAYdHCgi29Kp38/1nXtUf1NbpCXB/I/1PVW11+UN8QrOA58vUXjSnk/VW1fy71XpAiUEcIZLO91PdXF4PlA8cUNUF6WHzdynRbyOIn7WP5WBeTz/iD3ifLvBtQe2v+R3CI+zskH4f5NtPxJbpwldsPoGRvSxTef/k7u2dhV3PciDXn6H/mLxkBJU4SraFwpX1QE6dKgsQ6I1MUgYbZ43ZixIcFX+EBuHGTy03DCJcsPLImSfA0UrDaaNgUrqYTIWfigvkhnrRI6LI840MU3pTNhAk0yQ/8/0IVATgl9x9WpSBFMQCEbju8yeH5U3LUYBjPa4Lny9DKh25CtJc23ibZ1tT+QPBcfMGH/LjpQzgblHOjiW5eCZTkGPLpzprkPGFeLKQIYwrKiDmFJEBhWTz+pUewNhHxn6TuIoG3Pu9oxMx/gP2tYg34c6OIbioIxnJsESXLpcpssBvIMhaJxFZDfD565XDGhZLZj46QJYFbnIFU9mM2/eCTMbG9bOsBnm8bxbcS8YwP0J4Ur1ovCbK6+lJubcWkbbayUUbgOk/BBNDALwSsGCvyifkzYG10OlIc+G9oej2W8IzoQNKxJ+AbdbKxdZFIo4Zvoq0OjohA+eE46bWpSFHV8fcKl48rhnF0RqJYg5DkhCA1j4DUBmymN+wO+g9h0gaFhI5L8DKCgceWdFV6pburHemFTNQq14hCoT+Q2ncfg+S4DogtG80E0UE944uMESnHwDkiV7Zj23GEbeRddKCv2ldxTDE87m2AfjETdu7ivu4RvEbfKIOhA4K8LKB6FRpsYK3NuzpaOK0fXEorAVdRxa1sjoSRyy4qAEkZz8CluRCqMqR1nuJBxDtd3OHsdAIqnTitxbRqf/GGtKG8jjOKD6KQ8g7k+q6IQ2NW+peYJ2gOaUSAaEBKUJxZWgLfyoBjYU0qVVkifxVVdRXzLVB6UO4+8UWoBENDvFTf3Y/DSceXoWkIR1AUjMAQ3WAvBpE/Tgp88bpCGiOCKmcz8CFFF6BXfOGsojY79QRduKaC5m4SZTbaQllNADIgKfbVKEcQSWsbyIcyw0VrxdEBfqkTHtsehFU+oj2fpnDcJ/HFpBTesqrqgBGXZyCvVM3XfQmop3+rNctaoaGqyBOv5Y3gk7wKe0nHl8s+uCNQoHj1SWa4DQ5wzUx1F/W4I3t+oo7SYz3v2TLe0fD1fqFsuAkV7oqApjsFLXNsM1ijgKlcKJXxweVKEog/aoDGarxO0J1SBkv5M+HopAeUPfHwTEHmXeKARn6d9sr69q85Zl5X+Uz1nfPN5Uwd6G2lNM2b8g3hXw9NrXF3VCs8VhJFBo6d1QCxQYfRdVLy/lw/GV8B3BvFxEFcyLB9A89cfwWHinkRr24CgDbSxCwbzoYVXKAfoy/F/aHtCO2h7Dm9Ib3KpNy5Vkkwv5Ie/QyeNBFWZdyDf4OeHvoYh7afoUN6lDSsdV67M/bTkjH7Wpuk6KVSF9s51ekjHpePPlIiYHSyN2zRz8Ct90bWkp7Eu8JiHbjCIHjYNOcJbpxdlWDK4B/NB+FlfA/V64v6F6GLw0RchDzwvbo/KMfBe6WINjB/Bfa0rgvJ85gPueLn81Fk/as5MWhEglUOwuKae7YWyCAJPQuY2vpEnWC9Fk9SEvAv04ZaOK1fmKi1Z6H/k81FRBWiQrt90sbsbQWHM5fdy6XgH8jNYmJFe3sU03hmMzxpSwcsMUgHhRukwgy4JlcEiGhi4T3UFYeJdjroSgD6nDPF0wGA++HoRrqhQFUdfQGNQEvWj3sXtES76kj7n3Dp9Ql3gjgKteJQAm7q83MbYIS9+eETek8LggUbSHfg4JpI/yx946VPndVQf/dWXbxCFEjypfGw/4RwozyS8y+AuHVeuaLFFIILpDCBou78qjsHCDqhbF8tlliYuDC7yB4AwXjJCqNkcxOWcfVfnMquEuuX9L6gsgwOcCD4zEQBjeaeBTlwS2Nz61tNC++BDaDNCUJkdFQ4AP3mc1AVj+YDChD5oeaQLfMxs8I841qUp9GkP/Gevpq480r4NY4M66KMwW3K+IuQLY4snG9AEYDG0bda6TDPeivkmmuEhiiwoNtqIfKDwmmAq3tXxl44rV67opaN6DUuHxUiE/JKDYZYmq10MGgZK+pissa618kF0/er7x82ACiPEWBgomjNQPC84nb3tqngE6alcFOghQG2dhHcps4SzaFwpH8tVLLN7VymCFfvRmiWz5oqbkCWNWZe2lcLq+KBBxOzOlVoDKAAUHEtF0iIozGwZrQOFGbQBmMU6zemQeeuu581UvEvZ0XdcLfauQUpkb78YxtKDjy6kg6Y3njUV8G2hTW5ZVULbGvkgmm5FO5cDhRH0INDPiVQc7WTmA17oSpUGg5Y8CAT9+yPhI4DaPAnvUl4JJzzsNa4ofz9FsnI/azX2CrLm5sppz5GHGTzEylkjH6CJdT0bhu/x60Lgfw6DXS5PTFgyuL0B71cwHhxi0xA4jEVw11y32T2Wdx6VcwaNq03sEYRWavCg7Th62rb5ErKv1vVCwA56OjMW07sXPqQNVpuwCNgfOJoiSNkwyi/eoWiLx5Xyxz2CTSmCUVyywsYB40CFA6kiuKqkWMA4YBw4JAdMERyy263RxoEqB0wRVPmxi5BMPvZR2E/ZHIhu1rkGC3NgS08NFmbNNqvz676zl3MUzyM9dvNxeWTJoys26MJx3vp3CpTUH8bWo/Jf6eKQy5AnKv0JthKOA6YIdjQQJDwINif6eJxXAcVxBBgrgWfMFSFTmINKPNYrOuFYQVwLTFQPx9c5+uzOGNSqsOAMHLClwQxMvSBKBJrnyE3AGYzc4znejZhyKTGqHpSJ6LmWi2IzWIADZhEswOS0CmY6hRE8Z5orjCnM81zO13Mgh7MFCCWzM7P32eyu+CZAeCqzfS0jy4KXtTiClEm/UpTJ0itqinqcMpiYrl6NOFJmswgW7G0JKS9PhbfReEPzleLCrMepSWZzzud/o8ut5+UWzdQ+H8olCz6duqJFQJwu6mXZ0EfhZOsgEpxypqiHo8Z7OUUKa1YNZhEs1D0SEIScTbwgiMz8H+lis+6NLqwCBDKdmREojuyeFM8sSzhYC6yjAy6yEO/yEsgA5W91fapyIRkaeA2Y+KmgqB7VCb1sUDZZMNBEHoMFOHB/gTqsijsO8AJOnHW98IX38E8KM/sxOztQOLylF4QUwXcfZZX7QJl4iefeXW53Jy7kTaKj163bVbbzeLavmyVMF/A9iPox6dJ6UBjhGxK5etqUWi6/xY3ggCmCEczrWRRBrQtNioKXbtJdcgQlnfHTd/SZKetCD27qaALwpfib8p0k3CiooWZ5Zz3Cz1kBLAEsIM48pFZQoIs2tvEr5DN3Ag5cTYDDUJRxAOGqmLoSADfryiWevYFoISiMIIav+JyUlgoF5aJ1IT/pZ/iJB5Tm8MubKhaXNuWttB7lc1aJXCyKnBKALGhusximJP3wuK4Oz4HlGIDg8pUl1uhczIo3vnoGfd1kr1sELqvKsdfA2jon1OxBgCuCryc8UkTw2qyGWK6vp089noa6RVOvEkXYpCTqeS08kgP3R5a34oUc0OBnRs9ujCkNoY6CrXDYH0itgJPisQRQAnzhh38G1JUH6dQRlwA+Tz2fskwLPetByb2FApVDKVY+zqKwU1ZyK+2flmLDlnLALIKUG+vxR0EJJEkoOGOAFfGr/Hzz70ypKB5lwhKjYhUobm3glkCi0z0pyRAXFFomyaLm4AAWwXtd/6fr33NUYDgHcYDDRPEJAhgkNOlmYSNS5cP853juja4u87sRz5wJoqvNOkI5hC9kz0mG4T6d/l9MQPbdNwt5jv2/3k+cwYU5IEFBmCvmch+SVDYuDfqUW0lePmkWl0kroWmvZPxRDUP2T7ZHsEAXa2Bjyi8OqnfxOqeoMEe34tIzE1NUYzgSDpgiSJgxl9cG8VycNbxTccA2C6fipOExDmyYA2YRbLjz+pAuq+Ra+XnSwD8PeT7/o+Jmf6yoegw2wAFTBBvopClIlNBznJfzCddyK6cSp8BvOLbNAVsabLv/+lLvXgjqW8jy758Dpgj238dpC1kexPcX0gTzH5sDpggO0v9+WUBr7Rn9Qfq8TzNNEfTh1rbzYg3wjoKd3992P85CvSmCWdi6SqTZ/QEpBt5NQEkYHJgDPDX4nW9/cA/Mjl03HWE/e1FJca903dByKQSeKvCBFN51CB9YfaL4XDllMdg4B34f6Mci+JcPBDekmbsTDngBpzWV/QHFc6aAD5iGl5P4GzHvOLzWxf8R8Ic0eQ12xoF/hvZgERjsmAMSZl5dfuGbyMtMeHnfn5kfC4AlgwMv+PixHtzTBcVt+QUm1y67dXPAFEE3jzadQ4LM6cGiE4TKGz52gnJwCkBxZx8O2TRDjPgsB0wRZNly2MhnCL5ajzXwQn6sBvclocNy5CANN0Ww846WMLMP8E5u52ND5Vn86LHqDFbIznti3c2zx4fr7p9R1EnImN1XfXZANLq/H49qqBUezQFTBKNZuE4EEjA2BNn5rzwpWCe17tNkfKfQ4EIcMEVwIcYvUC2CFT5jvkB1w6vwyoq3IlFeBhfggO0RXIDpoUoNfIQ1HNzhhN+sf0YW/mvVxyNDNgXdfoCn4SR38GNClZ0CL5YLeOxfBmLC0mAWwdIc9/VJeBb9M7LqY7b9UC6PEvnNWJh9+evwY09Wb2dCvPb3497cn66AWQTT8bIYk4QHk33Mn5GZ1Xm0B/CZ86+F0/0rwMXcCTafqU/hoQL8bp2nCNR9S6Lc73Q9wz8QivCqDpSN/f14IJPnLmaKYG4O5/E/V3R8VCchQSijICvMgZ74XwOFEXx2/53wys+SAqHisSCC/a2u9L8HzPYhr7xO4N3jQ+XnlGE0vxUGd/xGgQ+XbNxxShGFUoRXdWD2t/3LsK64lN1gKQ6gCOhIXiqxjliK63dHfNue6zPbp2t2hCjd/ecfiigGZlkEu74pCG6UQQ7AFZWQ/GzSxZOH8qOQ4rHjHIKGuEa8wskxZ8aY/f24gXkXimZMuRfKruRhMDGQMPEMluEAwgbfI0hY3Cwsl3g2DskTAMFMZ+2gBBA+FHjl9J8vW8EfEPn8lDn5utJ6kmy9veDM4lU9TtHIxYqI1kitBuhtsxhq2S04AQcYP24SuT8BMkPRnwPMyJj2QViZvW88GuLiDO3j6DCnuQlTThezPmt+J0ByP9CVLgfcn5F9PooFAE84PnxS+uA/KgWE3m3EqzpoX0pbragLouxiG3MZLG4+DpgimI+3jZi9cGYHvdIw1+IyQOGwP+CWEl6omDnDn38QshxgYVBHusQ41fHnCg6J68CLInNWi/J9qquifBR2bZDbtlwaQpaVKeTAVWE+y3Y5DkQhggQJCzMrJjYCxdr7lS5OEFZmXIVRJiwxgtWh4MXALT9EC0eeo5JLqAlKK4ky75IcMItgSW4Pqyv3Z+TKjNqEVoKHwrj4n5FFAzN9kwWEcrC/Hzd14kLxpggWYvTQahDmoWUpp/LsRTQtH8agnqosfz+uWDNTITY85RwwRVDOq0lyatDbn5FrnBRPajF3QcWHfZBsukVOxwFTBNPxsgiTDe4iNlmmhTlgm4ULM9yqMw6skQNmEayxV2agSZbItdCy38CRZA712N+QxQSDOw6YIjjISJAisL8hH6SvhzSTpcHvfMHgDsFjZbbBAU7v5Z7jb4N6o3JqDvw+IEQR/MsHghvSzN0fB1gexHcW9tc8a1FPDvwz5LfNwsCJnbtaGnBUGTCL4I4Pdk84YIogYcbOvVgDvLVo5/l33tFDmmeKYAjXtlkmuz8gxcD7CCgJgwNzwJ4aHKfzEfbccWVeWrqBDVIILB/4KIr9DRmGHAjMIjhAZ3sBp6WV/QHFc6bA/oZ8gDHQ1USzCLo4tPF0CTuvKvM5M4C3EXF5CYmZHwuAJYMDpYW3GrEe3NMFxVW+Z+CzmrMzDpgi2FmH1psjQeZrR/UvHtWzubDyhv8QohycAlDc2YdEsoUtctMcMEWw6e6bnHj7G/LkLN0GQlME2+inYio1g7PuL/r7cR2pyqZfN64nLxJOrJJF6rNK7jhgm4U7GgmY8WrOps8KqA32d+QLjEkUQXjHILgXIMOqHMsBCRAbgFv5+3FXc/l0WclPVrrwWHo7B+xdg3b+bDIVwXHfqN8k9QnRUgI85rz2yi1JMe/EHIjvGtgewcScbUPnZ7nF/n4MLarzWg6PCdM/IGM98FFTHifi/4euJ/IPOn48Ux1OGYiuph+iKMlgKg7YHsFUnOzAI2FZ9O/HkKM6EfLcH5CfK/6xz3MrFwXgwsT1gRnrsL8j9+mIkXlNEYxkYElxCQsme9vfj5mx+XBIOvshxO/r+JXney98aRJCfJZXcQ91nf0BWXGcE0hfR36t8CBrQOUG1aE2cKKxbSmDghqknFTOoCcHbGnQk2EDszMDx0dzEgAG+buAS2EEs+3vxy6r8vFUICccKA1wVkD5nXDL5WRhqmRYLlSEMMmLUirZqGNZ0fg3ZOForENpAOlt/zrMKTZX0G7Tc8AUwfQ8zWFEUNtmXI77pkd5EZLcewHEpfkUdABu6mgChNsJvoSXfLxxmOKPSkTxKKh47LgJYSa+Tx0ce+YFKPs7coaRl4iypcEyXEe4KjO5BM7NunKJRzCjhaBwxXRXGkLWeD7Al63gV/4UEPQww6J0Iqhs02/IYp5CT3EdqtMdeZaLVZFaKmlVtKfNYkjzmn8kB8wiGMnAwuKD/34sQWEGfyo3vBDUVGXT34/JjxXxSjjYgENgEUAUEYIWzXv5x0BxHb5N0NEGKMPca9NtZSxtIAdMEQxkXJ9iGviY7tlBrTRM9GimK1yf/R8qHYsBcxpgpkSov9aVLjcQbOo4WzooX6UO5ZkcetbB0uctRKjc2UtNikP5kZa2jyiDmThwNRNeQzucA1FIQIEw6MKUbrUIlAdhR2G0LRFAuQZwyyDR2rQsCUptDbQeggazCNbXzWd/P4ZECQ2mNArBra+Jq4PyOJNf7o3PX8+yirBoa7OQUA72d+SFe8oUwcIM76oOYe7K05au8mv/+3Eb+aTZ35G7ODRDOoogaOewqzxDNcdFKcG0vx/37H7x7KyE4uzPyGdcGR3BctJNPCgC1pQ8YyayaydXWQz6cMAGcB9uWd6FOXCt+pD9b2yzcGHOW3XGgTVyAIvA4AAckGWC9scM5AtGHOKxvyGLCQZ3HDBFcJCRIEVgf0M+SF8PaaYtDYZwbbtlOK3HXpCBcaDCAVMEFXbsPsDyIH39ePcNtgaWccAUQRmfNp9LSwOOLgNmEdzxwe4JB0wRJMzYuRdroPENxp233ZrXwQFTBB0M2lFydn9AlgLvJ6AkDA7MAXtqcJzOR9hzx5dfKf4GNvjlA98rsL8hw5ADgVkEB+hsL+C0tLI/oHjOFNjfkA8wBrqaaBZBF4c2ni5h5zsGL3wzeDsRL+/7M/OzgciSwYHSwqvOWA/2N2TPlyM4pgh23ssS7tZXl9PmozR8fpSD+8CJwmcfDknLmH8fHDBFsI9+nKoV9jfkqTi5MTymCFbSYZp5Watf9NNcqj9+cn0IW9bQhiF0W5nT6VCKQAP1Wp3O+vixLvclIMVVNtAuMShEA+t4lMBFFUFX2wv4hzL7RFfjV5S66rD0y3DgaE8N+ATWd36gsga++HFbBEd0PIKuywyBXrW28k9tcEpVLp8bM9gQB46mCJ4kfYNVcNEPsUhgsE74IvHZl4cTOtfk7eSf2oI1wNMJ2mawEQ4cShFocKamN1/KHbUmnqCPocH9gWgCXLOj6ME/2kTbGkG4WEKgjFcPojN8Sn71tA4l8FB7BIFJ6lgGKh/5TP8uFJKXdJ+Lhtxpv5PimVGf62J2TWfiUfQJF2cHOE3IkgQeZNfziodHmPicLeAfCpFXPq2Rf0rnx6u/6iLPmdWlOPBO9WMVoZoXRO9XuuBBtq/mrX0Z7IeyCGCpOpOZyg1i+S+m6VU3gphaKJDnQGkIK8KCMpjUxBZuBJq9EfYknuk6A+VhU/WhLj5mgiJKlUAp/2gbiqwCwkV7PpZ78U3aCmHdAfZHWq2cbhTrzXEoRaCO/EldgfAzW/F14Utq+OxLQAwV0fZOFzN1VlGQZyRgYbzWhcKpgOoNyge3spmqtD78Q9DjqcWkEoQJa2NToLbTnmvPn03RXkLsbpcG6jAG3C+6bnXxhh3mXauJrXRmYfIw4BFC1rA8ZuSxWK/9BOVHkDDBoYGZ90ZxcWZVmCO+lxQIaKF9dWC5gmnPb9orm5iKa+VfDRH/VcSyqAPCdKaAFUdeFBOHmiKv5WcmjuE6spLwhLidMlCdW3jCU8KamGeXFoE6nkH4vVxm1be6EMhWUF4EF0AAEFCUBwKBMDB4ndCQL+dXnjr8oIjXygsNN7oIp0B979OIJfye9p/kOmsjtIW65UcYw7cNCaeKqy95tK2iaISPMIq5AoqHFx/KhVdsIrq+kItiyCmTSvm2wMS4+YlszsppI2ETaVeboLIHkep4hJiNqLAGZcB/VICCNfEbXQw+hCHV+qnQsu79WeksLVAaZ8KsNJYfb+UGQYIGFIgb4PID1HfrfMvenLD7KqGP9p48bdAIrWkekoeAa3OtIIrgjF+KgxcoXbdvIjfwBTpQ5GOgF27VjfXXZKlBV0W5jSFsTWXvr4mYiWhBUKMp6QdVEMjGKpSPgXuSi8ZHwB0ojKDcyg2Dkzxdf93B9E3NX5YBlIs4CA8F4YGmko0rNvpcu5K6niguvGWIkLFsQem5JYHPBw8q+wM+vo+DANbb+yATdwo0yn2h9FQIoa1Ch/L0ansf3KoLQPlgUeYgp8Ry+TYXt0dFwGCrD/4+HYPQpmtjBkawLhweDS7qIN/ZIzCfxqyRzmQoJoQtBQYVeHqD6kCxTWGiMuDZwa+3kXDKg940qgBtqwtOzkpIcVNvqggIs7fCsoE2n7w7pO0luLHkUOBYhCxR6n1Gv44ZWyq+TrhaJ1mjqGLAVMw3dWjJ7HlSPsphHrtB56moz44M7mvlQTkwWNhgTIEBd1L8rXfBSdxLwgkwoCp0JmmzeEUT9aWzHe1EoYUlAXQz4+KmPCCqL2ARVITG4+xqsyujvPAMZULY8VTuWGjFrTrZozjJxZKqKwGS6vwjbhdwfxetqDaC2ZdzAmHAMZjYrCsByrjBkGRmEKZmPrOFE3LFY2L/6l05DlAcvM/A7EI+njpgjocyCjpA0DB9z8DTTp3UzZrVPQGRW6ftrGxThMqG2Y5lDo8nUWRYLexluEHv80A/eb7UNcYq4AlDTplgRdGmipJQXgBlSd+hrEiHLhRtDo+ie0EnbtXLWKn3U1oJvEnHQpq2af/uFIEfYIM6S2URjrgMUJjZEaFIB+0/FPdB0uv1gcMMizmbm1GSYu45ftyLSBN8fWOEMEXn/MKJEqkoEsVBO4PbQS5PSBvg1hVoQIFSo3/O2qf64VnKt9Qfyg9yC3FD81sqUP5PdYW9FMIoCdx0LBC1C7jaRSvma0QcGEkVLzUYwpLgleLrTyRQHlGZJOUqXuFws5xcZ4pXEjceUJucNSb3jA8+jqVIsNjW1NrQJ1ghddqDAlsTvZPRsjuLYDLO3CHCrK/M2hrAjbOUH9zp0qGLnDC4BlkwXcgvmM5sT9uyID6xBmfpgeVUt6iyZZaIFC3M9md9oXgUAwebdmkNwFuzCOBCA6jjGbDRPGzIFqMZKLqiqR0TGjweN+vlNc6ODVS3R/u20KZWvin9bGnQjvmiqW9Eb91CuChBU1duimBqjvbHx+Zm+sisP4Z1laAtZ7NqjkQJ12qsgRx9IW4rdAZ6h7imCIZwbcIyfpBhebCrv2nwbaAtuzWhN91BLcTbHkELc5ZK8oJT2dFfqu4p61E7Nt+GKfmxJVy7UgQaiJz/NzAOLMYBjbmu4+aL0TKmor0pgl10ypgOtbLGgSEcsD2CIVyzMsaBnXFgVxbBzvpm0ubIhL0WQnbzP9HFWYgfbU0vLhg4DpgiOMhAkNBz0IlTjNdyeWRpYByIHLClQWTFITwcdtr1wZhD9OIMjTRFMANTV4yS5UHlQx8rptVIW5ADpggWZPYlq/LLAkgwi+CSHbHSuk0RrLRjZiALa6D+SvUM1RjKLXLAFMEWe20Yzdn9AVkKvBKMkjA4MAfsqcFxOh9hz70MxDcVbmCDXz7wYRVevw7/hODrSrlyFDHYCQfMIthJR7Y1wws4WSr7A4rnTAGvDIe3AJ/Kz+vDr3XxUVP8IU1eg71yILUI+FZ/vZ18e8+eOde5sqGw+o+3Gl94knkzEO8DXcz8nCuI309QWviGANaDe7qguC19N0BkG+Q4oH7kO5CPc2nEoQiyX2XxBex1Us+IrToaAGffKmxqi/J+5vOjHJwCULjy7b6msha/eg40fjEKyu/99pu9sLf6LlyIQAk9n2XDEsBieKSLWST9Y5OCBnvkwH8AsQtWbfB2CTYAAAAASUVORK5CYII=", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}1.0 \\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡1.0⋅(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", - "⎢ ⎥\n", - "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎛ 2⎞ ⎥\n", - "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", - "⎢ ───────────────────────── ⎥\n", - "⎣ Lₓ ⎦" + "⎡(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u)⎤\n", + "⎢ ⎥\n", + "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2⎞ ⎥\n", + "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", + "⎢ ───────────────────────── ⎥\n", + "⎣ Lₓ ⎦" ] }, - "execution_count": 9, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -346,66 +417,66 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 75, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- 1.0 c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right) + 2 c \\eta_{2} \\left(P - P_{t}\\right) \\left(c + u\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - 1.0 dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{0.5 \\left(L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)\\right)}{L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(\\frac{dP}{dx} - \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right) - 2 c \\eta_{2} \\left(P - P_{t}\\right) \\left(c + u\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(\\frac{dP}{dx} - \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 2 ⎛ 2 ⎞ \n", - "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅u⋅⎝M - 1⎠⋅(u - uₜ) + 2⋅c⋅η₂⋅(P -\n", + "⎡ 2 ⎛ 2 ⎞ \n", + "⎢Lₓ⋅u⋅(\\frac{dP}{dx} - \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) - c ⋅η₅⋅ρ⋅u⋅⎝M - 1⎠⋅(u - uₜ\n", "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", + "⎢ 2 \n", + "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", "⎢ \n", - "⎢ 2 ⎛ 2 ⎞ \n", - "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", - "⎢ ────────────────────────────────────────────────────────── \n", - "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", + "⎢ 2 ⎛ 2 \n", + "⎢ Lₓ⋅(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) - c ⋅η₅⋅ρ⋅⎝M -\n", + "⎢ ───────────────────────────────────────────────────────────────\n", + "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", "⎢ \n", - "⎢ c⋅η₃⋅(v - vₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ c⋅η₃⋅(v - vₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", "⎢ \n", - "⎢ c⋅η₄⋅(w - wₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ c⋅η₄⋅(w - wₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", "⎢ \n", - "⎢ ⎛ 2 ⎛ 2 ⎞ ⎞\n", - "⎢ 0.5⋅⎝Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ)⎠\n", - "⎢ ─────────────────────────────────────────────────────────────────\n", - "⎣ Lₓ⋅(c + u) \n", + "⎢ 2 ⎛ 2 \n", + "⎢ Lₓ⋅(\\frac{dP}{dx} - \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) - c ⋅η₅⋅ρ⋅⎝M -\n", + "⎢ ──────────────────────────────────────────────────────────────\n", + "⎣ 2⋅Lₓ⋅(c + u) \n", "\n", - " ⎤\n", - " Pₜ)⋅(c + u)⎥\n", - "────────────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎦" + " ⎤\n", + ") - 2⋅c⋅η₂⋅(P - Pₜ)⋅(c + u)⎥\n", + "───────────────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞ ⎥\n", + " 1⎠⋅(u - uₜ) ⎥\n", + "──────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞ ⎥\n", + " 1⎠⋅(u - uₜ) ⎥\n", + "──────────── ⎥\n", + " ⎦" ] }, - "execution_count": 10, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -417,31 +488,38 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-1.0*c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t) + 2*c*eta_2*(P - P_t)*(c + u))/(L_x*std::pow(c, 2)*u*(c + u));\n", - "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - 1.0*dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", + "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t) - 2*c*eta_2*(P - P_t)*(c + u))/(L_x*std::pow(c, 2)*u*(c + u));\n", + "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", "dQ_dx[2] = c*eta_3*(v - v_t)/(L_x*u);\n", "dQ_dx[3] = c*eta_4*(w - w_t)/(L_x*u);\n", - "dQ_dx[4] = 0.5*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n" + "dQ_dx[4] = (1.0/2.0)*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n" ] } ], "source": [ + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "\n", + "L_inflow_x1_lower = Matrix([L[0],\n", + " eta_2*(c/Lx)*(p-p_t),\n", + " eta_3*(c/Lx)*(v-v_t),\n", + " eta_4*(c/Lx)*(w-w_t),\n", + " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 11424a72791c83749272c51e094c23e0ab0752e6 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 22 Aug 2023 17:10:29 -0400 Subject: [PATCH 37/64] working prototype --- src/NSCBC/channel.cpp | 140 ++++++--- src/NSCBC/dQ_dx.ipynb | 656 +++++++++++++++++++++++++++++++++-------- src/hydro_system.hpp | 50 ++++ tests/NSCBC_Channel.in | 14 +- 4 files changed, 676 insertions(+), 184 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index db3c61343..c607ab1fd 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -27,6 +27,7 @@ #include "AMReX_iMultiFab.H" #include "EOS.hpp" +#include "HydroState.hpp" #include "RadhydroSimulation.hpp" #include "channel.hpp" #include "hydro_system.hpp" @@ -57,17 +58,16 @@ template <> struct Physics_Traits { constexpr Real Tgas0 = 300; // K constexpr Real nH0 = 1.0; // cm^-3 -constexpr Real P0 = nH0 * Tgas0 * C::k_B; // erg cm^-3 constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 // global variables needed for Dirichlet boundary condition namespace { -AMREX_GPU_MANAGED Real u_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real w_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -}; // namespace +AMREX_GPU_MANAGED Real u_inflow = 1.0e4; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { @@ -77,13 +77,14 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: amrex::GpuArray prob_hi = grid_elem.prob_hi_; const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; + amrex::Real const u_inflow = ::u_inflow; amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { Real const rho = rho0; Real const xmom = 0; Real const ymom = 0; Real const zmom = 0; - Real const Eint = (quokka::EOS_Traits::gamma - 1.) * P0; + Real const Eint = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); state_cc(i, j, k, HydroSystem::density_index) = rho; @@ -152,14 +153,22 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< // see SymPy notebook for derivation quokka::valarray dQ_dx{}; - dQ_dx[0] = - 0.5 * - (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * u * ((M * M) - 1) * (u - u_t) - 2 * c * eta_2 * (P - P_t) * (c + u)) / - (L_x * (c * c) * u * (c + u)); - dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * c * rho * (c + u)); - dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); - dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); - dQ_dx[4] = 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * (c + u)); + if (u != 0.) { + dQ_dx[0] = 0.5 * + (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * u * ((M * M) - 1) * (u - u_t) - + 2 * c * eta_2 * (P - P_t) * (c + u)) / + (L_x * (c * c) * u * (c + u)); + dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * c * rho * (c + u)); + dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); + dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); + dQ_dx[4] = 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * (c + u)); + } else { // u == 0 + dQ_dx[0] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * std::pow(c, 3)); + dQ_dx[1] = 0.5 * (L_x * c * (c * du_dx * rho - dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * (c * c) * rho); + dQ_dx[2] = 0; + dQ_dx[3] = 0; + dQ_dx[4] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * c); + } return dQ_dx; } @@ -172,12 +181,13 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda { auto [i, j, k] = iv.dim3(); amrex::Box const &box = geom.Domain(); - const Real Lx = box.length(0); + const Real Lx = 1.0; const auto &domain_lo = box.loVect3d(); const auto &domain_hi = box.hiVect3d(); const int ilo = domain_lo[0]; + const int ihi = domain_hi[0]; + const Real dx = geom.CellSize(0); - constexpr Real gamma = quokka::EOS_Traits::gamma; const Real P_inflow = ::P_inflow; const Real u_inflow = ::u_inflow; const Real v_inflow = ::v_inflow; @@ -185,42 +195,73 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda if (i < ilo) { // x1 lower boundary -- subsonic inflow - const Real dx = geom.CellSize(0); - // read in primitive vars - const Real rho_ip1 = consVar(ilo + 1, j, k, HydroSystem::density_index); - const Real x1mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x1Momentum_index); - const Real x2mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x2Momentum_index); - const Real x3mom_ip1 = consVar(ilo + 1, j, k, HydroSystem::x3Momentum_index); - const Real E_ip1 = consVar(ilo + 1, j, k, HydroSystem::energy_index); - const Real Eint_ip1 = E_ip1 - 0.5 * (x1mom_ip1 * x1mom_ip1 + x2mom_ip1 * x2mom_ip1 + x3mom_ip1 * x3mom_ip1) / rho_ip1; + // compute one-sided dQ/dx from the data + quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ilo, j, k); + quokka::valarray const Q_ip1 = HydroSystem::ComputePrimVars(consVar, ilo + 1, j, k); + quokka::valarray const Q_ip2 = HydroSystem::ComputePrimVars(consVar, ilo + 2, j, k); + quokka::valarray const dQ_dx_data = (-3. * Q_i + 4. * Q_ip1 - Q_ip2) / (2. * dx); + + // compute dQ/dx with modified characteristics + quokka::valarray const dQ_dx = dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, P_inflow, u_inflow, v_inflow, w_inflow, Lx); + + // compute centered ghost values + quokka::valarray const Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; + quokka::valarray const Q_im2 = -2.0 * Q_ip1 - 3.0 * Q_i + 6.0 * Q_im1 + 6.0 * dx * dQ_dx; + quokka::valarray const Q_im3 = 3.0 * Q_ip1 + 10.0 * Q_i - 18.0 * Q_im1 + 6.0 * Q_im2 - 12.0 * dx * dQ_dx; + quokka::valarray const Q_im4 = -2.0 * Q_ip1 - 13.0 * Q_i + 24.0 * Q_im1 - 12.0 * Q_im2 + 4.0 * Q_im3 + 12.0 * dx * dQ_dx; + + // set cell values + quokka::valarray consCell{}; + if (i == ilo - 1) { + consCell = HydroSystem::ComputeConsVars(Q_im1); + } else if (i == ilo - 2) { + consCell = HydroSystem::ComputeConsVars(Q_im2); + } else if (i == ilo - 3) { + consCell = HydroSystem::ComputeConsVars(Q_im3); + } else if (i == ilo - 4) { + consCell = HydroSystem::ComputeConsVars(Q_im4); + } + consVar(i, j, k, HydroSystem::density_index) = consCell[0]; + consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; + consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; + consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; + consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; + + } else if (i > ihi) { + // x1 upper boundary -- subsonic outflow // compute one-sided dQ/dx from the data - quokka::valarray Q_i{}; - quokka::valarray Q_ip1{rho_ip1, x1mom_ip1 / rho_ip1, x2mom_ip1 / rho_ip1, x3mom_ip1 / rho_ip1, Eint_ip1 / (gamma - 1.)}; - quokka::valarray Q_ip2{}; - quokka::valarray dQ_dx_data = -3. * Q_i + 4. * Q_ip1 - Q_ip2 / (2. * dx); + quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ihi, j, k); + quokka::valarray const Q_im1 = HydroSystem::ComputePrimVars(consVar, ihi - 1, j, k); + quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); + quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); // compute dQ/dx with modified characteristics - quokka::valarray dQ_dx = dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, P_inflow, u_inflow, v_inflow, w_inflow, Lx); + quokka::valarray const dQ_dx = dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, P_inflow, Lx); // compute centered ghost values - quokka::valarray Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; - - // convert to conserved vars - Real const rho = Q_im1[0]; - Real const xmom = rho * Q_im1[1]; - Real const ymom = rho * Q_im1[2]; - Real const zmom = rho * Q_im1[3]; - Real const Eint = (gamma - 1.) * Q_im1[4]; - Real const Egas = Eint + 0.5 * (xmom * xmom + ymom * ymom + zmom * zmom) / rho; - - consVar(i, j, k, HydroSystem::density_index) = rho; - consVar(i, j, k, HydroSystem::x1Momentum_index) = xmom; - consVar(i, j, k, HydroSystem::x2Momentum_index) = ymom; - consVar(i, j, k, HydroSystem::x3Momentum_index) = zmom; - consVar(i, j, k, HydroSystem::energy_index) = Egas; - consVar(i, j, k, HydroSystem::internalEnergy_index) = Eint; + quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; + quokka::valarray const Q_ip2 = -2.0 * Q_im1 - 3.0 * Q_i + 6.0 * Q_ip1 - 6.0 * dx * dQ_dx; + quokka::valarray const Q_ip3 = 3.0 * Q_im1 + 10.0 * Q_i - 18.0 * Q_ip1 + 6.0 * Q_ip2 + 12.0 * dx * dQ_dx; + quokka::valarray const Q_ip4 = -2.0 * Q_im1 - 13.0 * Q_i + 24.0 * Q_ip1 - 12.0 * Q_ip2 + 4.0 * Q_ip3 - 12.0 * dx * dQ_dx; + + // set cell values + quokka::valarray consCell{}; + if (i == ihi + 1) { + consCell = HydroSystem::ComputeConsVars(Q_ip1); + } else if (i == ihi + 2) { + consCell = HydroSystem::ComputeConsVars(Q_ip2); + } else if (i == ihi + 3) { + consCell = HydroSystem::ComputeConsVars(Q_ip3); + } else if (i == ihi + 4) { + consCell = HydroSystem::ComputeConsVars(Q_ip4); + } + consVar(i, j, k, HydroSystem::density_index) = consCell[0]; + consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; + consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; + consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; + consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; } } @@ -230,8 +271,8 @@ auto problem_main() -> int constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; amrex::Vector BCs_cc(ncomp_cc); for (int n = 0; n < ncomp_cc; ++n) { - BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // Dirichlet - BCs_cc[n].setHi(0, amrex::BCType::foextrap); // extrapolate + BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // NSCBC inflow + BCs_cc[n].setHi(0, amrex::BCType::ext_dir); // NSCBC outflow if constexpr (AMREX_SPACEDIM >= 2) { BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic @@ -244,6 +285,9 @@ auto problem_main() -> int RadhydroSimulation sim(BCs_cc); + const Real Eint0 = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); + ::P_inflow = quokka::EOS::ComputePressure(rho0, Eint0); + // Set initial conditions sim.setInitialConditions(); diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index 6945533b9..c5039cab4 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -43,7 +43,7 @@ "⎣0 c ⋅ρ 0 0 u⎦" ] }, - "execution_count": 39, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -64,7 +64,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -86,7 +86,7 @@ "⎣ 0 c⋅ρ 0 0 1⎦" ] }, - "execution_count": 45, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -97,13 +97,13 @@ "rho = Symbol('rho')\n", "lambda_list = [eval for (eval, n, es) in F.left_eigenvects()]\n", "Sinv_list = [[ev for ev in es] for (v, n, es) in F.left_eigenvects()]\n", - "Sinv = Matrix([S_list[1][0], S_list[0][2], S_list[0][0], S_list[0][1], S_list[2][0]])\n", + "Sinv = Matrix([Sinv_list[1][0], Sinv_list[0][2], Sinv_list[0][0], Sinv_list[0][1], Sinv_list[2][0]])\n", "Sinv" ] }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -124,7 +124,7 @@ "⎣ 0 0 0 0 c + u⎦" ] }, - "execution_count": 57, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -137,7 +137,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -163,7 +163,7 @@ "⎣ 1/2 0 0 0 1/2 ⎦" ] }, - "execution_count": 58, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -176,7 +176,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -198,7 +198,7 @@ "⎣(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) ⎦" ] }, - "execution_count": 73, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -220,22 +220,22 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### x1 Upper Outflow" + "### x1 Upper Outflow (simplified)" ] }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 7, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}0\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ K⋅(P - Pₜ) ⎤\n", + "⎡ 0 ⎤\n", "⎢ ⎥\n", "⎢ ⎛ 2⎞ ⎥\n", "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", @@ -247,7 +247,7 @@ "⎣(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u)⎦" ] }, - "execution_count": 68, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } @@ -256,60 +256,41 @@ "K = Symbol('K')\n", "p = Symbol('P')\n", "p_t = Symbol('P_t')\n", - "L_outflow_x1_upper = Matrix([K*(p-p_t), L[1], L[2], L[3], L[4]])\n", + "L_outflow_x1_upper = Matrix([0, L[1], L[2], L[3], L[4]])\n", "L_outflow_x1_upper" ] }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(- \\frac{dP}{dx} + 2 \\frac{d\\rho}{dx} c^{2} + \\frac{du}{dx} c \\rho\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 c \\rho \\left(c - u\\right)}\\\\\\frac{dv}{dx}\\\\\\frac{dw}{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 \\left(c - u\\right)}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}- \\frac{\\frac{dP}{dx}}{2 c^{2}} + \\frac{d\\rho}{dx} + \\frac{\\frac{du}{dx} \\rho}{2 c}\\\\\\frac{\\frac{dP}{dx}}{2 c \\rho} + \\frac{\\frac{du}{dx}}{2}\\\\\\frac{dv}{dx}\\\\\\frac{dw}{dx}\\\\\\frac{\\frac{dP}{dx}}{2} + \\frac{\\frac{du}{dx} c \\rho}{2}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 \n", - "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝-\\frac{dP}{dx} + 2⋅\\frac{d\\rho}{dx}⋅c + \\frac{du}{dx}\n", - "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅c ⋅(c - u) \n", - "⎢ \n", - "⎢ K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", - "⎢ ──────────────────────────────────────────────────────── \n", - "⎢ 2⋅c⋅ρ⋅(c - u) \n", - "⎢ \n", - "⎢ \\frac{dv}{dx} \n", - "⎢ \n", - "⎢ \\frac{dw}{dx} \n", - "⎢ \n", - "⎢ -K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", - "⎢ ───────────────────────────────────────────────────────── \n", - "⎣ 2⋅(c - u) \n", - "\n", - " ⎞⎤\n", - "⋅c⋅ρ⎠⎥\n", - "─────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎦" + "⎡ \\frac{dP}{dx} \\frac{du}{dx}⋅ρ⎤\n", + "⎢- ───────────── + \\frac{d\\rho}{dx} + ───────────────⎥\n", + "⎢ 2 2⋅c ⎥\n", + "⎢ 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dP}{dx} \\frac{du}{dx} ⎥\n", + "⎢ ───────────── + ───────────── ⎥\n", + "⎢ 2⋅c⋅ρ 2 ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dv}{dx} ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dw}{dx} ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dP}{dx} \\frac{du}{dx}⋅c⋅ρ ⎥\n", + "⎢ ───────────── + ───────────────── ⎥\n", + "⎣ 2 2 ⎦" ] }, - "execution_count": 70, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -321,7 +302,259 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = drho_dx + (1.0/2.0)*du_dx*rho/c - 1.0/2.0*dP_dx/std::pow(c, 2);\n", + "dQ_dx[1] = (1.0/2.0)*du_dx + (1.0/2.0)*dP_dx/(c*rho);\n", + "dQ_dx[2] = dv_dx;\n", + "dQ_dx[3] = dw_dx;\n", + "dQ_dx[4] = (1.0/2.0)*c*du_dx*rho + (1.0/2.0)*dP_dx;\n" + ] + } + ], + "source": [ + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "\n", + "L_outflow_x1_upper = Matrix([0, L[1], L[2], L[3], L[4]])\n", + "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", + "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### x1 Lower Inflow (simplified)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOQAAAB9CAYAAACyPs8GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAON0lEQVR4Ae2cXZLdtBaFT1J5poBU3ffbzCAkIyDMIIQREGYQiqfkjYIZBEYAZAaBEUAyg2YAt+qGLibQrOXWdsluyZZ1rCOpe6nKLVs/W1uftCVZx607L168eHA4HN7iCrnXL1++/CIUoTAREIHtBGBP58h1FsqJuDt3vYgfcP/17HrlxU9ukTkodJKo8Yc96rCHjMYxSb2NBFb6xPcQN7ez11bEPbuB/wqC/vKeo7dI9xyRTJuUPiqofsQZ6vIEFwejze4Gcdhcd2VYJBDtV+gzP85zIoxBT/jHN0g+rzpkZsb78LM68WoBJ0yAOvyG6wGuZ7iugVpSBel35UA9UN5PuLjy+AXPHEXlVgiscUM8J4/PcT12on6Df+HuP4T/Ma4/cX2DtBbuovM8yMnuV3e8d8hPIGhxxkM8K/A7/E/zVG0zF+rDd+jP4Cc1SEkOkH0JXb6APy5j2qTWllZr3Fz8O/jX+i7C3qA2D3H9F/dJfSCl9pCV1K+Q7hnkcYU6eYdMKYPr3+h7ZYqARtOwTqxbqivCAQ3ij+Kputz6dGvcEM/VB93PV961v2x/TjY0jD3d1n518Dd1UhR5isptWtqlCK2dxtWJdWOjpLhSHLi0+gt67DZKp1TmBqRZ47Y20NkG5f09WWT0q3SDhHC+My0uafesTAVZrNvTtXILc2DH4TuO3DYCa9xosAe03buI2CEecbEZNJItKTipX5mke3aT4FPp1c6CSnM5938njyP9nwsgXLJ9PJRjy45PIPEtniezOZ5/RfhX8EMzEOvGOk7y4HnuduEAHTgqkxUbjLxYPpdW3+EaHNIcUx8Tc7QPPdjh+Xs0uVFvboBUGZxTuEG/uYsaLOSROeNZp5jBzuVteU7tV4PMLQbJl97o+6MDxZdjVmzYkIDP9GxIG4FwW9R9izJZPmdz7liOxoUwvh/wJ47Yhw78wZYNs+aO5gAdWA4Hh09xP3Rs+GRH5w96x9TnStqRf6EXB40P4Q+7vvCpOzcrPjpS9ObsruwUbqNs5LH3R+M7xCGcAwvrxL5SchMttV8Nem0xSI7W74dc4T+sML/s8XcHuQQcR/xwtn1CHfg/nDQOAHNdGbY0AjK9vUs4MUHvKA7Qk/nZqeazDA2Tu4CchQ471IdijnLQgZ2VgxhXHOb4EwEN9DEuf/Cw+CI+ykriFijcBtlHkMHBxRwN5Q3CvrGAQn5qvxqK32KQHyPH0FnmiqNSnAnZmSfGh/DFURTxhPw7LvqpjqNZyLC4GWLhoYGADTPRb1YgDSJFj2M52Iwzzt5OD+rnD2bH1mcQCyYsj7/FcTY2PkNcwh+uMuYd1gatKCuUs2e7mpqp3Cy9+cPqDDrFVkaW7pp/JDuTl9qvhvRbDNIKCPk0AP4YehGKjIW59Nd+F4qlXwq3suGzY7NDjB0eYexEDFsa0aOGhnypLoXDkMYXCP2oG3Ucl1U71MeK4GD5HPI2GSPSG8dfTJDzGU4Xled036Vdr4oa/iZx89LbLfWN6mqJIn4Wu5msTf3q7izz0uN7RLLjTBzgM4zX2JkmCU7/wJFw/tMBl14H6LrUMKwD67jmsjkssGJno36hASO3PlYP1j0k1+JjPssdl9Beoi9xT77Du68XXuw2kxt5PnBK5dSfWXPZ+SxS+9WQ556fc+WeDWDLlTEpKn2Bi88XY6B3g7iTvmugaOo4NzwuW4ZGgT7c3OGnaXN9OZKldLJsDpDP9y+6eTnj+y30YiegIViaTfVBPnaAb3HxHYn3NKCfcY0OaZ67B74bcinIMod7r1zOLJOOjDh2cF57z34QmeSMiSVe4sY0rANd0mSxI7urUq/+pvarIfVdP+fKPTv5o0gaLg85ok4cKsjGTpl1JvmOfJg0mutEDyHTjJSfCM6NkUWyk1kaPsdcNgdXLjs5jWxwCKMxsJObsX6OML8O/v0BcUwbrA/iaIDcAeVnWGwTlsX0o2EhnMbIzTd+i8zOwrS8p0ymPeCZcqgj4wfnwrgZ9TXuUzi5nMd7KI/ttZUbC+ZgdED+sf58Djmk2YVdQHZqvxqybpkhOcqyQa45VIaN9D0vRHJkpmMFv0MYYZ7ScRPiJ6cLf99jhyYU6sfOyHqEHEdTboOvuWM5cOCiftTlPi7K40hv+vG9xXdb6kP+fJefG7FvQFzRWDzbyGYP/j5r6Wxm4U6wP5vGNtR8fUvdJ3ODzmTIAcUGGNaRO6pL/xCxF7t5/VP71VU+flyO6xLX2eXl5WHpQppzXA+W0vQYx7qzbqm6t8oBev2N67HVA/fPcb2x57mPuEtc19odYa9wvZ2nv8nPqO8u7HxGZItrtV8hzTNcyHqZ/umcM3uOIimzyHyUaP2ZsxDrluqa44DRn7MdL5v9WBfOvJwZ+Lsh40aHZ84e42yJ53EZjXCO6qvLvFFY5zeOzV7sfBpb+9U2g4TifC/hP1/6jecr0N29qwvrNP5MslaJFjlApwvozWtweKbBmWE9ZSDCWM+/hwRX71e+8bLzMA07JtvXPrJg8I12qPMu7HxIkEmGm/oV89/zhSTecy3Pd0mOvjfB8X0jZ9ZvkQN14nsfN3be8x7Xl7jOrdPB5w4z3wuHd0d3j8fxAwBu7tDdmhnyqrrDpuSx7JyowcvqV5v+QdlKQyPS+rOPvjA5tX3XGbnj6M8UyWrdFA5+hVEnzpAP4d82g/QxHHUPdhzwkvsV0o//oJxlkEdpq8wiIAITAr5B3p3E6EEERKAqARlkVfwqXASmBGSQUx56EoGqBGSQVfGrcBGYEpBBTnnoSQSqEsj5HbKqwip8SgA7dPaFEb/bnf/HxjSxnponoBmy+SaKKwhj5AcAf8DnD9r8cJofAvBTubN4LsW0TEAG2XLrLOgGo+OPyfxGdTz2A/f8BIzP8/8YWZCkqJYIyCBbao1tuvAzOft3KT8nv0F9DOPkFzdynRGQQXbWYJ66/HCc36vOnX0GyHi5zgjIIDtrMKqbOPuN/+3fYRVvrcoyyD6b3oyN74wxpyVrjEzD4TLIhhvnSNV4PIhcZwRokB84nc3vrAq3Ut3Qu6OBsNmTv0vK9UHgP6amZkgj0ZHvft6gxqFlqYXZ5k5HNZOqNMh/HAbzRaUPAvwH4rOAqjZD6h+MA3AaDfqf6aUZ0kj05/MYFTtuw9d+OAfUm0X9ON03TkAG2XgDxdSDwfFQrvfwn1ga3HO5ygOtvrIw+X0R0MflfbXXXFs7APoRIriJQ/8zGOa7eUI990FABtlHOwW1hOFdICLnxLygPAXWJ6Ala/02kAYiMBKQQY4odCMC9QnIIOu3gTQQgZGADHJEoRsRqE9ABlm/DaSBCIwEZJAjCt2IQH0CNEh+88it86UPlutrKg1E4OYS4GeOw89XNMgzXDyDxb6BxK2cCIjACQnwdIfhHCQtWU9IXUWJwBoBGeQaIcWLwAkJ6NO5E8IuURQ+n9NBySXAVpKpGbIS+D2KhTHqoOQ9QDYkQwbZUGNsUQXGqIOStwDrJK0MspOGCqipg5IDUHoPkkH224LcKg/9dmxn6TBerjMCMsjOGozqYrlqB1ktaa/flZfoNBong2y0YVbUMmPjPyjHXIrRxvIqvBIBGWQl8CcoVgclnwDy3kXQID9wQs3fuwzJ259A6N3RSrHZUwclG5H2/clByf84fc1vX/1briHeIW2pGlqWWpht7txyWl1UX+eydtFMy0rqoORlPl3G6h2yy2YblNZByf22XVRzGWQUTdsRWLbqoOS2myhLO31cnoWtmUw6KLmZpthHERnkPhyrSHGbOzoouQr9MoVqyVqGq6SKQBYBGWQWNmUSgTIEZJBluEqqCGQRkEFmYVMmEShDQAZZhqukikAWARlkFjZlEoEyBGiQOii5DFtJFYFUAjooOZWU0onACQjwdAcdlHwC0CpCBDYR0DvkJlxKLAJlCejTubJ8i0vH53M6KLk45dMVoBnydKx3LwnGqIOSd6daV6AMsi7/7NJhjDooOZteuxllkO22zZpmOih5jVCH8TLIDhvNqcyt8tBhV3aWDuPlOiMgg+yswagulqt2kNWS9nb63FIaxTVGQAbZWIMkqmPGZqfPhbKlGG0on8IqEpBBVoRfuGgdlFwYcAnxMsgSVMvLDL07Wqk2e+qgZCPSkS+D7KixTFW8Q9pSNbQstTDb3LFs8jsgIIPsoJEiKuqg5AiYnoNlkP22ng5K7rftoprLIKNo2o7AslUHJbfdRFna6ePyLGzNZNJByc00xT6KyCD34VhFitvc0UHJVeiXKVRL1jJcJVUEsgjIILOwKZMIlCEggyzDVVJFIIuADDILmzKJQBkCMsgyXCVVBLIIyCCzsCmTCJQhIIMsw1VSRSCLgAwyC5syiUAZAjLIMlwlVQSyCMggs7ApkwiUIaBP58pwPZlUfD6ng5JPRrt8QZohyzMuVgKMUQclF6NbR7AMsg73o0uFMeqg5KMptidABtlem6RqpIOSU0l1lE4G2VFjzVTlQcihw67sLB3Gy3VGQAbZWYNRXSxX7SCrJe3t9LmlNIprjIAMsrEGSVTHjM1OnwtlSzHaUD6FVSQgg6wIv3DROii5MOAS4mWQJaiWlxl6d7RSbfbUQclGpCNfBtlRY5mqeIe0pWpoWWphtrlj2eR3QEAG2UEjRVTUQckRMD0HyyD7bT0dlNxv20U1l0FG0bQdgWWrDkpuu4mytNPH5VnYmsmkg5KbaYp9FJFB7sOxihS3uaODkqvQL1OolqxluEqqCGQRkEFmYVMmEShDQAZZhqukikAWARlkFjZlEoEyBGSQZbhKqghkEfB3Wc+xazcX8hph/EdYOREQgR0IwJ7OIeYsJooGyW8eY1vn+h4yRk7hIpBHwA4lC+b+F3J+JEpFeW7cAAAAAElFTkSuQmCC", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\0\\\\0\\\\0\\\\0\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎣ 0 ⎦" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eta_2 = Symbol('eta_2')\n", + "eta_3 = Symbol('eta_3')\n", + "eta_4 = Symbol('eta_4')\n", + "eta_5 = Symbol('eta_5')\n", + "Lx = Symbol('L_x')\n", + "M = Symbol('M')\n", + "u_t = Symbol('u_t')\n", + "v = Symbol('v')\n", + "v_t = Symbol('v_t')\n", + "w = Symbol('w')\n", + "w_t = Symbol('w_t')\n", + "\n", + "#L_inflow_x1_lower = Matrix([L[0],\n", + "# eta_2*(c/Lx)*(p-p_t),\n", + "# eta_3*(c/Lx)*(v-v_t),\n", + "# eta_4*(c/Lx)*(w-w_t),\n", + "# eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + "\n", + "L_inflow_x1_lower = Matrix([L[0], 0, 0, 0, 0])\n", + "L_inflow_x1_lower" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{- c du_{dx} \\rho + dP_{dx}}{2 c^{2}}\\\\\\frac{du_{dx}}{2} - \\frac{dP_{dx}}{2 c \\rho}\\\\0\\\\0\\\\- \\frac{c du_{dx} \\rho}{2} + \\frac{dP_{dx}}{2}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡-c⋅du_dx⋅ρ + dP_dx ⎤\n", + "⎢────────────────── ⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ du_dx dP_dx ⎥\n", + "⎢ ───── - ───── ⎥\n", + "⎢ 2 2⋅c⋅ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅du_dx⋅ρ dP_dx⎥\n", + "⎢- ───────── + ─────⎥\n", + "⎣ 2 2 ⎦" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", + "dQ_dx_inflow_x1_lower" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = (1.0/2.0)*(-c*du_dx*rho + dP_dx)/std::pow(c, 2);\n", + "dQ_dx[1] = (1.0/2.0)*du_dx - 1.0/2.0*dP_dx/(c*rho);\n", + "dQ_dx[2] = 0;\n", + "dQ_dx[3] = 0;\n", + "dQ_dx[4] = -1.0/2.0*c*du_dx*rho + (1.0/2.0)*dP_dx;\n" + ] + } + ], + "source": [ + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "\n", + "#L_inflow_x1_lower = Matrix([L[0],\n", + "# eta_2*(c/Lx)*(p-p_t),\n", + "# eta_3*(c/Lx)*(v-v_t),\n", + "# eta_4*(c/Lx)*(w-w_t),\n", + "# eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + "\n", + "L_inflow_x1_lower = Matrix([L[0], 0, 0, 0, 0])\n", + "\n", + "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", + "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### x1 Upper Outflow (with relaxation term)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOQAAAB9CAYAAACyPs8GAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAbgElEQVR4Ae2dXZLdttGGj1RznVLkqtzb2YEtrSD2DmJrBZF3oJSu5DtVsoNYK5CjHSRegRXvIPnuUxVlKhvw9z4YNATygCRIguSZme4qHpD4bbzoRgMgiPPg1atXn59Op3/oKtG777777utSgPs5Ao7AfASkT/9Uqs9KKRX24GEW8Gfdf9u7/pKF+20DBAR6sTEaZH1rsrjnGPxJDdXXs3fWeFd2I/cvAupf2bPfNkZA+L5QlmB833H+TFj8XhdG4F6R6vx9v8Lyw+v3/OQKyfO9JgGDwjzVFcCR+3dd1/LvDNv1/NcY51rue11/lN/PcgdJ4eT5idyiEMqfsr/S9WXMJJQd7x/JfazLyqLcQ6gFn8rj77o+1/Vc15mAHlKxCyn0QTaH/K3Aue89d2gW4fCLbv4l97eldpI/yvVM1x90P6kcioNC/Sj3i1J+uZ/iUPbPpbjy+5vCnuj6VPeT5eb5tr5vwafyYO3id0fXpTU2c/NT/Z8rDSPUzhxybj53Mr5AYZELSuP6m8eb3wjeSe7XumqVgnnD5Hxc+VnZb/Mys3vyQLlpwMOoIZ/UB2ycIgL5oo6DcoOADRmxRokkhI90ITwMt4rKmiKf33yjNDVDMyub4WqJbEHok1Lgjn5N+IyYgA2djJMQuHIUzhBgKHqSkCSl0D2W65ncP57FnvBQGoa3tVMB5pAnpRmaj4ZwRRmyoCTfg1ryCTbf6KrpsPao26FluIU8hx/lSwoh5WB4+K3c2coYs0Z4k3JHvyEHy1OMq/Lhi/DJBaShzBv6t+ST+lpH05DF25mVW8is3ST0CBoUlELPrHwyTK21cKTtE4swc+aP/aEyw1TeW2FpmbfOHS4rWTuKHQMZtuKTF+WGeztGb2lOrpDdhrOe+j8SvD/pwhqx0sryPO/NligD86MP3WKKTyaUT1VOvtCBwP5NfkstdLGwFZ6t+QQbmxuvYOtuJHWF7LajCRvvHu19IcrBsPWlriUK+VjpalZjbV7WeeeptLNIfNMB/KhrzkIJljcN0ycKnMWn8uXVBvkPjTLwn8PrBHu3O9gVstt+zNNYRU0LDAiSLoawX8rlZXat4HZznn6iM1idt/hD+Sffd06zMxijmk/xgqKB2ZAyUkhthzXI0F0K8EWd2JoSGrOOnblRDLYhJFZyLjEkG7UAKpuOACou6NwEHf+7gM8a5QUbMHISAq6QH8XA5o9nSiFBxI9ennnkqHJ9zC7dkW5qjjTWGaSMLuCmik9hxF5VOrHQkXGvyzqdfjWwkGMWtB//Tj9f3enazascq5gnCc7QsNF2lWAl5yywkB/7Y8foGYEq+6wzGEt0QFgVn6oHCsaCGAr8Wu7Y3Jvh9RDmB1Tx2CLvtUJKULB2b3ThBismPzaO/yTXFnVOureFHQWdXuiZ3p53kzU9+1vFJc8zUnqUnHKD9dAzw2VWVFPZZ4kO8FjBJ/Wa6mRQWl7rOAkB31y+gxhIoHl1MWclcweuti1CdUbR/ir310MlKYzOiA6ouIl/KN1d81f9fXP5zo2Khb1vViBZRwkc+4DDKKCHO0P/MM/s+d/bx4f3tuY7VlzCyGsUFjrCsHjHoo8sCqv3U2SAeXdneB+xAJP0iulIZi+lbFfI/VqCF/7MGe8LUVe+sWU49lbuda/ihN+3UUMPgvPHe72ocw7Hdj4IpC4WglgUuqhFmy1qrTqyclpUODAgTG7Ham7Bx23L0xVyxxaLAnjnlXEKUuFw7zEYwsiHrEPIuL8jcAACrpAHgO5FOgJDCFzkkFVDGhYCbFP3EO/N/FUeGwNYCYRsJbTqAKubJP57nxCQvHAgVXF+vBaHi7OQqihb2L6QO7XDY23d8/T27SPbvVgN/aBr6DT3PJ3f308EkJfSRwir0bgohVQlg6WSu0nvM4IWHyCzs8SIl9W8Iyu9zLY47t5TBCQXrA6zC4nV4qZ0UQqpmrHn84h3dXQA75si65ndaQSkjGxo4NUNRqQZXcwcUhVj7vZErn0G1aySUxlFcPNoKChz2KqvEBQPS8omderwg56rLbzi0qB0RJy980HP93pfpzDo0BS2CsdKITM2wmGqcx0zAdvHuuhsmY6Yfwxe7WA8aPdVpzzkXFyMQoop9jUevo0qCkCYx+ZAjd0rDYrLvJdTx2fNLaKQfCWXOatb6R7QU9gqnHeaf5ZrJ76fdegKo03+T27rE9+RV+aT7NVtouyXNGRlZXWWMCt+UxKoWDjmjyjXLIAVP++hl/CFlT20/kuYztOAgS7asSlNYatwm+u/HSgYS4a1bMqbykVG6Iy/0dWELsJCZoAeZiHEA8rIsCb0sPH5JLd2exfpGObOUmRaUWnWKjPZXAIh9FytaQrbKfxoW2iLE9+RWYasTUZ3F6GQqgyALhJmpVtNUggajF4UhbTelnkgw+haog5LX9VMCVwtD3c13hS21okOzflDuMAZsqBrcONb18uwkBJeekOGASxE/EPPnV5CzyxW1Lxgf6p4sy2L0swi8cNw9D8xEeW9lx+NyPyNunTePSqsuDgjfxSYvLCe5IciosivdQVSHJ458oJT15gjBgusZ8r9p55zrILAyY+562Nd4En6wQ3YipvXBfx4Wb20Q1DyyyDVYRLbAqeDCqv8wJFwOtshhS1kWe1Fnswhm8wjr6qLLUd8KUaoKIL0RlcSMvmhqBwKVbMChTJ80LUJiQcamfkZvL6jELlYRHhDWQa/aiduTopL49LRMM8Mw1m5NvfLFeKZ/CmPL+Ipy772QJG4AlYKo+4IDcQCgeVJGcTr4KdwqwvKGsqLfij5rf5LQfFfiy1YBVIaw87awPzBiQ4V2eS0htDuIbDtj8kt5a1WeBTyV5E/c6vYjUD8FCMzJDDGLD1+tQw+VtzauZrlP8elsd71GoVhRrJoNZkpPcqDoqBoOb/c85+OWL+TXBqHoQxE3dhkYK8zyCN1XLpHCCFGEnme+BG3T9SlYw1JF9MigMVhtsJRbl4R0JHUtoui70PiqQrbAjeG39NYR4sC/qMnvjfCJLS5yqKdl9JvLCEKuZTy93Ql4QaoWoGnMfoKHfiKDfWjHkrCGeIUftL5NUqPdUJBOrzIv9oqZvkj1AxNcoUimLrmPTC8/kCAiB4cRQmktOk+eoWOS/59JSFdnudJcUJd5JY+XwqKH/MsOaTlW8x+OaW4o36RD1OEPG4QSoX360gcOqyOtc8T6r4W216ymz/qmci7n8aeW2BSlFsrYK6LQv4vJjK3Kg8BEHoGuTQMApiEVH4oAH75EE6Pg0ReoTH7MWI5a07iprPgNPLAbz//mc8hrzyN8qWe1DcNmeQXhF6uCa0pZ57U7onTVzzy43prkaJ7Vj7+KsfwthFLL1l4ZOhW2x6l9MlP5ZUUDj4og9FAqcNI6QduzuqmfM6wLaQFv6WdTAtMTG7XKOa/rV5XdrPCpdfrr5BSURpoKVAr2PmYNDYojZqU5WPovLuRvBAk6loS9hI2qeCYZ0eZYyACz5wz4RfjDtXFFCQpdoz/UvkwdCMdC0wdBVecF/KDGE5joWi3cK+w/vBZQdvQSN3GsD0p3eeRoxL2Z8zGclpjArbQ9Y2z7vfhuuQhNQKVBCfmxzAsgCQQnkcgYlDRofGtYsUISzxVroFkbicbhZsF6/hPPPQFNc2VlR+LWOBhdGb9LCC6QwLHgpgt+oAfVsfqYG6eFfHZrRJ4k/tIz6wYM9ckH9oC4U2CK3+UkXk11oxenrjcP9Flgq7bXWkOtjBm7TfZ4apuW2ECdtAaC3mTg35bKGQHRFWcxqRRTUlZ+SsJUWJCNwy1SLMFIZBncxfxhEWoBjHWAYFOCic/LAr1fa8LYsXWlIJ4XGPCkjouEmeE8Jg1y1dOqQtpEqk88mf/bL6YQ90YpvfbxtqE9FhgC6c845PFpWRpibg1qTzkoxrbjB+s/knpU0eThfVvt8KENgbLKRnv81N8bjFkRRDeiCEqzDs5Gpk5H0v49MImWLodJASFxRKuJhWzkpQfrwfgBf5s5RMBfL2gLBSbulIvdn1QNxTE6soigRENxVB+TFjgg1XbPoEpr02+1JUUTfd5XcDahpf9MrC8eSeEJenEUV7BAssfIjwMe+WfK20I3OmnGlvxCM7gGyy5nulMWFEdm7tuhQmy3sFWz4tptUIKBBQob3xjpuRnYR1XediiC1ayWeWsEOWfhNr8lrhz6kqdVIa96igWpzgda2eR5D8oWAobrYvCUXIus35kSzkILP4nubRZIN0j1Mla6pnhcZ42xtzWiTyVZObMT3FtzlzFlOJviQkym3fEVTwNRXo4FHCA/w8qsyigB/Bya4uMgt1XOLOQWImT4qB0/42VfCY3V8BRhY9phhzKTWUPRdrbfytMlC+KToeG7Dah1RayCRc3mdDL8L5xjUA0ZOdWZ4VVYfMCCzvMk8EUxWM3T1Aaucw7GXqHuWO81+Ny/JVH89ENDDWiLTChg2NhrFkndFF/tqOKMZ96K3fXRYVGDe7Z3DMEJKesSaSFvKXVVz6skrPK/eCShqzU5w+6XnLj5AhcMgKZEuXD/dUsX5RCqpKYflY/WRF1cgQuEgHJJyu8bM8cXHxbyjgKiYazasVc43BSJRmuMtdhIcLJEbhEBJiTn63+rmCUuXdYOWZRB21nQQXPZpNT5bWYpIz5O7LF+XhCR2ALBCSfs167VPCA8UEHv7+oIWsF4x7FEbjTCLhC3unm9crdNgQu6T3kbcNuNb8a+vBS+Y0upg28F2w9FFrNo2ewLwKukPvi3SlNCsi+0UXnuXYy8oc7g4APWQ9uSiklE3rokne53HDov5sj4Aq5OcSTBbB/t/+B92Qij3A3EXCFPL5dsZBuHY9vh4vgwOeQOzaDhqcs3rALic0YfM+IIrKw81pXIMV5pBv2NvK9Zef8VoWxd5JN4033+mZl8rnYmvN1ldxpDQJuIdegNyOthB5LyNcXKBQX265si2BuIV/GME5RsHDdBnqsX77aaE1WJl9+dMoUL3QOHE1yEZtGWlf80vJzhdyhRSTMWD2+ZEER883I3OfnuWItUUQozC1vbtMvm+/z9Clg6Y346ZfZ30IJH6wGO+2AAEPWX8VyzN2h2HtXBFaH40n6WwKxmvnwc+qs21FlVP6UwzeOcw5DnioTHtOQWvdO7RH4jWWJhfxffDDXwtxthwAfsubD0pOUB6vJnDJ8IExR8gvDQrkcnkX4mQIrLFdgkuXEfkjyqbZoimtlonidMhUGf/h1eNezU1sE/m3Z+ZDVkNjIlVAj0FxJ8WJRKOlJ4SVhH3oVwkLPGKHIpfzG0lgYXy/0X7+QHzxWK7hl5u4yBBiyOu2DQH+4meZmEngEn7mkxcEydZQgxgkW0NiVH4r+Uherr9yz4PNWVyLFYQgLhRPq5FKWnVZn5RF+Vqb84DEouPJhcYftfddynTZCwC3kRsBatlGAEWoEPpD8UAoWU97f+JwdA4Ey5vG575wGpzxQQFZtOfqBoS1lkGeykPJHGWsPQ86V86S05PVEl3UMNefrKrrTGgTcQq5Brz4tw8Ha81xRBlZjUTRWZsNQV/f9r9NZwFlzGLIpmtWCj27hkXx5R4qCcuaonTnbsbzyd9oAAVfIDUDtZykhZ5hX+sK85BeSK83Ulx/MQfP0LMok60gmyiNfFCI85Cn/vjISdzaPlOHUFgEfsrbFc5fcpDwMV7nyYSbzvXAYcgxPvOiZ4WfnMOQU6DcXhYAr5EU1Rx0z0Zph0QJFhTMLaau3Wx2GbMW6uwECPmTdANSdsmS4ylyThZ0P3OtilXXTw5CVv9OGCLhCbgjulllLEZkvduaM/fIUJ5+Hjsbtp/XnYxDwIesxuHupjkARAVfIIizu6QgcgwAKyUodQxvmIU6OgCOwPwJMJ8L0AoX8TBdbsh7rcnIEHIH9EWCFPGyL9CHr/uB7iY7AIAKukIPQeIAjsD8C/tpjf8xPeh3Bzpk3upgu+AHJB7TBpRbpCnlAy0gh2UvqByQfgP2lF+lD1oNaSErJRB7yF/Y3OPivEHCFPE4Mhk4FOI4jL/lwBFwhj2sCLKRbx+Pwv8iSfQ65Q7NoeMriDR/+sgmDj39RRBZ2XusKpDh8TjV0QDJxv1Wc8PJYLicOkB/z0PTVh55XUcaDH5i8Csnlid1CLseuKqWEHEvIFxl8mcG15IBkzs1BqY1QQp45YqMl+YHJLdFckJcr5ALQapNEi7PkgOT+NkaUOp1ap3yxsKzU5h8od9hSHI7e+EUX1nWSYrz8kOY+D+lQrsnMPMJiBFwhF0NXlZBh5dAByfn8keMX7bxVPjAO26goISoKw9k8PkHvFTaokAoPeSgOiltDgzzExHQKfq5ODZIr4rhCrgCvIinK1VEkKQjKxXAzt3hhHqgw5oaE98/C4fiNvmJx9OMYkVen7LHIyt94QPE6PCgMfvGrzm+sLA8bRuBqOMhD1iAgIUaAuZLixfzsiI2ScIdhoSlHjI9fJ67CGYZ2FDSWx1xz7RmtnETgByYLhCPILeT2qPeHlWkuJiXiX6WwPkbc9+OX/J4pXVLSqIwsHLU4o5XyOsqu59QpqKznsTx5O7VG4GHrDD2/GwQktNe6Q2kQ8EDyYxiJdRs7IBmrGkjxGT4+1pXngV/f6jJXXXNGq81flU23QxAP8MtqrimpH5gMShuRD1k3AjZmy/BvyQHJLMig0Lyz/DTmYX6dP3FVGMQwuNUZrX5gcoD0mB9XyA1xj1YyVxQrreQXwpQmvPy3iNEdi49F5cqHugwxwxmtpI98cMs9Fq9zRqv8UtoYt1ReyS/k6T/tEPAhazssD8kpKhDWNFBUOIa1DJdtAcnPaL2B5+J/3UJefBNVMYj18jNaq6C67EiukJfdPlXcySpiDdOqaymR4uRD4dG4pfTutw8CPmTdB2cvxRGoQsAVsgomj+QI7IOAK+Q+OHspjkAVAq6QVTB5JEdgHwRcIffB2UtxBKoQWKyQWrX7rKqEC47Uog4t8rhgiJy1BQiskYlFCqkCX4hPdnzcduKFOXVZRHcIh0X190SDCCyWq9nvISWEbJD+RC5HUdxqUh3YkP25Lr5gyL9BnKyX4jfFAT5U6BtdjDz88OTJFriJMIWbwulw2UrI7iWId7C2s4kth491sdmfjRXmr8flpHwWy9WDV69eIQh8usMu/rSnscSOwqnAj3K/KIXfVj/Vh/r/Tm5Vg2yJg/L+Rbx8LTf/AuO2Qrsb31O4xfCf5Z7Jrvz4eoYvWj7VfZUM1FRMeVXJleJxuBmfzj2YO2TlM59wNEQNQ0vjiLEvI5NLs5ibjjpRt1raBAfqHRm4kztptmrXKdwUbtOrtwMNTPtjbFCMljRXrmYflPyNKjdraLewdoDDtQvFOlG32jK3woGhVf9r/V0w2KmQrdp1Crepjo5pAvTJjdPmd4Fc1SukMmfONDqkbVONw3KhbuHriDEONsYBwbmT1nEM0wZhU7ihsCe1nX1k3S8yhMtzyIL24895rpIry/DKbipcmJ4UFlWa4Rwf1kLXujgdbQiIEKnVj8qhB2bYseSgX+pGHadGAE1wEK/0ymBFg4EX5TO0Kh2evKQ+yqoNiVcEni9KaE/4ZgHkkM65Bjfx16dBhVV+YE44ddpCTmvlKvA8RyGZ9A7OHyNQTI6pWFiQkEt8GtJ6IN1uShz0S/lYc1Ysk3LJD0XlDJuhD205HIqGmaLVOIgHyuG8Vk4eD4ItF+ygvNNbU5+b3Fb+ii86DY6ytFPT4Z3Fil+vzHp2cvFQi1vKW2ls/mj4hjD507FQJ2Rly0W0WrkKfF2F37ofrM+HkahU+J0qmq8OMgRMPf5I2tVBEfg1B/1SN5tLjPGzCgfxSfoWhyfTyU326CoPhWLpH+WfjK94iRQfYaUTw0Ib8YoABWXhLe88LHwTV2VV4VYoHCWGnioPsDBCUThVgSNLihTjL8Iuy7BWrkKSOQr5WCmus4LSrRjHEiLMHeWT/2gvGtMZYCk/3VDWSeGhV84DdM/SdcnKsRhiAlfqCCinw18vXywVjT5Fa3Ewi5OsdywQ/vLObG19rB60zYsMG/OvcRll9AXWOq1BrFQWZbZqV+OzFjeLb24YnQ3IjMUZctdgZ3nWylWIf2WpVrooAC9Diwo7lLfilxTuJH96ZnY7VG8+UNxQtlwEAWFJAi8/hAi/sR59UNGUrpZqcAhx8gzFH7zBYxpWNaiPFQGWY/W2eB03w/GHTsBHRbPOrxc82JGelOfsds0yr8Iti2+3yMMgrxZpwF2EXS+vWXI1RyExvQhOhwQyflxJmDoR9n/AevZfHQAsAjHWMNSBOk7RYhxGsELY4K+kOLPqE8t4qexaHJjMaOS6B8gzPYPvbos6sU4lGRvD7aR0n0feS7j2qhXwp4wW2OV518pVSPMwTzlxTwPYcCVFVaWtwcxNYdwonB5qT4LHvuKllVHx81wXIPWJnqxGyFrg0C8nzQfFW+nw5Kr6xHqx4NLiwGTajfliIuWPgHOVpgwp3oY3c3CDDZO9SWPRGLscglq5CmnmKCRC8TQvKbtneHjWSKok434syp7UabQoRE/EgAn10EG/bKmyOGP8LsZBvNBp0Vunjk1+WG+E3IT/K/nldcjvTwoj7lB9wHv1gckqgw4LHhGmQNGPxSj+p7IGp5hyvaPyluBGwVjzk9LXWMgm2FFej2rlKiSbM2R9qxQ0yBmpwjQSf39GpRgqQTTqa/kB5p7EIgSHE8ML7/cQaECBvxdyqUeJ6E2Lc9pe5LU40HFVH56suHPqwxAu7xipU0cYhUGaWyss1Vn+uZLhD/EKCcwgVlp5PZDHCwE7/VTjJh5ZjKFDofM66RkLyYrq2JpEK+woMqeEce45dH81FND3V2WYT5x08XXEWaPID8E5nMQHHUAulMZTyS+EKU2wWHI7wmsJc1dxVuEwl7/a+IpHB8iVW1SGwggi/qeYF7fcI6xDByaHIbTikNeYEJPVLhR5L7XhmZ/i1nSsiW/Fb4ldnm+1XFmih3ZT6WJ1ZlW2Mt9+tGt5cO1FdCbUrZb2wqGWn1MU2ISZnlE4emc6GXp/4tQemGzpSNaS9m7XKt4bY5eXOVeuTrM+v6IkMY/5Z4ia98Q5E7fqXvWgF2MRBKtQTZeIg3hCkbAYLOx80EXd2DCd/g9EcRjOMa1glEOdGdZD3ysMi/lI9//VteXuFcq7KGqBXV4h5VctV4qbPr+6yjOpvKfBmUvOEuDKvI+IhoAusfoXh4MaFms4OuxWnLyupbgsGEGlsJuQO/jbCLscmUVyNXfIehLjDDuwkDbZz5m4VfexDous/V3CoddorPay0puGv71wf5xAYI1czR6yTvDiwY6AIzATASlwccjKPKOfFZvFz1ax+pH82RFwBOoQkD4xf2d+WSTmkCzO5POKPOKdWLjJK+T3jsDBCIyu5v8/0C+ptuoomr0AAAAASUVORK5CYII=", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ K⋅(P - Pₜ) ⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎣(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "K = Symbol('K')\n", + "p = Symbol('P')\n", + "p_t = Symbol('P_t')\n", + "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4]])\n", + "L_outflow_x1_upper" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 \\left(c - u\\right)}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ ⎛ 2 ⎞⎤\n", + "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝2⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", + "⎢────────────────────────────────────────────────────────⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅c ⋅(c - u) ⎥\n", + "⎢ ⎥\n", + "⎢ K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "⎢ ──────────────────────────────────────── ⎥\n", + "⎢ 2⋅c⋅ρ⋅(c - u) ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx ⎥\n", + "⎢ ⎥\n", + "⎢ -K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "⎢ ───────────────────────────────────────── ⎥\n", + "⎣ 2⋅(c - u) ⎦" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", + "dQ_dx_outflow_x1_upper" + ] + }, + { + "cell_type": "code", + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -345,7 +578,7 @@ "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", - "L_outflow_x1_upper = Matrix([K*(p-p_t), L[1], L[2], L[3], L[4]])\n", + "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4]])\n", "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" ] @@ -354,42 +587,42 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### x1 Lower Inflow" + "### x1 lower inflow (with relaxation term)" ] }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 16, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u)⎤\n", - "⎢ ⎥\n", - "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎛ 2⎞ ⎥\n", - "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", - "⎢ ───────────────────────── ⎥\n", - "⎣ Lₓ ⎦" + "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2⎞ ⎥\n", + "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", + "⎢ ───────────────────────── ⎥\n", + "⎣ Lₓ ⎦" ] }, - "execution_count": 74, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -417,66 +650,66 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(\\frac{dP}{dx} - \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right) - 2 c \\eta_{2} \\left(P - P_{t}\\right) \\left(c + u\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(\\frac{dP}{dx} - \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right) - 2 c \\eta_{2} \\left(P - P_{t}\\right) \\left(c + u\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 2 ⎛ 2 ⎞ \n", - "⎢Lₓ⋅u⋅(\\frac{dP}{dx} - \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) - c ⋅η₅⋅ρ⋅u⋅⎝M - 1⎠⋅(u - uₜ\n", + "⎡ 2 ⎛ 2 ⎞ \n", + "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅u⋅⎝M - 1⎠⋅(u - uₜ) - 2⋅c⋅η₂⋅(P -\n", "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", + "⎢ 2 \n", + "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", "⎢ \n", - "⎢ 2 ⎛ 2 \n", - "⎢ Lₓ⋅(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) - c ⋅η₅⋅ρ⋅⎝M -\n", - "⎢ ───────────────────────────────────────────────────────────────\n", - "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ────────────────────────────────────────────────────────── \n", + "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", "⎢ \n", - "⎢ c⋅η₃⋅(v - vₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ c⋅η₃⋅(v - vₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", "⎢ \n", - "⎢ c⋅η₄⋅(w - wₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ c⋅η₄⋅(w - wₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", "⎢ \n", - "⎢ 2 ⎛ 2 \n", - "⎢ Lₓ⋅(\\frac{dP}{dx} - \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) - c ⋅η₅⋅ρ⋅⎝M -\n", - "⎢ ──────────────────────────────────────────────────────────────\n", - "⎣ 2⋅Lₓ⋅(c + u) \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ─────────────────────────────────────────────────────────── \n", + "⎣ 2⋅Lₓ⋅(c + u) \n", "\n", - " ⎤\n", - ") - 2⋅c⋅η₂⋅(P - Pₜ)⋅(c + u)⎥\n", - "───────────────────────────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎞ ⎥\n", - " 1⎠⋅(u - uₜ) ⎥\n", - "──────────── ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎞ ⎥\n", - " 1⎠⋅(u - uₜ) ⎥\n", - "──────────── ⎥\n", - " ⎦" + " ⎤\n", + " Pₜ)⋅(c + u)⎥\n", + "────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, - "execution_count": 75, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -488,7 +721,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -517,9 +750,174 @@ " eta_3*(c/Lx)*(v-v_t),\n", " eta_4*(c/Lx)*(w-w_t),\n", " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + "\n", "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## inflow with zero normal velocity" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡c⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2⎞ ⎥\n", + "⎢-c ⋅η₅⋅ρ⋅uₜ⋅⎝1 - M ⎠ ⎥\n", + "⎢─────────────────────⎥\n", + "⎣ Lₓ ⎦" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L_inflow_x1_lower_zerou = L_inflow_x1_lower.subs(u, 0)\n", + "L_inflow_x1_lower_zerou" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- \\frac{1}{c} & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & \\frac{1}{c}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡-1 ⎤\n", + "⎢─── 0 0 0 0⎥\n", + "⎢ c ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1⎥\n", + "⎢ 0 0 0 0 ─⎥\n", + "⎣ c⎦" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def pinv(x): # Moore-Penrose pseudoinverse of a diagonal matrix\n", + " if x != 0:\n", + " return x**-1\n", + " else:\n", + " return 0\n", + "ll = [pinv(l.subs(u,0)) for l in lambda_list]\n", + "linv_zerou = diag(ll[1], ll[0], ll[0], ll[0], ll[2])\n", + "linv_zerou" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{3}}\\\\\\frac{L_{x} c \\left(c du_{dx} \\rho - dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2} \\rho}\\\\0\\\\0\\\\\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 2 ⎛ 2 ⎞⎤\n", + "⎢Lₓ⋅c⋅(-c⋅du_dx⋅ρ + dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", + "⎢───────────────────────────────────────────────⎥\n", + "⎢ 3 ⎥\n", + "⎢ 2⋅Lₓ⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2 ⎞ ⎥\n", + "⎢Lₓ⋅c⋅(c⋅du_dx⋅ρ - dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠ ⎥\n", + "⎢────────────────────────────────────────────── ⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅Lₓ⋅c ⋅ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2 ⎞⎥\n", + "⎢Lₓ⋅c⋅(-c⋅du_dx⋅ρ + dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", + "⎢───────────────────────────────────────────────⎥\n", + "⎣ 2⋅Lₓ⋅c ⎦" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_inflow_x1_lower_zerou = simplify(S * linv_zerou * L_inflow_x1_lower_zerou)\n", + "dQ_dx_inflow_x1_lower_zerou" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = (1.0/2.0)*(L_x*c*(-c*du_dx*rho + dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 3));\n", + "dQ_dx[1] = (1.0/2.0)*(L_x*c*(c*du_dx*rho - dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 2)*rho);\n", + "dQ_dx[2] = 0;\n", + "dQ_dx[3] = 0;\n", + "dQ_dx[4] = (1.0/2.0)*(L_x*c*(-c*du_dx*rho + dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c);\n" + ] + } + ], + "source": [ + "print(cxxcode(dQ_dx_inflow_x1_lower_zerou, assign_to='dQ_dx'))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/src/hydro_system.hpp b/src/hydro_system.hpp index a3dba760d..1863a27ca 100644 --- a/src/hydro_system.hpp +++ b/src/hydro_system.hpp @@ -23,6 +23,7 @@ // internal headers #include "ArrayView.hpp" +#include "EOS.hpp" #include "HLLC.hpp" #include "hyperbolic_system.hpp" #include "radiation_system.hpp" @@ -72,6 +73,10 @@ template class HydroSystem : public HyperbolicSystem bool; + AMREX_GPU_DEVICE static auto ComputePrimVars(amrex::Array4 const &cons, int i, int j, int k) -> quokka::valarray; + + AMREX_GPU_DEVICE static auto ComputeConsVars(quokka::valarray const &prim) -> quokka::valarray; + AMREX_GPU_DEVICE static auto ComputePressure(amrex::Array4 const &cons, int i, int j, int k) -> amrex::Real; AMREX_GPU_DEVICE static auto ComputeSoundSpeed(amrex::Array4 const &cons, int i, int j, int k) -> amrex::Real; @@ -280,6 +285,51 @@ template auto HydroSystem::CheckStatesValid(amre }); } + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePrimVars(amrex::Array4 const &cons, int i, int j, int k) + -> quokka::valarray +{ + // convert to primitive vars + const auto rho = cons(i, j, k, density_index); + const auto px = cons(i, j, k, x1Momentum_index); + const auto py = cons(i, j, k, x2Momentum_index); + const auto pz = cons(i, j, k, x3Momentum_index); + const auto E = cons(i, j, k, energy_index); // *total* gas energy per unit volume + const auto vx = px / rho; + const auto vy = py / rho; + const auto vz = pz / rho; + const auto kinetic_energy = 0.5 * rho * (vx * vx + vy * vy + vz * vz); + const auto thermal_energy = E - kinetic_energy; + + amrex::Real P = NAN; + if constexpr (is_eos_isothermal()) { + P = rho * cs_iso_ * cs_iso_; + } else { + amrex::GpuArray massScalars = RadSystem::ComputeMassScalars(cons, i, j, k); + P = quokka::EOS::ComputePressure(rho, thermal_energy, massScalars); + } + + quokka::valarray primVars{rho, vx, vy, vz, P}; + return primVars; +} + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputeConsVars(quokka::valarray const &prim) + -> quokka::valarray +{ + // convert to conserved vars + Real const rho = prim[0]; + Real const v1 = prim[1]; + Real const v2 = prim[2]; + Real const v3 = prim[3]; + Real const P = prim[4]; + Real const Eint = quokka::EOS::ComputeEintFromPres(rho, P); + Real const Egas = Eint + 0.5 * rho * (v1*v1 + v2*v2 + v3*v3); + quokka::valarray consVars{rho, rho*v1, rho*v2, rho*v3, Egas}; + return consVars; +} + template AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePressure(amrex::Array4 const &cons, int i, int j, int k) -> amrex::Real diff --git a/tests/NSCBC_Channel.in b/tests/NSCBC_Channel.in index 71b113b02..d2975e6cc 100644 --- a/tests/NSCBC_Channel.in +++ b/tests/NSCBC_Channel.in @@ -2,7 +2,7 @@ # Problem size and geometry # ***************************************************************** geometry.prob_lo = 0.0 0.0 0.0 -geometry.prob_hi = 1.0 1.0 1.0 +geometry.prob_hi = 1.0 0.25 0.25 geometry.is_periodic = 0 1 1 # ***************************************************************** @@ -26,14 +26,14 @@ amr.max_grid_size = 64 cfl = 0.3 do_reflux = 1 do_subcycle = 1 -max_timesteps = 1000 -stop_time = 1.0 +max_timesteps = 5000 +stop_time = 1.0e-4 checkpoint_interval = 5000 -plotfile_interval = 100 -ascent_interval = 1 +plotfile_interval = 20 +ascent_interval = -1 -hydro.rk_integrator_order = 1 -hydro.reconstruction_order = 1 +hydro.rk_integrator_order = 2 +hydro.reconstruction_order = 3 hydro.use_dual_energy = 0 hydro.low_level_debugging_output = 0 From a9856d287b860171be75a3199efa569e4247bb80 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Tue, 22 Aug 2023 21:10:42 +0000 Subject: [PATCH 38/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/hydro_system.hpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hydro_system.hpp b/src/hydro_system.hpp index 1863a27ca..75ce7f619 100644 --- a/src/hydro_system.hpp +++ b/src/hydro_system.hpp @@ -285,7 +285,6 @@ template auto HydroSystem::CheckStatesValid(amre }); } - template AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePrimVars(amrex::Array4 const &cons, int i, int j, int k) -> quokka::valarray @@ -325,8 +324,8 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputeConsVars Real const v3 = prim[3]; Real const P = prim[4]; Real const Eint = quokka::EOS::ComputeEintFromPres(rho, P); - Real const Egas = Eint + 0.5 * rho * (v1*v1 + v2*v2 + v3*v3); - quokka::valarray consVars{rho, rho*v1, rho*v2, rho*v3, Egas}; + Real const Egas = Eint + 0.5 * rho * (v1 * v1 + v2 * v2 + v3 * v3); + quokka::valarray consVars{rho, rho * v1, rho * v2, rho * v3, Egas}; return consVars; } From 820f8043edfd6b0d628163750bd579583b62b497 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Wed, 23 Aug 2023 15:59:46 -0400 Subject: [PATCH 39/64] update problem params to match paper --- src/NSCBC/channel.cpp | 49 ++++++++++++++++++++++++++---------------- tests/NSCBC_Channel.in | 30 +++++++++++++++----------- 2 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index c607ab1fd..0e5461e89 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -21,6 +21,7 @@ #include "AMReX_MultiFab.H" #include "AMReX_ParallelContext.H" #include "AMReX_ParallelDescriptor.H" +#include "AMReX_ParmParse.H" #include "AMReX_REAL.H" #include "AMReX_SPACE.H" #include "AMReX_TableData.H" @@ -30,6 +31,7 @@ #include "HydroState.hpp" #include "RadhydroSimulation.hpp" #include "channel.hpp" +#include "fundamental_constants.H" #include "hydro_system.hpp" #include "physics_info.hpp" #include "physics_numVars.hpp" @@ -42,8 +44,8 @@ struct Channel { }; // dummy type to allow compile-type polymorphism via template specialization template <> struct quokka::EOS_Traits { - static constexpr double gamma = 5. / 3.; // default value - static constexpr double mean_molecular_weight = C::m_p + C::m_e; + static constexpr double gamma = 1.1; + static constexpr double mean_molecular_weight = 28.96 * C::m_u; // air static constexpr double boltzmann_constant = C::k_B; }; @@ -56,18 +58,17 @@ template <> struct Physics_Traits { static constexpr bool is_radiation_enabled = false; }; -constexpr Real Tgas0 = 300; // K -constexpr Real nH0 = 1.0; // cm^-3 -constexpr Real rho0 = nH0 * (C::m_p + C::m_e); // g cm^-3 - -// global variables needed for Dirichlet boundary condition +// global variables needed for Dirichlet boundary condition and initial conditions namespace { -AMREX_GPU_MANAGED Real u_inflow = 1.0e4; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real w_inflow = 0; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -}; // namespace +Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { @@ -77,11 +78,10 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: amrex::GpuArray prob_hi = grid_elem.prob_hi_; const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; - amrex::Real const u_inflow = ::u_inflow; amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { Real const rho = rho0; - Real const xmom = 0; + Real const xmom = rho0 * u0; Real const ymom = 0; Real const zmom = 0; Real const Eint = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); @@ -146,10 +146,10 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); const Real M = std::sqrt(u * u + v * v + w * w) / c; - const Real eta_2 = -0.278; - const Real eta_3 = 1.0; - const Real eta_4 = 1.0; - const Real eta_5 = 0.278; + const Real eta_2 = 2.; //-0.278; + const Real eta_3 = 2.; //1.0; + const Real eta_4 = 2.; //1.0; + const Real eta_5 = 2.; //0.278; // see SymPy notebook for derivation quokka::valarray dQ_dx{}; @@ -181,12 +181,12 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda { auto [i, j, k] = iv.dim3(); amrex::Box const &box = geom.Domain(); - const Real Lx = 1.0; const auto &domain_lo = box.loVect3d(); const auto &domain_hi = box.hiVect3d(); const int ilo = domain_lo[0]; const int ihi = domain_hi[0]; const Real dx = geom.CellSize(0); + const Real Lx = geom.prob_domain.length(0); const Real P_inflow = ::P_inflow; const Real u_inflow = ::u_inflow; @@ -285,8 +285,19 @@ auto problem_main() -> int RadhydroSimulation sim(BCs_cc); + amrex::ParmParse pp("channel"); + // initial condition parameters + pp.query("rho0", ::rho0); // initial density [g/cc] + pp.query("Tgas0", ::Tgas0); // initial temperature [K] + pp.query("u0", ::u0); // initial velocity [cm/s] + // boundary condition parameters + pp.query("u_inflow", ::u_inflow); // inflow velocity along x-axis [cm/s] + pp.query("v_inflow", ::v_inflow); // transverse inflow velocity (v_y) [cm/s] + pp.query("w_inflow", ::w_inflow); // transverse inflow velocity (v_z) [cm/s] + // compute derived parameters const Real Eint0 = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); ::P_inflow = quokka::EOS::ComputePressure(rho0, Eint0); + amrex::Print() << "Derived inflow pressure is " << ::P_inflow << " erg/cc.\n"; // Set initial conditions sim.setInitialConditions(); diff --git a/tests/NSCBC_Channel.in b/tests/NSCBC_Channel.in index d2975e6cc..ed637ad01 100644 --- a/tests/NSCBC_Channel.in +++ b/tests/NSCBC_Channel.in @@ -1,9 +1,9 @@ # ***************************************************************** # Problem size and geometry # ***************************************************************** -geometry.prob_lo = 0.0 0.0 0.0 -geometry.prob_hi = 1.0 0.25 0.25 -geometry.is_periodic = 0 1 1 +geometry.prob_lo = 0.0 0.0 0.0 +geometry.prob_hi = 100.0 12.5 12.5 +geometry.is_periodic = 0 1 1 # ***************************************************************** # VERBOSITY @@ -13,27 +13,33 @@ amr.v = 1 # verbosity in Amr # ***************************************************************** # Resolution and refinement # ***************************************************************** -amr.n_cell = 64 16 16 +amr.n_cell = 256 32 32 amr.max_level = 0 # number of levels = max_level + 1 -amr.blocking_factor_x = 64 -amr.blocking_factor_y = 16 -amr.blocking_factor_z = 16 # grid size must be divisible by this -amr.max_grid_size = 64 +amr.blocking_factor = 32 +amr.max_grid_size = 128 # ***************************************************************** # Quokka options # ***************************************************************** -cfl = 0.3 +cfl = 0.2 do_reflux = 1 do_subcycle = 1 -max_timesteps = 5000 -stop_time = 1.0e-4 +max_timesteps = 25000 +stop_time = 0.05 checkpoint_interval = 5000 -plotfile_interval = 20 +plotfile_interval = 100 ascent_interval = -1 hydro.rk_integrator_order = 2 hydro.reconstruction_order = 3 hydro.use_dual_energy = 0 hydro.low_level_debugging_output = 0 + +channel.rho0 = 1.1e-3 # g/cc +channel.Tgas0 = 320.8398927398333 # K +channel.u0 = 2.0e3 # cm/s + +channel.u_inflow = 4.0e3 # cm/s +channel.v_inflow = 0. # cm/s +channel.w_inflow = 0. # cm/s From 851b0f6bba26b34bc2555be538a7456427d81667 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Wed, 23 Aug 2023 19:59:56 +0000 Subject: [PATCH 40/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/NSCBC/channel.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 0e5461e89..475954219 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -147,9 +147,9 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< const Real M = std::sqrt(u * u + v * v + w * w) / c; const Real eta_2 = 2.; //-0.278; - const Real eta_3 = 2.; //1.0; - const Real eta_4 = 2.; //1.0; - const Real eta_5 = 2.; //0.278; + const Real eta_3 = 2.; // 1.0; + const Real eta_4 = 2.; // 1.0; + const Real eta_5 = 2.; // 0.278; // see SymPy notebook for derivation quokka::valarray dQ_dx{}; From 40a5ba3fee962eed27db32a74a422526b2091a04 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 24 Aug 2023 12:14:57 -0400 Subject: [PATCH 41/64] use target temperature for inflow --- src/NSCBC/channel.cpp | 51 ++++++++++------- src/NSCBC/dQ_dx.ipynb | 121 ++++++++++++++++++++--------------------- tests/NSCBC_Channel.in | 6 +- 3 files changed, 92 insertions(+), 86 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 475954219..fb199ec85 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -61,14 +61,14 @@ template <> struct Physics_Traits { // global variables needed for Dirichlet boundary condition and initial conditions namespace { -Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -}; // namespace +Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_outflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { @@ -100,6 +100,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const Real L_x) -> quokka::valarray { // return dQ/dx corresponding to subsonic outflow on the x1 upper boundary + const Real rho = Q[0]; const Real u = Q[1]; const Real v = Q[2]; @@ -114,7 +115,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); const Real M = std::sqrt(u * u + v * v + w * w) / c; - amrex::Real const K = 0.25 * c * (1 - M * M) / L_x; + amrex::Real const K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posed Euler equations // see SymPy notebook for derivation quokka::valarray dQ_dx{}; @@ -127,15 +128,20 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray return dQ_dx; } -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray const &Q, quokka::valarray const &dQ_dx_data, const Real P_t, +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray const &Q, quokka::valarray const &dQ_dx_data, const Real T_t, const Real u_t, const Real v_t, const Real w_t, const Real L_x) -> quokka::valarray { // return dQ/dx corresponding to subsonic inflow on the x1 lower boundary + // (This is only necessary for continuous inflows, i.e., where as shock or contact discontinuity is not desired.) + // NOTE: This boundary condition is only defined for an ideal gas (with constant k_B/mu). + const Real rho = Q[0]; const Real u = Q[1]; const Real v = Q[2]; const Real w = Q[3]; const Real P = Q[4]; + const Real Eint = quokka::EOS::ComputeEintFromPres(rho, P); + const Real T = quokka::EOS::ComputeTgasFromEint(rho, Eint); const Real drho_dx = dQ_dx_data[0]; const Real du_dx = dQ_dx_data[1]; @@ -146,17 +152,19 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); const Real M = std::sqrt(u * u + v * v + w * w) / c; - const Real eta_2 = 2.; //-0.278; - const Real eta_3 = 2.; // 1.0; - const Real eta_4 = 2.; // 1.0; - const Real eta_5 = 2.; // 0.278; + const Real eta_2 = 2.; + const Real eta_3 = 2.; + const Real eta_4 = 2.; + const Real eta_5 = 2.; + + const Real R = quokka::EOS_Traits::boltzmann_constant / quokka::EOS_Traits::mean_molecular_weight; // see SymPy notebook for derivation quokka::valarray dQ_dx{}; if (u != 0.) { dQ_dx[0] = 0.5 * (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * u * ((M * M) - 1) * (u - u_t) - - 2 * c * eta_2 * (P - P_t) * (c + u)) / + 2 * c * eta_2 * rho * R * (T - T_t) * (c + u)) / (L_x * (c * c) * u * (c + u)); dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * c * rho * (c + u)); dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); @@ -188,11 +196,13 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda const Real dx = geom.CellSize(0); const Real Lx = geom.prob_domain.length(0); - const Real P_inflow = ::P_inflow; + const Real T_inflow = ::Tgas0; const Real u_inflow = ::u_inflow; const Real v_inflow = ::v_inflow; const Real w_inflow = ::w_inflow; + const Real P_outflow = ::P_outflow; + if (i < ilo) { // x1 lower boundary -- subsonic inflow @@ -203,7 +213,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda quokka::valarray const dQ_dx_data = (-3. * Q_i + 4. * Q_ip1 - Q_ip2) / (2. * dx); // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, P_inflow, u_inflow, v_inflow, w_inflow, Lx); + quokka::valarray const dQ_dx = dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, T_inflow, u_inflow, v_inflow, w_inflow, Lx); // compute centered ghost values quokka::valarray const Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; @@ -238,7 +248,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, P_inflow, Lx); + quokka::valarray const dQ_dx = dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, P_outflow, Lx); // compute centered ghost values quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; @@ -294,10 +304,11 @@ auto problem_main() -> int pp.query("u_inflow", ::u_inflow); // inflow velocity along x-axis [cm/s] pp.query("v_inflow", ::v_inflow); // transverse inflow velocity (v_y) [cm/s] pp.query("w_inflow", ::w_inflow); // transverse inflow velocity (v_z) [cm/s] + // compute derived parameters const Real Eint0 = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); - ::P_inflow = quokka::EOS::ComputePressure(rho0, Eint0); - amrex::Print() << "Derived inflow pressure is " << ::P_inflow << " erg/cc.\n"; + ::P_outflow = quokka::EOS::ComputePressure(rho0, Eint0); + amrex::Print() << "Derived outflow pressure is " << ::P_outflow << " erg/cc.\n"; // Set initial conditions sim.setInitialConditions(); diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index c5039cab4..322d0b255 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -597,15 +597,15 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" ], "text/plain": [ "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", "⎢ ⎥\n", - "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", - "⎢ ───────────── ⎥\n", + "⎢ R⋅c⋅η₂⋅ρ⋅(t - tₜ) ⎥\n", + "⎢ ───────────────── ⎥\n", "⎢ Lₓ ⎥\n", "⎢ ⎥\n", "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", @@ -639,9 +639,11 @@ "v_t = Symbol('v_t')\n", "w = Symbol('w')\n", "w_t = Symbol('w_t')\n", - "\n", + "t = Symbol('t') # gas temperature\n", + "t_t = Symbol('t_t')\n", + "R = Symbol('R') # gas constant (kB/mu)\n", "L_inflow_x1_lower = Matrix([L[0],\n", - " eta_2*(c/Lx)*(p-p_t),\n", + " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", " eta_3*(c/Lx)*(v-v_t),\n", " eta_4*(c/Lx)*(w-w_t),\n", " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", @@ -655,58 +657,58 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right) - 2 c \\eta_{2} \\left(P - P_{t}\\right) \\left(c + u\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - 2 R c \\eta_{2} \\rho \\left(c + u\\right) \\left(t - t_{t}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 2 ⎛ 2 ⎞ \n", - "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅u⋅⎝M - 1⎠⋅(u - uₜ) - 2⋅c⋅η₂⋅(P -\n", + "⎡ 2 ⎛\n", + "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - 2⋅R⋅c⋅η₂⋅ρ⋅(c + u)⋅(t - tₜ) - c ⋅η₅⋅ρ⋅u⋅⎝\n", "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", + "⎢ 2 \n", + "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", "⎢ \n", - "⎢ 2 ⎛ 2 ⎞ \n", - "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", - "⎢ ────────────────────────────────────────────────────────── \n", - "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ────────────────────────────────────────────────────────── \n", + "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", "⎢ \n", - "⎢ c⋅η₃⋅(v - vₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ c⋅η₃⋅(v - vₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", "⎢ \n", - "⎢ c⋅η₄⋅(w - wₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ c⋅η₄⋅(w - wₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", "⎢ \n", - "⎢ 2 ⎛ 2 ⎞ \n", - "⎢ Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", - "⎢ ─────────────────────────────────────────────────────────── \n", - "⎣ 2⋅Lₓ⋅(c + u) \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ─────────────────────────────────────────────────────────── \n", + "⎣ 2⋅Lₓ⋅(c + u) \n", "\n", - " ⎤\n", - " Pₜ)⋅(c + u)⎥\n", - "────────────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎦" + " 2 ⎞ ⎤\n", + "M - 1⎠⋅(u - uₜ)⎥\n", + "────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, "execution_count": 17, @@ -728,7 +730,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t) - 2*c*eta_2*(P - P_t)*(c + u))/(L_x*std::pow(c, 2)*u*(c + u));\n", + "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-c*du_dx*rho + dP_dx) - 2*R*c*eta_2*rho*(c + u)*(t - t_t) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*std::pow(c, 2)*u*(c + u));\n", "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", "dQ_dx[2] = c*eta_3*(v - v_t)/(L_x*u);\n", "dQ_dx[3] = c*eta_4*(w - w_t)/(L_x*u);\n", @@ -746,7 +748,7 @@ "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", "L_inflow_x1_lower = Matrix([L[0],\n", - " eta_2*(c/Lx)*(p-p_t),\n", + " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", " eta_3*(c/Lx)*(v-v_t),\n", " eta_4*(c/Lx)*(w-w_t),\n", " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", @@ -759,7 +761,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## inflow with zero normal velocity" + "### x1 lower inflow (with relaxation term; zero normal velocity)" ] }, { @@ -769,15 +771,15 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{c \\eta_{2} \\left(P - P_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\end{matrix}\\right]$" ], "text/plain": [ "⎡c⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", "⎢ ⎥\n", - "⎢ c⋅η₂⋅(P - Pₜ) ⎥\n", - "⎢ ───────────── ⎥\n", + "⎢ R⋅c⋅η₂⋅ρ⋅(t - tₜ) ⎥\n", + "⎢ ───────────────── ⎥\n", "⎢ Lₓ ⎥\n", "⎢ ⎥\n", "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", @@ -911,13 +913,6 @@ "source": [ "print(cxxcode(dQ_dx_inflow_x1_lower_zerou, assign_to='dQ_dx'))" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/tests/NSCBC_Channel.in b/tests/NSCBC_Channel.in index ed637ad01..25967738c 100644 --- a/tests/NSCBC_Channel.in +++ b/tests/NSCBC_Channel.in @@ -21,11 +21,11 @@ amr.max_grid_size = 128 # ***************************************************************** # Quokka options # ***************************************************************** -cfl = 0.2 +cfl = 0.3 do_reflux = 1 do_subcycle = 1 -max_timesteps = 25000 -stop_time = 0.05 +max_timesteps = 50000 +stop_time = 0.1 checkpoint_interval = 5000 plotfile_interval = 100 From 5b775467e04ca21d00fc92fa12c3dc4fe1f873da Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 24 Aug 2023 13:57:00 -0400 Subject: [PATCH 42/64] add ChannelFlow to test suite --- src/NSCBC/CMakeLists.txt | 4 +- src/NSCBC/channel.cpp | 120 ++++++++++++++++++++++++++++++++++++++- tests/NSCBC_Channel.in | 4 +- 3 files changed, 123 insertions(+), 5 deletions(-) diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt index ef6ddc0bb..1ce424c39 100644 --- a/src/NSCBC/CMakeLists.txt +++ b/src/NSCBC/CMakeLists.txt @@ -1,5 +1,7 @@ -add_executable(test_channel_flow channel.cpp ${QuokkaObjSources}) +add_executable(test_channel_flow channel.cpp ${QuokkaObjSources} ../fextract.cpp) if(AMReX_GPU_BACKEND MATCHES "CUDA") setup_target_for_cuda_compilation(test_channel_flow) endif(AMReX_GPU_BACKEND MATCHES "CUDA") + +add_test(NAME ChannelFlow COMMAND test_channel_flow NSCBC_Channel.in WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index fb199ec85..3a3f1d58c 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -8,6 +8,7 @@ /// Characteristic Boundary Conditions (NSCBC). /// #include +#include #include #include "AMReX.H" @@ -27,16 +28,21 @@ #include "AMReX_TableData.H" #include "AMReX_iMultiFab.H" +#include "ArrayUtil.hpp" #include "EOS.hpp" #include "HydroState.hpp" #include "RadhydroSimulation.hpp" #include "channel.hpp" +#include "fextract.hpp" #include "fundamental_constants.H" #include "hydro_system.hpp" #include "physics_info.hpp" #include "physics_numVars.hpp" #include "radiation_system.hpp" #include "valarray.hpp" +#ifdef HAVE_PYTHON +#include "matplotlibcpp.h" +#endif using amrex::Real; @@ -232,6 +238,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda } else if (i == ilo - 4) { consCell = HydroSystem::ComputeConsVars(Q_im4); } + consVar(i, j, k, HydroSystem::density_index) = consCell[0]; consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; @@ -316,7 +323,116 @@ auto problem_main() -> int // run simulation sim.evolve(); - // Cleanup and exit - int const status = 0; + // extract slice + auto [position, values] = fextract(sim.state_new_cc_[0], sim.geom[0], 0, 0., true); + int nx = static_cast(position.size()); + std::vector xs = position; + std::vector xs_exact = position; + + // extract solution + std::vector d(nx); + std::vector vx(nx); + std::vector P(nx); + std::vector density_exact(nx); + std::vector velocity_exact(nx); + std::vector Pexact(nx); + + for (int i = 0; i < nx; ++i) { + { + amrex::Real rho = values.at(HydroSystem::density_index)[i]; + amrex::Real xmom = values.at(HydroSystem::x1Momentum_index)[i]; + amrex::Real Egas = values.at(HydroSystem::energy_index)[i]; + amrex::Real Eint = Egas - (xmom * xmom) / (2.0 * rho); + amrex::Real const gamma = quokka::EOS_Traits::gamma; + d.at(i) = rho; + vx.at(i) = xmom / rho; + P.at(i) = ((gamma - 1.0) * Eint); + } + { + density_exact.at(i) = rho0; + velocity_exact.at(i) = u_inflow; + Pexact.at(i) = P_outflow; + } + } + std::vector> const sol{d, vx, P}; + std::vector> const sol_exact{density_exact, velocity_exact, Pexact}; + + // compute error norm + amrex::Real err_sq = 0.; + for (int n = 0; n < sol.size(); ++n) { + amrex::Real dU_k = 0.; + amrex::Real U_k = 0; + for (int i = 0; i < nx; ++i) { + // Δ Uk = ∑i |Uk,in - Uk,i0| / Nx + const amrex::Real U_k0 = sol_exact.at(n)[i]; + const amrex::Real U_k1 = sol.at(n)[i]; + dU_k += std::abs(U_k1 - U_k0) / static_cast(nx); + U_k += std::abs(U_k0) / static_cast(nx); + } + amrex::Print() << "dU_" << n << " = " << dU_k << " U_k = " << U_k << "\n"; + // ε = || Δ U / U || = [&sum_k (ΔU_k/U_k)^2]^{1/2} + err_sq += std::pow(dU_k / U_k, 2); + } + const amrex::Real epsilon = std::sqrt(err_sq); + amrex::Print() << "rms of component-wise relative L1 error norms = " << epsilon << "\n\n"; + +#ifdef HAVE_PYTHON + if (amrex::ParallelDescriptor::IOProcessor()) { + // Plot results + int skip = 4; // only plot every 8 elements of exact solution + double msize = 5.0; // marker size + using mpl_arg = std::map; + using mpl_sarg = std::unordered_map; + + matplotlibcpp::clf(); + mpl_arg d_args; + mpl_sarg dexact_args; + d_args["label"] = "density"; + d_args["color"] = "C0"; + dexact_args["marker"] = "o"; + dexact_args["color"] = "C0"; + matplotlibcpp::plot(xs, d, d_args); + matplotlibcpp::scatter(strided_vector_from(xs_exact, skip), strided_vector_from(density_exact, skip), msize, dexact_args); + matplotlibcpp::legend(); + matplotlibcpp::xlabel("length x"); + matplotlibcpp::tight_layout(); + matplotlibcpp::save("./channel_flow_density.pdf"); + + matplotlibcpp::clf(); + std::map vx_args; + vx_args["label"] = "velocity"; + vx_args["color"] = "C3"; + matplotlibcpp::plot(xs, vx, vx_args); + mpl_sarg vexact_args; + vexact_args["marker"] = "o"; + vexact_args["color"] = "C3"; + matplotlibcpp::scatter(strided_vector_from(xs_exact, skip), strided_vector_from(velocity_exact, skip), msize, vexact_args); + matplotlibcpp::legend(); + matplotlibcpp::xlabel("length x"); + matplotlibcpp::tight_layout(); + matplotlibcpp::save("./channel_flow_velocity.pdf"); + + matplotlibcpp::clf(); + std::map P_args; + P_args["label"] = "pressure"; + P_args["color"] = "C4"; + matplotlibcpp::plot(xs, P, P_args); + mpl_sarg Pexact_args; + Pexact_args["marker"] = "o"; + Pexact_args["color"] = "C4"; + matplotlibcpp::scatter(strided_vector_from(xs_exact, skip), strided_vector_from(Pexact, skip), msize, Pexact_args); + matplotlibcpp::legend(); + matplotlibcpp::xlabel("length x"); + matplotlibcpp::tight_layout(); + matplotlibcpp::save("./channel_flow_pressure.pdf"); + } +#endif + + // Compute test success condition + int status = 0; + const double error_tol = 3.0e-5; + if (epsilon > error_tol) { + status = 1; + } return status; } diff --git a/tests/NSCBC_Channel.in b/tests/NSCBC_Channel.in index 25967738c..d4a4c0813 100644 --- a/tests/NSCBC_Channel.in +++ b/tests/NSCBC_Channel.in @@ -27,8 +27,8 @@ do_subcycle = 1 max_timesteps = 50000 stop_time = 0.1 -checkpoint_interval = 5000 -plotfile_interval = 100 +checkpoint_interval = -1 +plotfile_interval = -1 ascent_interval = -1 hydro.rk_integrator_order = 2 From 6e6aa5783833afba577dc481c0a41187b4f69bcb Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 24 Aug 2023 17:34:53 -0400 Subject: [PATCH 43/64] add passive scalar --- src/NSCBC/channel.cpp | 181 ++++++++++++------ src/NSCBC/dQ_dx.ipynb | 418 +++++++++++++++++++++++------------------ src/hydro_system.hpp | 26 ++- tests/NSCBC_Channel.in | 4 +- 4 files changed, 380 insertions(+), 249 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 3a3f1d58c..be41b35f3 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -12,6 +12,7 @@ #include #include "AMReX.H" +#include "AMReX_Array.H" #include "AMReX_BC_TYPES.H" #include "AMReX_BLProfiler.H" #include "AMReX_BLassert.H" @@ -25,7 +26,6 @@ #include "AMReX_ParmParse.H" #include "AMReX_REAL.H" #include "AMReX_SPACE.H" -#include "AMReX_TableData.H" #include "AMReX_iMultiFab.H" #include "ArrayUtil.hpp" @@ -60,21 +60,23 @@ template <> struct Physics_Traits { static constexpr bool is_chemistry_enabled = false; static constexpr bool is_mhd_enabled = false; static constexpr int numMassScalars = 0; // number of mass scalars - static constexpr int numPassiveScalars = numMassScalars + 0; // number of passive scalars + static constexpr int numPassiveScalars = numMassScalars + 1; // number of passive scalars static constexpr bool is_radiation_enabled = false; }; // global variables needed for Dirichlet boundary condition and initial conditions namespace { -Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_outflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -}; // namespace +Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real s0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_outflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +GpuArray::numPassiveScalars> s_inflow{}; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { @@ -85,25 +87,30 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; - amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { - Real const rho = rho0; - Real const xmom = rho0 * u0; - Real const ymom = 0; - Real const zmom = 0; - Real const Eint = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); - Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + Real const rho = rho0; + Real const xmom = rho0 * u0; + Real const ymom = 0; + Real const zmom = 0; + Real const Eint = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); + Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + Real const scalar = s0; + amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { state_cc(i, j, k, HydroSystem::density_index) = rho; state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; state_cc(i, j, k, HydroSystem::energy_index) = Egas; state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; + state_cc(i, j, k, HydroSystem::scalar0_index) = scalar; }); } -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const &Q, quokka::valarray const &dQ_dx_data, const Real P_t, - const Real L_x) -> quokka::valarray +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const &Q, + quokka::valarray const &dQ_dx_data, + const Real P_t, const Real L_x) + -> quokka::valarray { // return dQ/dx corresponding to subsonic outflow on the x1 upper boundary @@ -118,24 +125,33 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const Real dv_dx = dQ_dx_data[2]; const Real dw_dx = dQ_dx_data[3]; const Real dP_dx = dQ_dx_data[4]; + const Real dEint_aux_dx = dQ_dx_data[5]; const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); const Real M = std::sqrt(u * u + v * v + w * w) / c; amrex::Real const K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posed Euler equations // see SymPy notebook for derivation - quokka::valarray dQ_dx{}; + quokka::valarray dQ_dx{}; dQ_dx[0] = 0.5 * (-K * (P - P_t) + (c - u) * (2.0 * c * c * drho_dx + c * du_dx * rho - dP_dx)) / (c * c * (c - u)); dQ_dx[1] = 0.5 * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); dQ_dx[2] = dv_dx; dQ_dx[3] = dw_dx; dQ_dx[4] = 0.5 * (-K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); + dQ_dx[5] = dEint_aux_dx; + for (int i = 0; i < Nscalars; ++i) { + dQ_dx[6 + i] = dQ_dx_data[6 + i]; + } return dQ_dx; } -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray const &Q, quokka::valarray const &dQ_dx_data, const Real T_t, - const Real u_t, const Real v_t, const Real w_t, const Real L_x) -> quokka::valarray +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray const &Q, + quokka::valarray const &dQ_dx_data, + const Real T_t, const Real u_t, const Real v_t, const Real w_t, + amrex::GpuArray const &s_t, const Real L_x) + -> quokka::valarray { // return dQ/dx corresponding to subsonic inflow on the x1 lower boundary // (This is only necessary for continuous inflows, i.e., where as shock or contact discontinuity is not desired.) @@ -146,13 +162,16 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< const Real v = Q[2]; const Real w = Q[3]; const Real P = Q[4]; - const Real Eint = quokka::EOS::ComputeEintFromPres(rho, P); - const Real T = quokka::EOS::ComputeTgasFromEint(rho, Eint); + const Real Eint_aux = Q[5]; + amrex::GpuArray s{}; + for (int i = 0; i < Nscalars; ++i) { + s[i] = Q[6 + i]; + } + + const Real T = quokka::EOS::ComputeTgasFromEint(rho, quokka::EOS::ComputeEintFromPres(rho, P)); + const Real Eint_aux_t = quokka::EOS::ComputeEintFromTgas(rho, T_t); - const Real drho_dx = dQ_dx_data[0]; const Real du_dx = dQ_dx_data[1]; - const Real dv_dx = dQ_dx_data[2]; - const Real dw_dx = dQ_dx_data[3]; const Real dP_dx = dQ_dx_data[4]; const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); @@ -162,26 +181,37 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< const Real eta_3 = 2.; const Real eta_4 = 2.; const Real eta_5 = 2.; + const Real eta_6 = 2.; const Real R = quokka::EOS_Traits::boltzmann_constant / quokka::EOS_Traits::mean_molecular_weight; // see SymPy notebook for derivation - quokka::valarray dQ_dx{}; + quokka::valarray dQ_dx{}; if (u != 0.) { dQ_dx[0] = 0.5 * - (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * u * ((M * M) - 1) * (u - u_t) - - 2 * c * eta_2 * rho * R * (T - T_t) * (c + u)) / - (L_x * (c * c) * u * (c + u)); - dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * c * rho * (c + u)); + (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - 2 * R * c * eta_2 * rho * (c + u) * (T - T_t) - + std::pow(c, 2) * eta_5 * rho * u * (std::pow(M, 2) - 1) * (u - u_t)) / + (L_x * std::pow(c, 2) * u * (c + u)); + dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / + (L_x * c * rho * (c + u)); dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); - dQ_dx[4] = 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - (c * c) * eta_5 * rho * ((M * M) - 1) * (u - u_t)) / (L_x * (c + u)); + dQ_dx[4] = + 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / (L_x * (c + u)); + dQ_dx[5] = c * eta_6 * (Eint_aux - Eint_aux_t) / (L_x * u); + for (int i = 0; i < Nscalars; ++i) { + dQ_dx[6 + i] = c * eta_6 * (s[i] - s_t[i]) / (L_x * u); + } } else { // u == 0 dQ_dx[0] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * std::pow(c, 3)); dQ_dx[1] = 0.5 * (L_x * c * (c * du_dx * rho - dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * (c * c) * rho); dQ_dx[2] = 0; dQ_dx[3] = 0; dQ_dx[4] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * c); + dQ_dx[5] = 0; + for (int i = 0; i < Nscalars; ++i) { + dQ_dx[6 + i] = 0; + } } return dQ_dx; @@ -206,29 +236,32 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda const Real u_inflow = ::u_inflow; const Real v_inflow = ::v_inflow; const Real w_inflow = ::w_inflow; - const Real P_outflow = ::P_outflow; + const GpuArray::nscalars_> s_inflow = ::s_inflow; + + constexpr int N = HydroSystem::nvar_; if (i < ilo) { // x1 lower boundary -- subsonic inflow // compute one-sided dQ/dx from the data - quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ilo, j, k); - quokka::valarray const Q_ip1 = HydroSystem::ComputePrimVars(consVar, ilo + 1, j, k); - quokka::valarray const Q_ip2 = HydroSystem::ComputePrimVars(consVar, ilo + 2, j, k); - quokka::valarray const dQ_dx_data = (-3. * Q_i + 4. * Q_ip1 - Q_ip2) / (2. * dx); + quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ilo, j, k); + quokka::valarray const Q_ip1 = HydroSystem::ComputePrimVars(consVar, ilo + 1, j, k); + quokka::valarray const Q_ip2 = HydroSystem::ComputePrimVars(consVar, ilo + 2, j, k); + quokka::valarray const dQ_dx_data = (-3. * Q_i + 4. * Q_ip1 - Q_ip2) / (2. * dx); // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, T_inflow, u_inflow, v_inflow, w_inflow, Lx); + quokka::valarray const dQ_dx = + dQ_dx_inflow_x1_lower::nscalars_>(Q_i, dQ_dx_data, T_inflow, u_inflow, v_inflow, w_inflow, s_inflow, Lx); // compute centered ghost values - quokka::valarray const Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; - quokka::valarray const Q_im2 = -2.0 * Q_ip1 - 3.0 * Q_i + 6.0 * Q_im1 + 6.0 * dx * dQ_dx; - quokka::valarray const Q_im3 = 3.0 * Q_ip1 + 10.0 * Q_i - 18.0 * Q_im1 + 6.0 * Q_im2 - 12.0 * dx * dQ_dx; - quokka::valarray const Q_im4 = -2.0 * Q_ip1 - 13.0 * Q_i + 24.0 * Q_im1 - 12.0 * Q_im2 + 4.0 * Q_im3 + 12.0 * dx * dQ_dx; + quokka::valarray const Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; + quokka::valarray const Q_im2 = -2.0 * Q_ip1 - 3.0 * Q_i + 6.0 * Q_im1 + 6.0 * dx * dQ_dx; + quokka::valarray const Q_im3 = 3.0 * Q_ip1 + 10.0 * Q_i - 18.0 * Q_im1 + 6.0 * Q_im2 - 12.0 * dx * dQ_dx; + quokka::valarray const Q_im4 = -2.0 * Q_ip1 - 13.0 * Q_i + 24.0 * Q_im1 - 12.0 * Q_im2 + 4.0 * Q_im3 + 12.0 * dx * dQ_dx; // set cell values - quokka::valarray consCell{}; + quokka::valarray consCell{}; if (i == ilo - 1) { consCell = HydroSystem::ComputeConsVars(Q_im1); } else if (i == ilo - 2) { @@ -244,27 +277,31 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; + consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; + } } else if (i > ihi) { // x1 upper boundary -- subsonic outflow // compute one-sided dQ/dx from the data - quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ihi, j, k); - quokka::valarray const Q_im1 = HydroSystem::ComputePrimVars(consVar, ihi - 1, j, k); - quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); - quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); + quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ihi, j, k); + quokka::valarray const Q_im1 = HydroSystem::ComputePrimVars(consVar, ihi - 1, j, k); + quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); + quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, P_outflow, Lx); + quokka::valarray const dQ_dx = dQ_dx_outflow_x1_upper::nscalars_>(Q_i, dQ_dx_data, P_outflow, Lx); // compute centered ghost values - quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; - quokka::valarray const Q_ip2 = -2.0 * Q_im1 - 3.0 * Q_i + 6.0 * Q_ip1 - 6.0 * dx * dQ_dx; - quokka::valarray const Q_ip3 = 3.0 * Q_im1 + 10.0 * Q_i - 18.0 * Q_ip1 + 6.0 * Q_ip2 + 12.0 * dx * dQ_dx; - quokka::valarray const Q_ip4 = -2.0 * Q_im1 - 13.0 * Q_i + 24.0 * Q_ip1 - 12.0 * Q_ip2 + 4.0 * Q_ip3 - 12.0 * dx * dQ_dx; + quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; + quokka::valarray const Q_ip2 = -2.0 * Q_im1 - 3.0 * Q_i + 6.0 * Q_ip1 - 6.0 * dx * dQ_dx; + quokka::valarray const Q_ip3 = 3.0 * Q_im1 + 10.0 * Q_i - 18.0 * Q_ip1 + 6.0 * Q_ip2 + 12.0 * dx * dQ_dx; + quokka::valarray const Q_ip4 = -2.0 * Q_im1 - 13.0 * Q_i + 24.0 * Q_ip1 - 12.0 * Q_ip2 + 4.0 * Q_ip3 - 12.0 * dx * dQ_dx; // set cell values - quokka::valarray consCell{}; + quokka::valarray consCell{}; if (i == ihi + 1) { consCell = HydroSystem::ComputeConsVars(Q_ip1); } else if (i == ihi + 2) { @@ -274,11 +311,16 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda } else if (i == ihi + 4) { consCell = HydroSystem::ComputeConsVars(Q_ip4); } + consVar(i, j, k, HydroSystem::density_index) = consCell[0]; consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; + consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; + } } } @@ -307,10 +349,12 @@ auto problem_main() -> int pp.query("rho0", ::rho0); // initial density [g/cc] pp.query("Tgas0", ::Tgas0); // initial temperature [K] pp.query("u0", ::u0); // initial velocity [cm/s] + pp.query("s0", ::s0); // initial passive scalar [dimensionless] // boundary condition parameters - pp.query("u_inflow", ::u_inflow); // inflow velocity along x-axis [cm/s] - pp.query("v_inflow", ::v_inflow); // transverse inflow velocity (v_y) [cm/s] - pp.query("w_inflow", ::w_inflow); // transverse inflow velocity (v_z) [cm/s] + pp.query("u_inflow", ::u_inflow); // inflow velocity along x-axis [cm/s] + pp.query("v_inflow", ::v_inflow); // transverse inflow velocity (v_y) [cm/s] + pp.query("w_inflow", ::w_inflow); // transverse inflow velocity (v_z) [cm/s] + pp.query("s_inflow", ::s_inflow[0]); // inflow passive scalar [dimensionless] // compute derived parameters const Real Eint0 = quokka::EOS::ComputeEintFromTgas(rho0, Tgas0); @@ -333,29 +377,34 @@ auto problem_main() -> int std::vector d(nx); std::vector vx(nx); std::vector P(nx); + std::vector s(nx); std::vector density_exact(nx); std::vector velocity_exact(nx); std::vector Pexact(nx); + std::vector sexact(nx); for (int i = 0; i < nx; ++i) { { amrex::Real rho = values.at(HydroSystem::density_index)[i]; amrex::Real xmom = values.at(HydroSystem::x1Momentum_index)[i]; amrex::Real Egas = values.at(HydroSystem::energy_index)[i]; + amrex::Real scalar = values.at(HydroSystem::scalar0_index)[i]; amrex::Real Eint = Egas - (xmom * xmom) / (2.0 * rho); amrex::Real const gamma = quokka::EOS_Traits::gamma; d.at(i) = rho; vx.at(i) = xmom / rho; P.at(i) = ((gamma - 1.0) * Eint); + s.at(i) = scalar; } { density_exact.at(i) = rho0; velocity_exact.at(i) = u_inflow; Pexact.at(i) = P_outflow; + sexact.at(i) = s_inflow[0]; } } - std::vector> const sol{d, vx, P}; - std::vector> const sol_exact{density_exact, velocity_exact, Pexact}; + std::vector> const sol{d, vx, P, s}; + std::vector> const sol_exact{density_exact, velocity_exact, Pexact, sexact}; // compute error norm amrex::Real err_sq = 0.; @@ -425,6 +474,20 @@ auto problem_main() -> int matplotlibcpp::xlabel("length x"); matplotlibcpp::tight_layout(); matplotlibcpp::save("./channel_flow_pressure.pdf"); + + matplotlibcpp::clf(); + std::map s_args; + s_args["label"] = "passive scalar"; + s_args["color"] = "C4"; + matplotlibcpp::plot(xs, s, s_args); + mpl_sarg sexact_args; + sexact_args["marker"] = "o"; + sexact_args["color"] = "C4"; + matplotlibcpp::scatter(strided_vector_from(xs_exact, skip), strided_vector_from(sexact, skip), msize, sexact_args); + matplotlibcpp::legend(); + matplotlibcpp::xlabel("length x"); + matplotlibcpp::tight_layout(); + matplotlibcpp::save("./channel_flow_scalar.pdf"); } #endif diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index 322d0b255..262412b58 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -19,31 +19,33 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAANIAAACWCAYAAACrUNY4AAAACXBIWXMAAA7EAAAOxAGVKw4bAAARuElEQVR4Ae1dXW7duBW2Cz8P0hjoAu4AXYCdrGCcHSQzQN+T7GCCPCVvwcwO0rwXyDQ7SLoCJ15AgcwCCjQwuoC23yfrXPHKvLpHFikeSoeATIrkJT9+h0f8EXV8/OrVq7Ojo6MvuGLuw+vXr5/EEjzOGVgTA9CDr2jvJtZmpB2fBAm/IszMofs9vPGwM7BiBn6JtP0R4h4zPlSkt9AsV5wIWzmiwLUI5t8o/3tcv8zNv2PoJHuIC6T/tct9E0IcA40i/eEmyv/OyQAEwKn0JfwXuDgTeIHrI8LRqUMObI6hYzUFF65IHZ+zhCC0Z6joHvwPUiHC1wjz/q3E5fQdQ8duKi5ckTpO5wpx8+YqUtkl4i4g2HuRtNRRjqFjNAkXrkgdoXOFLlDRt0hlsj5lem7nGDqGk3Bx0pW3P9Q+JTkl4aL4C+53Fl64/zvin8LnFMWMAx6SxCcOcW1wcU0iHRa38zrUrRlt7udE5Rg6dlNyoR2RXqJSLoo/4pLdpgYR4qlgj+FbUyLifAJcz3FxMc/1x773ZUiaxYmSDHGlUbYpYB1Dx14yLg4qEjrhGerl/J2O++b9aQnjYnN+5i/igJlbklTu5wGAzwhzkc9RyrI7NQDOMXRCUHFxUJFQ3u/ofLLD9CPu+ztL7Jjvu3pNhN4Bxc7IiXtO7ehyP/Fvaon/7T+EwlzydOR7pZzOMXTsJuPioCJBiZppSPskZyfcro8Qx87JuE8dtrKhAOdvPSQyEhUbPYVL4Iops8RlXcM5hq5XpOTioCJ11TaLdo5O10Fc81YXccU6Z4BFgs12Zg8n037CRfxZO6qAGPD50JHRMcwmI9IcDyXH0DGfhIsxikTh9xWG66NG8Oigz3DJU7WDOX+IIw/XQ1sHXFzn8aKSlXbc4XwQAXGOuCtgDR9UkWxJohxDR2MSLsYo0s6TvO2c7BCiXN/P1Ak6Cnoh1E9FpsLL0/2ojSNZ3L0TrL1fzncLDJwaf4PfjOasGWHi5vrzKe9zO8fQMZyKi5OuyIMhbiG/Q8VcxHNBTMXiU5SHLX+Gb2HDQdZBfF9ETHR898Vt8OJK1KC5+SO8PcQtuaT/w8wYHcONLPh3MhfHwfdIHFF2Rp2unjpCwM8dxQfwSYw7ZyArA+hnfIfKryaOx0ztsoJKVDhHpDkW64ngejFLYWAxioSngqyPLpciHG9HPQwsRpFAueyE+YhUT/9bDNIlKRK3vB9hZJpj+3gxHcAbkoaBMbt2aWrMVEqrQD4aZeLXix1mYEkj0nBLPdUZyMjAYkakjBx50RkZaDeJ+DKaL8yrfW3hipSxk3jRwwxAcXhsi68s6LjrWq1zRapWdPUDhyLxtAnPF26PS9XaKl8j1So5x22KgdEjEp4e8sEcz4gVMWxoisE7grHAowUMd6Qv+c+mcjFqREJlX9CCooYNkzNYoEALPFrAUID6aJUpuFArEiorbtgwykJlkRZ4tIDBithScaFWJDS8+fI0QgDPts1l2DBSfXVRFni0gMGK4JJwMUaRuE35LdJ6+fRCtjEjWTwqYMACjxYwBJQUDSbh4kTTBAx/mj3+7VepmjJT52kxmjZiaYFHCxhE9sCyQZgm09iZN7hvPhqFTxuK2V1KLlSKhBaJkgwdCNUoW05yaMSSX8bynQTNcYXWjsSIJYfxks4CjxYwNDKArDib4ZfXpVwyLsZM7Q419vRQhlzpEMgZypbvkKowYjnARTEeA0wWMARwigZVXGgVKbY2ktaJVvO9UilXixFLCzxawFCqn/TrTcaFamqHJ/41LoKITd8kTjYd+mCz3xMfK4HPuTbxhNM6zsMZV/wTC+LEBSjleLSAgQQAx//oDznkOR5Kn5qWkgsqErXyb7j+ewAYOyI7Zd/JiFS8owIY10DWjVha4LE4htxK0u+kA/dTuPgnyqXuHHFqR0X4SxuGt9fRNpx8zh1mOsfNXIYNw3pjYSr6VS/BmhFLCzxawNATU7HbKVz8GaipO40iqVqAJwinS0UNGyqA7kwvgZmbEFR+US4LRiyL81iJLBXinp4lFRec2o1xHH1oEPIh/FKGDYfw1mDEkvgt8GgBw5As50ybzMWiDETOybzX5QxgQOH7ycZA5NgRydlzBpIzgA7JXdWXuGSW8wZxMh1PXl+OArnZ4M4ZKM3APwDgPZSHR4Pe4OJ9Vc4VqSpxLQ8slIf/7OBzMAJxw4j/opSjVDXOFakaUS0WKA+tcgtaXPOKBYp0LRE1+K5INUhpoRjbUWeD5oX/GI4v1eV/FlfTct9sqEZUiwR6wVbJ6AOfSsU4bkdX5VyRqhLX4sDy1MkHKBDXSZzK0ZjOuSgWwtU4KtJ3LVrxqwHvQKtngOshbnVXN5Vrmf+TSIBrpP+0N+JLmvvOQG4GeITLwmHnu7bzX/JD32wQJtyflYF2PfSpxmlcjChfI8VY8bjsDECB+L6Ia6RFOB+RFiFGb0RpBlyRSkvA618EA6OndhiSzdv+rgGjhd5jgScLGCiLqThGjUiozLzt7xowGlGi4rK0IqsUONSKhMr47QUPE273/BHmSzTevzXSOcxjdJ5uGLDSn1LhUCsSms8zULFvRC4RfwFAFk7r1oDxpieV/WuBJwsYKIUkOMYo0gUq/RaRv9hJYHppVwPG0hyxfgs8WcCQjIsTjVSVo819TVm58lSEkdNPnin7Asw0hLJ1uOfnBE/hZ/uEwAJPFjCQ9JQ4tCOSKMmQgEtP7WrASPvk/Ar0Iy7Z/aRMKVQq2GP4Qxw3eSf+scCTBQykMRkOKhKnZvy4KjZtQ7TanapzlstYDCMU5AzN5nqSzrp98mI83dDT/LWAgUCGcPCcIHWnsWu3gc9dN9FOxvfdkJLJ72i4oqSzjtGKfXILPFnAwL46FQfXec2OtWpqF0w3YtM3iZNNhyLKZB2j4INP8snZdn2EOD7MGJf9JLTgaOuDt+NmkaUFDGx1ShwqRWqpnmIjeUdaGW9qwMjt1tL2yS3wZAEDu2ISHGMUiTtK1m1/14CRo88VJRi4ue2TW+DJAgaKIAkOtSJhGCxuszroeNFgDRgBfGcKDMzchJjVPrkFnixgYCdKhUP1HokVtu4cvmXb34RpHaMV++QWeLKAIUmfcdvfpNGdM3AHBjCa8d1fY/tbPbW7Qz3+E2dgNQy4Iq1G1N7QnAy4IuVk18teDQOuSKsRtTc0JwNUpO/aCsTPWZ+X7QwsiQE3ELkkaXpbijHgBiKLUe8VL5IBXyMtUqzeqLkZcEWam3Gvb5EMuCItUqzeqLkZGHvWjof85BNpfshH2wM8e7dzEHPuRvTrc4x9RuzeW5HVVByjRiRUVtyo4KEu4RgPMWQn3YqsUuBQKxIqM2980THaUZJDSKzIKhUOtSKBmCSG9A4RPDHdMU4kcMafW5FVEhxjFIm2BmLGImR9xPTSzjGWloC+fiuySoLjRNNuDH9iFGMou1gTGsqTLc0x6qhteVq9kUqylbLPcESSM3bixyQiSnIdS2zjNMo28PPJSY5RR6Ebqex4mtpnspy1O+3wmQ2tGiOewGeQzGUrHTdSqeumQ31m9Fm72NpIYIhWu4FIYWS/X5pHN1K5K5tk8lBtNuBJJlO62PRN4mTTYRfqTHeO8TDRwhF8LrApt9UaqSRbwkfLBaNCN6pfqxSpLT2JIb0QaYawY9SRyi1fN1J5w1WSPjNGkZIY0tPJ+c65HKOOug2yXfWyrtFIJSlI0mfUioRh0A1E9nreXW6N8LgzDQcmbkKszkgl5ZdKHqr3SEGHsWLQL4B0K+gYb1FyK8KNVO5SMrnPuIHIXUL9zhlQM4DRzA1EqtnyjM6AggH1GklRlmdxBlbLgCvSakXvDU/JgCtSSja9rNUyQEXiVmiKf8a8WhK94atlgC9zR/0z5tUy5Q13BgYY4FGr5p8xj32PNFBm2SRsRfJs1MsWxab1nyL+uiwyr30NDCxGkSAsWjNqhlkKDmE+KWishZaO3DkDWRlY0mbDMygPh1pxNBu2QRyPv7hzBrIysCRF4mj0OStbXrgzsIeB0VM7POFNGogEru23NW1bqVj8VKB/ynkPFfNGW+DRAoZ5Wd9f21QuRo1IqMy8gUhSBZyczj3GxcOI5pwFHi1gsCKYFFyoFQmVmTcQScEA5wYeR81zhM3t2Fng0QIGysqCS8WFWpHQ6CSG9HKSB1KoRC/gP8J1zfs2Lme1Y8u2wKMFDGN5y5U/CRdjFIk7YjFjEfKRWLhjlqvRe8ttFYZb3m8RPuOFML+7iWHeW84MCRZ4tIBhBqpVVSTh4kRTFTqlGIIYyn5/KDFVGrBw2iYWizh1+4w4bihw/Uac9LcOadt3S9vIIIB0EsmnEsuSEU0eDkHO6UHUVZxHQxiKGqmkNFNyoVIk1ClKws62z2k6yb7fHoxHo9nJP+Li1O0DfwCfIxCVgFO5PzJujMNvqJT34DfKBp9KRUUcXZay3uI8AqcFDDRSSTlyQ+gdru2OK+KoYI/hU665XTIuxkztDjXq9FCGielUog8guFGitqwf4TN+tGuFSIGFIxbfQ1GxqFClXG4eNe3KhgHcngFALUYqyZWKC+2INLTOEK2W6ZZGUKPygHyOPByR3oQ/RPyUkYNPQq6hQsc66HKNrkV5vGna4JoxuyyBIXy3xwfhjkxxz4dYPw5RWVwyeahGJHRYmdLFOpjEZVlXtPSR8E8BjkmsohwKi7h/6xUkIxHXXMldgF84C+uQuJw8HpXGIPXDFxmE0zo+yMgDP0/I7gQLKhLuwzolTiUPlSK1pScxpBci1YTRWDaI152mcHvqaLY8AyIl208I8ImpIk9+NNIvwmMPowUMlEFpI5WkJQkXYxQpiSG9nkAP3gad/TqWGekyisSS98XxNzvn8lAO5+68ci9yi/DYI8ICBo4+/ZF/biOVpCUJF2pFQkcraSCSdd/q4MDEXbeheS6J2nH4DUc3ClHWA0dtHAl9jnBfuDu/n3qD8kvy2MC3gAFAdkZ9YOJDbFYjlSQjFRcnLGyEO0defvfzED43F+j/gPvcnY8dnPVScb7ioqNCvEFcdKRqcsT/yAjG7def2yz8ZukJ7rO2I4BThMegfgZLY7BipDIJF6szEAll4Q7gA/jsSO6cgTszgD60agORHJG4wHTnDCRjQL1GSlZjwYLwBJH10WVBGF71AhlYlSJBflzM0vmIdMOD/03EwNoUiVvezScWifjzYpyBhoGxu3ZV04apHXf4fDSqWoo2wa9tRLIpBUdVPQOuSNWL0BtggQFXJAtScAzVM+CKVL0IvQEWGHBFsiAFx1A9A6N37bDzxfNudDxrxzNqPAO3cwCRiSWdY9Sxb4EnCxh0bA3nGjUiodG0Z3AJnwc+f0WYBw8/IrwZrma+VMeo49oCTxYw6Ng6nEutSGi0eQORjvGwwJnDAk8WMOjY0uVSKxKK4/dAsc8MeG7tAsTwHFtp5xh1ErDAkwUMOrYUucYoEk9Nf4uUKesjppd2jlEnAQs8WcCgY0uR60SRh1MBzWiz/eJUU2bqPI5Rx6gFnixgIFstjiSGKrUjkigJz6rtcxpl2/fbFPGOUceiBZ4sYCBbNFTJTTMa1pHdaMZTycRQ5VCfb/Lyj1aRtj8YCJwOpFlJcow6SVjgKSsGKMoZqJDv0mh0pb9sYVxsTyDKoFaR+pWEhcnTJZuByLCygbBjHCAnSLLAkwUMNAUmVntpN5EmCELHNdz7MGIorFIkVCjDW2z6JnGy6TBUX7Y0x6ij1gJPljAACxWGfXiSoUqVIrUiSmJITyfuO+dyjDrqLPBkAQPZ4jb8ZEOVYxSJdt/kU20CEHeOwFXwlJH4Er5j1LFugScLGMjWBtdVj7bRhirVigRFKW7YsNfYW7eO8RYl0QgLPFnA0JKzsyQBLm5CjDZUqXqPFEiDo8/sBiKD+jVBx6hhqbyBSKK0IKskhipXZyBS18c8lzNwmAGMXqs2EHmYIc/hDIxkQL1GGlmuZ3cGVsWAK9KqxO2NzcVAuNnwFXO+fj38n63cZ3fnDKyaAegB/wsKt8qjjorE7b/wHxKHGXe2BsMEDzsDK2Ng51Brv+3/B6YuG4JXZLzHAAAAAElFTkSuQmCC", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}u & \\rho & 0 & 0 & 0\\\\0 & u & 0 & 0 & \\frac{1}{\\rho}\\\\0 & 0 & u & 0 & 0\\\\0 & 0 & 0 & u & 0\\\\0 & c^{2} \\rho & 0 & 0 & u\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}u & \\rho & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & \\frac{1}{\\rho} & 0\\\\0 & 0 & u & 0 & 0 & 0\\\\0 & 0 & 0 & u & 0 & 0\\\\0 & c^{2} \\rho & 0 & 0 & u & 0\\\\0 & 0 & 0 & 0 & 0 & u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡u ρ 0 0 0⎤\n", - "⎢ ⎥\n", - "⎢ 1⎥\n", - "⎢0 u 0 0 ─⎥\n", - "⎢ ρ⎥\n", - "⎢ ⎥\n", - "⎢0 0 u 0 0⎥\n", - "⎢ ⎥\n", - "⎢0 0 0 u 0⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎥\n", - "⎣0 c ⋅ρ 0 0 u⎦" + "⎡u ρ 0 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢ 1 ⎥\n", + "⎢0 u 0 0 ─ 0⎥\n", + "⎢ ρ ⎥\n", + "⎢ ⎥\n", + "⎢0 0 u 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢0 0 0 u 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢0 c ⋅ρ 0 0 u 0⎥\n", + "⎢ ⎥\n", + "⎣0 0 0 0 0 u⎦" ] }, - "execution_count": 2, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -54,39 +56,44 @@ "u = Symbol('u') # normal velocity\n", "\n", "# Jacobian for primitive variable Euler equations\n", - "F = Matrix([[u, rho, 0, 0, 0],\n", - " [0, u, 0, 0, 1/rho],\n", - " [0, 0, u, 0, 0],\n", - " [0, 0, 0, u, 0],\n", - " [0, rho*c**2, 0, 0, u]])\n", + "# \\partial_t Q + F \\partial_x Q = 0\n", + "# Q = [rho, u, v, w, P, s], where s is a passive scalar\n", + "F = Matrix([[u, rho, 0, 0, 0, 0],\n", + " [0, u, 0, 0, 1/rho, 0],\n", + " [0, 0, u, 0, 0, 0],\n", + " [0, 0, 0, u, 0, 0],\n", + " [0, rho*c**2, 0, 0, u, 0],\n", + " [0, 0, 0, 0, 0, u]])\n", "F" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0 & - c \\rho & 0 & 0 & 1\\\\- c^{2} & 0 & 0 & 0 & 1\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\0 & c \\rho & 0 & 0 & 1\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}0 & - c \\rho & 0 & 0 & 1 & 0\\\\- c^{2} & 0 & 0 & 0 & 1 & 0\\\\0 & 0 & 1 & 0 & 0 & 0\\\\0 & 0 & 0 & 1 & 0 & 0\\\\0 & c \\rho & 0 & 0 & 1 & 0\\\\0 & 0 & 0 & 0 & 0 & 1\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 0 -c⋅ρ 0 0 1⎤\n", - "⎢ ⎥\n", - "⎢ 2 ⎥\n", - "⎢-c 0 0 0 1⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 1 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 1 0⎥\n", - "⎢ ⎥\n", - "⎣ 0 c⋅ρ 0 0 1⎦" + "⎡ 0 -c⋅ρ 0 0 1 0⎤\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢-c 0 0 0 1 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 c⋅ρ 0 0 1 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 1⎦" ] }, - "execution_count": 3, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -97,7 +104,7 @@ "rho = Symbol('rho')\n", "lambda_list = [eval for (eval, n, es) in F.left_eigenvects()]\n", "Sinv_list = [[ev for ev in es] for (v, n, es) in F.left_eigenvects()]\n", - "Sinv = Matrix([Sinv_list[1][0], Sinv_list[0][2], Sinv_list[0][0], Sinv_list[0][1], Sinv_list[2][0]])\n", + "Sinv = Matrix([Sinv_list[1][0], Sinv_list[0][2], Sinv_list[0][0], Sinv_list[0][1], Sinv_list[2][0], Sinv_list[0][3]])\n", "Sinv" ] }, @@ -108,20 +115,22 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPMAAAB9CAYAAAB3TFWXAAAACXBIWXMAAA7EAAAOxAGVKw4bAAANl0lEQVR4Ae1d7Y3cyBEdGfv7oLMABzCXwa4VwckZ6C4D3Wbgg39J/wQpA9kRGFYGkiPY02agC8CAD4uLwO/RrAWnl8Phcrq7HtnVALfJbrKr3isW+4Oc2ievX7++3O12X7CNpY9v3rz5YawiyoKBYKAuA/DFr5C4H5OKuicXg4r32OfJw/Tr8CD2g4FgwJWBdyPS/4KylywfOvMHeHc47whbURQMKDAA//x7qgfKWPTAmdPz4rgwAzCEPWn/C1HfYXtX84HqLZ/0KuhAPc5NCjj+cC6IuH4ZAzA+1ylukP+MjVOcn7F9wv7onGiZlONXecunZgo6HGdofo0KjlU6M8h7ge2n+XRrndnr/hT5R9MM+3fY5/EHKyuVe8snLgUdcvCrhGOVzgwjPO23HPbwaINvCG5HBN+gjA8q4iuZvOUTm4IOOTiWwbFWZ85hBM82XkD4byMK2AIk60smb/nEpqBDDo5lcFzkQPOYNtDrcNGHCz5MHFr+grKxXqo7Ieefvsfj8JyLTV9wfLA6iON/ofwVcupVJPU6nGr7j6dOWFrvLZ96K+iwlL/hdWo4qvXMAL7HxvfYXPR5zw37V9hsRXfIU6n9v/VyP6VyUU4nf4m8mCP3oMxRp+Q8LUUA2vWWT2gKOuSgWApHNWcGc3QgflF2v+iD4x/7cmRlE+ReQgLnpEx80Z4Oc1lWZYRABU6kZyfqS1d7yyc+BR1y8FwNx6xhNhyBPcW/sT2mx/gB13XOgZwrtHtsb7HdJ5R/e38wstNfxzlJmronIuqv0woc36KcixJp+hXl5qx8iBzogmPKScvSNnIcpw+RYZv2pLdpyLAu1763fOJQ0CEHn1I45jozh4RXZ6Cn83yGM7Gd2emIs+5Qzi9eOGznUH1WwrmdbOR0Wj6U7ufLKOODhmWfsRVN1AMbZVBemqzMFsLS+rOPveUTgIIOZxMpiKP4MBuG4w3KjcNshcRem7303UCZ7nM4lN0Oykru8qHBB0iarGcu/VDxlk/cCjqk/C85lsFRw5nNaSw/IAwOxJ6yZqITpU7L+XLnQNDnJ2x8+JRMXDX/84gAjn44TRjlauT8pUXe8qm3gg5L+RteJ4OjuDP3qDmkfTCPxU3LleypeceQtFz7B0NY6MCFMTqWOfh3pZ0J7ZOP35B3IwICwz4fIJyOvOJxyeQtn9gUdMjBsRKOWXPmc0ED8DU2/oiAzms/s+TN+xZlpXuhVH1+A/2PXhcuNNG52SNSv78i/ye2GslkPocw6sH8e+hgD5XSOnjLJz4FHXLwLIHjySA4AXukg14rB8oSbUBP9miPWgAroUe0GQx4MwBf4PcR/Pnyk1rD7NyY2ZvX7tFzY4j2goGsDFQZZmfVGI3hKdQtVuVuN9oLBtbMwFp75jVzHroHA0UYCGcuQms0GgzUZyCcuT7nITEYKMJAOHMRWqPRYKA+A+HM9TkPicFAEQbCmYvQGo0GA/UZCGeuz3lIDAaKMBDOXITWaDQYqM+A5Ecj+CjEQgnxm+XqweHrm8FHogLPCjrkYF8Bh1zPDFK+gFy34PA5DLuGNhR4VtAhh61UcEg5M0jhR+NuweFzGHYNbSjwrKBDDlsp4ZByZpDL3zyP/QTwBuUvQBx/NhnpfAYUeFbQ4Xwmhe5ZNWdm1JGxYAX200zWRzqfAQWeFXQ4n0mhYP4XOdDkaGNmr2sxsnKIdGmjx+kWiF+BZwUdchhfDYdSz2yOOvU75S0Ms70D8SvwrKBDDn+WwqHkzHPIfTbnJNVz8CS/hG6c/zMpB+JX4FlBh/9b6ry/1XDQmb/pdbX8PNWXXz02V7bW7AnI985rTgzxa//Rg8H70n/fynlk6RhkCjwr6JDjPlLA8ScDItMz4ya34fXYUNrKbCHM9F9VbhiR02mJqXogftOhl5/yV4VnBR1S4EuO1XDQmX/vgVi+BFeua2QCiucCdKQdvpbxDMSvwLOCDkfM86hibxz/MW1leuZeIZmA4kZQoXyPdm+TtmsG4lfgWUGHxASLDmVwSDkzhi2uweEXmXLZRQfTBeDmwli1QPwKPCvosMx0h1cp4ZB5zzyg6Ar7DEj/HLlHcPiBKsV2FQLxK/CsoEMOI0vgWGUQ/BzsRxvBwBYYQKe3+iD4W7BDYAgGsjIgNWfOiiwaCwYaYyCcuTGDB9ztMhDOvF3bBrLGGAhnbszgAXe7DIQzb9e2gawxBujM/IDhGtvUR+ON0RJwg4HVMMDPSem/OzrzHht/vWO/TMJupGAgGFgJA/zRTvfruxhmr8RioWYwcIqBcOZTDEV9MLASBhS/zd7hE7UmguC3gnPKF7bCgQIOuZ4ZpDQRBL8VnCcceRO2VrGllDODlCaC4LeC84Qjb8LWSraUcmYYfyuB0afuY9a1gnOKh61wIINDzZm5zD72vtt+zM/6LaRWcE7ZaiscyOC4mGK7Zh2GKxZMbkrs6t+FK+DsdWg6EP/UTTa3TsGWQ12VemZz1Luhgsn+HIdPLpE7VMAZgfjz3BYKtrxHouTM90pN7DybqNtSVTGc6E0uQdRNT1YE4i9/1xSzZao6nfmbvtDy9Jxax2NzZZNtT8C1B8EnHm+cEYjf7qrzc29bEsFBEPzfe0yWnw9xQQvoMWx4PTaUtjJbCFsgQeMSb5wmHzkXbshrk4H4c9wNxmXPY9pkrXtWNm62d0Dx1CCljhVw8pVK64H4c9hXwZYdDrU5s0xA8RxWnmhDAece+t0mOrYWiD+Bv+hQwZad4lLOjGFLE0HwRXAeTFmgExfGmgrEv8h1k4tEbNlpJfOeecCRREDxgT6ldr1xRiD+fJb1tmWHJILg5zNotBQMVGcAI4MIgl+d9RAYDBRmQGrOXBhrNB8MbJqBcOZNmzfAtcRAOHNL1g6sm2YgnHnT5g1wLTEQztyStQPrphmgM0cQ/E2bOMBtnIEIgr9xAwe8dhjgD2YiCH479g6kLTAQc+YWrBwYm2BA8dvsHT5RiyD4FW6/VniuQKXEPSvXM+MG20Rg9FM3kDdOb/mn+FlTvQqXUs4MUjYRGP3UjeiN01v+KX7WVK/EpZQzw4gyAcUL31DeOL3lF6a3avMyXKo5M5fZx4Kk2Q/pWb+F5I3TW/4WbGgYZLi8MI28cwxXLADalCoWpXPqHOk6b5ze8mmcXge3IPy5bhAFLodYlHpmc9S7oYLJ/hyHTy6RO/TG6S2fBvEOwp/rplDg8h6LkjPfKzWxUy2g+IQONaq8cRaTj97sEgSuIQh/LjsX4zJVUMmZx+bKpq89ASMIvjGyPPfmWSEI/3L2Dq/05vJAGxlnxhPbhtdjQ2krs4WwAxBrOvDGqSIfenDhiHatHoQ/1/3izWWKQ8aZe8VkAoqnRGU+9sbpLZ908pWOZxD+XCZV4LLDoubMMgHFc1n6SDveOL3lk5Y9ttuEn5pB+BPRiw8VuOyUl3JmDFsiCP5u92rxbTXzQhGeD6ZM0IkLY9WC8M+k6uRpIlx2esq8Zx6wdoX9dyDpOXIueDH/HsfpUxzFq07eOL3lKwThz3UDeXPZ4Ygg+LnMGe0EAw4MoJOLIPgOvIfIYKAoA1Jz5qJIo/FgYOMMhDNv3MABrx0GwpnbsXUg3TgD4cwbN3DAa4eBcOZ2bB1IN85AOPPGDRzw2mEgnLkdWwfSjTMQzrxxAwe8dhgIZ27H1oF04wwofpu9wydqEQS/wo2nwLOCDhWoriJCrmeGcSMIfgXTK/CsoEMFqquJkHJmGDeC4Pf/0a/kHaDAs4IOuTgGlhc9nlxNLmpHypmBQCag+CI251/kjdNbPplS0GG+xabPZPgjC201fWbBWjVnZlyosSBp9kN21m8heeP0lk8bKuiwhXvpHsPF/Z7zDoYpc55sFqXTWdvl4r1xessncwo6DC0IfbjgapFf77D/C8qqBMPoucjyDwGUemZzVJJ5LM1x+GPXqpR74/SWTzso6LCDI+2xfYU+N8jfc8N+FzWESlZK2f4hgJIzz+Hu2ZyTNnCON05v+TRhDR0+Qc5HOPHHwT3zI/ZZXjxB7iWE3PSCGMwwnWKybPYIQWaYPQKkx9hl9iS3odCwbm37qcGG+tfA6S2feN11gCN9gB57bG+pkCWUf2v7ad5fw7l+mjq7of46rcDxLcq52DeWGGrYnJUPkQNdcExZadlYO12ZjDMD1B02KjU2lLYyWwjrlF/jH2+c3vJpMwUdoAad5zN1oU5zEs4dc1bieYnrOWTnMH12wvmdbOR0Wt7jZ/1DALVhtkxA8dkWWXaiN05v+WTNTQc4Dx2HW5XhNMGeSOy5z/6HAGrOLBNQ/AT551Z74/SWT/7cdLAeETp0PWNqzL6nTItLHnO4b8Ntk/Pofwgg5cwgMYLgNxIEX8DWvNcezGWhF19TTc3pzdly5gfTR+jAhbFH/0MAmTnzgJkr7EcQ/AEhhXYVeHbTAQ5zTcftnZevp5g49H6LstEeuzujzJ8s/xAgguCXMU602hADcP5FC2A5KILsCIKfg8hoIxjoGWBPXrs3f0C+4jD7gZJREAwoM4DekSvz7klqAcydjVAgGFgxA+HMKzZeqB4MDBkIZx6yEfvBwIoZGM6Zv2Lsn0LhR+gP3sWlJ8VxMBAMlGcAvshXaPtjkujMfGE9+s1pX3fs2igPBoKBugxYoMtRqf8DnveyDVhRP7EAAAAASUVORK5CYII=", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- c + u & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & 0\\\\0 & 0 & u & 0 & 0\\\\0 & 0 & 0 & u & 0\\\\0 & 0 & 0 & 0 & c + u\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}- c + u & 0 & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & 0 & 0\\\\0 & 0 & u & 0 & 0 & 0\\\\0 & 0 & 0 & u & 0 & 0\\\\0 & 0 & 0 & 0 & c + u & 0\\\\0 & 0 & 0 & 0 & 0 & u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡-c + u 0 0 0 0 ⎤\n", - "⎢ ⎥\n", - "⎢ 0 u 0 0 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 u 0 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 u 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 0 0 0 0 c + u⎦" + "⎡-c + u 0 0 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢ 0 u 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 u 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 u 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 c + u 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 u⎦" ] }, "execution_count": 4, @@ -131,7 +140,7 @@ ], "source": [ "# compute eigenvalue matrix \\lambda\n", - "lambda_waves = diag(lambda_list[1], lambda_list[0], lambda_list[0], lambda_list[0], lambda_list[2])\n", + "lambda_waves = diag(lambda_list[1], lambda_list[0], lambda_list[0], lambda_list[0], lambda_list[2], lambda_list[0])\n", "lambda_waves" ] }, @@ -142,25 +151,27 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & - \\frac{1}{c^{2}} & 0 & 0 & \\frac{1}{2 c^{2}}\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & 0 & \\frac{1}{2 c \\rho}\\\\0 & 0 & 1 & 0 & 0\\\\0 & 0 & 0 & 1 & 0\\\\\\frac{1}{2} & 0 & 0 & 0 & \\frac{1}{2}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & - \\frac{1}{c^{2}} & 0 & 0 & \\frac{1}{2 c^{2}} & 0\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & 0 & \\frac{1}{2 c \\rho} & 0\\\\0 & 0 & 1 & 0 & 0 & 0\\\\0 & 0 & 0 & 1 & 0 & 0\\\\\\frac{1}{2} & 0 & 0 & 0 & \\frac{1}{2} & 0\\\\0 & 0 & 0 & 0 & 0 & 1\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 1 -1 1 ⎤\n", - "⎢──── ─── 0 0 ──── ⎥\n", - "⎢ 2 2 2 ⎥\n", - "⎢2⋅c c 2⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ -1 1 ⎥\n", - "⎢───── 0 0 0 ─────⎥\n", - "⎢2⋅c⋅ρ 2⋅c⋅ρ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 1 0 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 1 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 1/2 0 0 0 1/2 ⎦" + "⎡ 1 -1 1 ⎤\n", + "⎢──── ─── 0 0 ──── 0⎥\n", + "⎢ 2 2 2 ⎥\n", + "⎢2⋅c c 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ -1 1 ⎥\n", + "⎢───── 0 0 0 ───── 0⎥\n", + "⎢2⋅c⋅ρ 2⋅c⋅ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1/2 0 0 0 1/2 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 1⎦" ] }, "execution_count": 5, @@ -181,9 +192,9 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAANQAAACmCAYAAACiNKHSAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2d25HdNtLHj1Tz7JqVqxyANgPbisByBr5EIDkDufSkfVOtM7AVgezNwN4ILDsD775vlfVNOQF9/x8GTYE8IAmSAC9z0FU4AHHtbqDRjQt57r179+40F/7xj388Vdn/yP9lbh2p5dTGP5X3mdwnCv9u5RR+rPC3cvg/yN3IXcs9kAO+VZ7/3Ab389tHz1YYCp/v5b7Zqv270u79uYSI+V+oLIO7uDB5HL/HV3uNMPln2v9JDsH+Rg4Bwv+SOLmf5fYIUXo2RPSf4tleebUhW6Y1fSUmfqwiv/UU+5cfmK1kxaEBnsv/pJVQ9gEB7hPez3vS/lT8w7Joza59iJ7Zlc4tqL5kQvpJ7pncd3PqUbmHcruzBqbSMkSH0v5QfdExpbR7V0FjMJHMIfQxB43gZtgwc86wkHNCqzrBifDXcq/lYoC59ySSgAnzr0j86lFj9CgdGpjcHimMdnWgMIO8ebb4Er7a+UHuD+/fTGlDZTDHGS99Y2ZKdVvnZWL4Qi42sbD06AITOhPkKRQobOhRZigP0vmpfCopAqobAUJrfg5Ocgw0CDkTGqWBD/kb7eXjyP+LwpuvC4TDID0+/WP538m941nuRg66EbQ1gYnylVyyEAtPBtOH8mMDcE3cs7QlOhg39MdTOdblDXSfSVAcnhOo+4QmAhsArUYmlk/JbsLQEnAh3lo/+YoYcMymEI+5wkzJQHyi8ObCJDyAMXoeKA/agU5hAoEeANreuNB6P/QtszOTwCj4fJj/jIs7A6KHyYG1eBIfjPArC0zw2dkrpp08Hl/JD2dIBlajgXwe88CFGaXI7Kh6aRsTYMkkMkiP6nYTh3zM2tCUfqTnVTcKhAOakYkLnFNoZrIIcdbjnQHogr7kiXmShhKjmfmBYrOm2mBGwIXaCaH5mTSfrscGGPAlB53h0zQ4JTCRHmgJtbCbSFSH8X1K00vy0r/hhDZU11fCL0XwhurYZZqnC/qStdQkgRLVdHBokmRnhJC/UaU4B3pmMLmBJZ9ZswGlna2fmsSdBKbQ41E2bQXNdCTPhNcENoI+HWtQtDkTdSzfwdPhf2vcDdFzNZQYScMEaQZ7JD1XFLMj50lsTLwlLIc5xA6Ua1/+Mz2b6Ymt+9LSFL83GKXHI/xEPnQzoOlIdigxsUOtpcc2KD9mCUcEAPx5o7izMopDMMGFPExGfYfelHXWgMoM9bczt5V3EFLxG6xkQaLav1Zx+Ph3ud/03NKoembXmjV3jFaWGtDZKqPnKEwVKBBjgBcFEQYRfWsm17bysGYqsm7KTVwKPbSpfAgQziAMW1zjKz9CgbmLYLi88rH7ERqbbBR0dSN0CIlbD8hHuJiw/ibXBetj6j8TzCAzWqx3/aQ2kvEL6iwRdJsmwgeNyg5mIxyKQ9DYhIFnMWByg1dJcD8p1/tM7EbFpPh9jhpakwMIE4fvoeBhnrTWlH4gMWjCxfUb5UPAYoPF+pj+HoKxCTYJv6EGlqaJPpYMv/p6mGRssrCqiRuaNMjPxJAE2TSUEIe5/5bDT4UvVa5FjJ7nXy4caFX13htIPimdmTY2uNygUno4GK2q3xXfN7O5PErPRo/qamhQGHzp6JeGDL7iYxqHWbm7rW2DJNZf3UEXNhGGeyfYifg1dapclnHUVHi75rcxxmTT4pee6fNuXFDcmd4xHoV5mvBUgbpRyeisJUaQtvgqkuppBk2D5QoBtRsTmJPiMRPYNp9lXqpcKXoYHBwXwPdeUDoDhgHxYyeTTR422MJk6+NUwQrLWjgJP8tsvqdn8Tjq1HcK+BCae0wq8GZoedE7aVgboX8/fKjhY3BAg4NBgGuZdj3Yo0HRpDeddDZ52LF1u4qdNOoGumVuY9//InCWt4mdiF9TrnAAPnR3qJksT8I3NqkYOtCXPLFMFSiYf8ZAa3kNX8RzK5rrOR+v0V6pNpbQobI20M1voal00z7EE2a91IDnHfzrM1dTNRTjwUzHsH7Dy/wmjUAHv1ZawQfw7AoO6yennYTTU7nrSPvwIjbpRLKeTlMFisUdOztbgttVEvFd5myJ05y2l9KB6XImEOILu3luRvUDhIFkAnLycWwTc9TQx0PK3Cg9KhBKM6D8I3vo+KP4dfKXfmwJhWhjQmEsGw/+3kMv5qflGcXxajRHOwMVp5xPtEvlfUJND9m8eVsrV9siOtT5CATaGgFiaxdghg3P40xTsa3+zOW4PYs52wzyaeYxiFJ4/Fr5EM4zSMTvrFzBCDZlXnl+cWaHgEEnPIQ30BIDeBhdX8cyTxIoNWyLYCQ7heGxNifFqU0GyXM5Bg1hbP8W8Z4hinYHdwwwBiuHeDCrNTMpbhMoQYfq7O7cdWlzW8KeB1M2Vehfp0G7FYbPqpe12UmOm9lns7jixvALqysaFi5o2zON3hPncFEZNPVJfvJYn2ryUT+7RXRUcRAhCBCHj7xaggkBYajqhkDFM7twFsOAwbQhL2EGBXmXAh2Bmw3CZys6mF0bXqUQ4HGFb/RzCjCBJc/gKRXuKA8TAvQlwxyBYubidHkNgBi0YkvL6DmcDbH1LZ2BaztfXCUJDzxn4as6aL/Zap1VyW2nrEqHcIYXzLB2qJmKOtvdTFBJk4jnDccKbjZPbWTv+Tw9k98ymCxQaojBzODArCoNdG5oo5/NuMIjHOykOyHyeJbGL7X+LehAQwOTNJTyMytPNdUwpUZNROU5EkDPZM07WaA8R57If16SOxIIZlicaR+aw9SMvsah/JgpjbbS8y5mzA3pYKucN56TNI3ynpQXywOTOeQ5SYPg22CTBPP78ODpgJ5JfIDwWQLlGchu0iT7cgqnfRvNYNAzAmMaihn/pDhU8v/5er+WHzJg6izrq8nrCT9oWJ0O2pVL1k7KywTE7h/rz8mgchyazio7ubHCBaADeuY0czWnEGXUIHb2A7nHcskdN7E9TAm2fNmYeEtYDsGx1zgYND/KMTO6tZMP63Gy2UKZUnAEOuBtbBesFE/uZL33Xrx4wczPgOVga5ZU3knOVKIqBxI5ILkxU/nebA2V2NYhsokhLEBZmy3eFTwEwTtCUjy/Fjq8pfCZwo1pvCMUJ6Eyaw01qYWdZ/bChOlahWmDvvJCxCYXb9IiXIeGixYodSCqmm8M1rXDhsNY/Ocohg0u3ts6NFysQKkTWTvSiZ8dugfvCPLqD84Tr+Wvcb5ZjGsXK1DiKLMhH5c8vN2+ZHSI/j29DoOlwAXWw5p+F7kp4WdBNNQk7cTgUxm26O/EX+qIDoANGb64G17ncglr/wgHdwyidpnsDmmGX6RAqbMQDA7vpmqn6OBTPVzFeqg6OWhuXVfRM21xRsbt9z0CJlapc8ST6Efb2K0aeAT0fbKLNPjFOSO8PNwxzsUJlDoJzUTHvpSbCkODj2tRsYHJuzc2kKa2lz1/MMB7X4eh0SAf+D+S42bMHC2GSdlMMgozKblzT/lnoHRuXMBHyuzitssZkgMR9wfS7moSsyUaZVQ7KQ+LZAYEr0dj6nFLA20Tg8eKjKUxMHaxJQ89woXB3Ps6jNIMOBt6rTJcJ2Ly4XkOwDt4Y4AGQvswsfUBF6LXeqOhD4dZ8ZcoUGiZ8AZ7lHFTBp/yooEYrI2GIk6OdhDevawHGMzg0zKl9NzSPHpm8ngTxJOfyQUapwITChd1pwB8POSO30WZfBoQNis2A3+gl5MGny/PDIzGYzb2UScG4dBawfKt6X+lxkLhBu8YLxACnMGnBEQbNE4ClQlfr6Es9WLWtYQ4rFRppMM/zOhdaPcQv6HwRQmUGGEDozVD9zAodfBR3K2fNAh2e9tauKFdcCHt4O1eh5F/Uh522ciDxg21CkK4eGCrbiY0LISU7+4h6K6/5B8GMPk+8NiafxjkZyDKAOqdGa0+P6h6B59Pt+z4zPSx9VOYZ9OwcL4RAjgHfnCbhmLyMCDu5PPjI1zEPSF+Lvh60PocOTR4DNTHpolZFAPZdpH0kWGBQF0SMDDCGTpKu+/wptP1TMfGBt9JaQy4a7mY6RStf8NINA2vw7DgB2920dhogQ6jl0mHV3M4myIfJlqqECjrOage15Z898Ijzz7uPPP7GNdPyncUoXKYX+n3L0+D+e9JunshBv6oQHmybfCxK/ZWzgafvYt1Umc/UzwDEOANT7aWbWDexu7oV7gh9GOCj5kFHYtNPEhXPQgTW+UIsgkHQgo/h8D6ifKjVsVQRSuk/c/aQKB2DeoEhICZkoPRqf/tE6MNU2IU1O7o4FMe1ky7XTeNEhnPwKAfE7qzkuIF5hxnVgCTiu0SMiHRh/gNKH+46dHEBwETqAdB3O6DuxcocfC5mM/sxmL2lVyza6Q4BG3ov32UfAvKy0wHoG0qRDjgeZR0RmfFfRnWj/SR02ry0UhoeEy82L+BWPFeX+XYICEdYTwM7FqgxFBmy189NzGtusJAXKo5cKiO8TSv6onfaAUzYVPbRphYc4UmIpscL1MrGMn34Uj6rpJ3LVDiVHheEeukx8qT2nFmOmCODIIGR7b/dAobUr2Df22jdISeGwlThH/ss8qnnPSENCiMJkLzt/pA8bO0kuqJwRRexMqvGrdrgVLHuMEvH8GBsaG5R0cSl2rvm3Yb7SC1Nzjw1WYR8PSmnNFMar8gPUxyk0zESYgfMPP9g+CMPY62cgLmcWZNdVJcqsnni1UvBwfEdyYmXOnzt6RNpBw05ajjKAKFNuoKDra+007q3Ke+g4d4YsJopt9Q3sE0tbWnl/IGcR1KXEKHyho/zW81pXSsihwQrT9HxSXqOIpA2Raq44E6i80KzktMyPr+2yfkWbLJFxbqCbN2OAkPa78n2+6jl9KBCY710ALxhS1043crLfVBdTCJAovqua1ivd9dr6ECNnAIyKvRdtaBgKX8t09ThcqyDctsl+NFP8zN1LVbg8MOA4voED85zEZb0y9mml0rnOOAm3qAQ2moQwiUF4SzmVDMjsW5Xuj5QRBt5uvJch6t9unc53IMGsJc13kt14DycGsCQGAZYAxWF1ZaS8MqfhMoQYfqHLvxMJdW66c3cyvYohwmH53NqfWhVOtMZtE5mIrJ4Achp/y9L+UpD8LEWQy3JlijkZcwbWGebg4HpOORmNbdiNqcjz0IYK0gQ+7PApgJsKUXL9apcOfgrsH4wZWKKtpm7KU8zEnTQmgw2/nifajwwDO1zRL5jkYHE9FR1qhswLj1KBrqkuBHT+yUHSjOWsI3fCnbWj9JaJrzMaWR7oRI8XsaEEejAz7axKTgMeCiBEoDnAUuwpB0vUb50TY40z4KurLupTyfTpwDPTOrNtpKz2j/zeFodAhfm/BaE9fmjExA4KIEyvMDbcNsPQrqWAQQ50DPCIxpKFeH4ni3p/5HledRJs/d0RRfw4ksU9Vlq7kqW/0ua8fsY9PgsVzKDMhOIjepWX+xccOuFrt89l4UGqn+R5UYkhF4i+BJxvpWq+oi/x9KAsACHYHKfm9utZ67ow2pT56JNF7ZyXnBtii3hCsTAJP0vUs0+U4iHC0z9m24op1QK+/lAOd9h9ROUHSRAuW7EqF65cPV2wEHNNGhnTh72stRw2SuXKxAqdPcVrd81HWFjTmgfngoFNBOU2+/bIx5u/mLFSjPhs/ks+FAZ1bYiAPiP0cTnDlxEH64nb2QbRctUOo8tsTZov3Jd2rImxpejwMcZXDJ9rCmnrEKgfrAP5hvaRfh+xkRM2MzLSUc7sT7VXMGjJ/IoD+8bTKnqi3LfGSNcw71l38w39IuxvdCtSW93APbxZ+erc0E8R4rIeU8cG3UprT3P8t80SafMWEH/qL3knaAf0XBc+ASb0ps3vnezGFHK/p+ldK53sQ1p0cKu10v+RxGn+Sz3V9hpxyoGmrljpFAsKPV+36VT/9YPu9T8RFP8gN8n3CzdZ7DoP6McqAK1CiLsmcYey/pgVrk3+kxA5sX7PTMDtiht5Szc3KHFVaTb/1O4ZZ6eHiJedcsyiU4TmjkcwG32UbWMybg4d4PEs4XBVVDrdjdEgrMN1yoaTgHi71fhaCFApR6O17FKmzFgSpQK3JeAnWj5nAOvNYxDYXmCoFXRXAn5WPt9DvhCvvmQDX51u8fzL2h96sMIz768bWEyX1URn704FPxaDzuI/KFpRx/96NqKszlQBWouZybWU4CwHqpWTP1VZOaT+V5dwgBZROD2/ON4CkOQUv6ux/lq5CBA9Xky8DEraqQwLBRwXY6wFrMmYju6faHuGoqBgwpHawCVZrDZesP3x1iDcYVphBYn70OI2q4LAcw+dhxupQPXZbl5kjt0ijZ/ndKdd2Tcxsc8hEc1lKhucdGBnGj5qXyVFjGAXjsPnSJQMF4ZjYiXQfJr1CAAwhBgWqpko2O5hDYt8Ga6qQ2q8nnGVLQY0JDhn6oJl9BLq9YNZNiV3BYPzntJKF6Koe2qlCYA2ioChtzQIOd60jP5D6ZqVEw27my5EB1sFnBdruZgCl/93NbuP4u4kAVqEXsy1YYc2HJ+1DugzNeMP9UXQjYpL/7yUbJhVdUBWofA4D1zuzNAwkSa9/wfqBRFYuztOoX4EAVqAJMHatSAsB65rlc9H0oyisPJiCw2/+bukWv/oYcqJsSITdWCHth6n0fChS8MO36/6ZWYNUhm6gaav1uG3sfCoyaf/BQGG1mt875zFZ3N4/8FXbCgaqh1u8IbjTw2SyDxwq01k8SGtudIw/p7r2oKkywY99QBWrF/pFAoG1wKe9DnZSf7e9GW+mZ86YKO+ZAFagVO0cCcaPmcA68wJiGQnOdEBq5Xf/f1C329TfGAdZQH/gE82P5alw+Doy9D3WU/5vKx5Hj1/SRkYBA/eUfzLe06hfggLQP6yW7EhS9IaE87qKlb761viqAUq1yOQfqhy6X8zBLDdyQOEmA6s5dFnZuX0ldQ23bB4tuSGyLem09xgFMvgorcUCaiB2+3hsSSmeDgp298IuxlOFj+t/48v/VM5dow51CRVXYAweqhlqpF7ww9N6Q8OmxL8ay++e2y5WHHUIEyT2vhHptZgIHqkBNYNbCrGM3JB6o/rMvxirOfbcvaPu1wlU7BQzZU7AK1Hq9MXhDAhPOa6DWF2OFHmZga9OCvOuhXVuawoEqUFO4NTOvBIB1EC4UBKd5SPPpVjtrKHd3z8rJD7fOMfsq7JQDVaBW6BgJBELQCIKeERo0D4LibkjINyDfW//AW7cNqBzf2QuFq0mrgX1woO7yrdcPYzckDBPevuXjlXxvD+Fid4/1F+9OYRaGWk5Rt6D4a4XqF2SNIRv5VaBWYrwGPJplVLuk5ougXb8gG2HK2lHV5Fub4wXakxBiQtYvyBbg7dQq0VCYEPVDl1M5NyG/Bny2D1yGzape+84fpqDtBLImexnmU5j1Wjeuk6U+LuAAloe7f4lAPZTjThmRzcJZ4QqZOBAM/Ew1tqtR/a7f5CM4rKWaFxQVR/8SN2puKk+FeRyA78hQ/dDlPP7tthQbH3aeZUhyX/AkwTINZvHVL8ABNFSFjTmgwR59jWMGWmijruC0viCr9B/VXrVEZjA3pUjdlEjhUvk8uV7jaG2pS3DYrOAsy4SsfkG2cF9WDVWYwYnV53qNo35BNpHhpbJVgSrF2YF6pTnYJOh9jYOiyvPMV5H8oUuVwZSLfS02Fuerr15ODlSTLyc3E+rywtT7GgdVeGGqH7pM4OfeslQNtX6PjL3GAUbNp8MURpvVD13ClQNA1VDrd9LgaxygIw3VnCPp8bFc/dAljDkAVIFasZMkKGgbXLgb1/caB4LFLl2jrfT8cEV0a1MzOFAFagbT5haRQLBpgHPgBQYNxC0G9xoHQiNXP3R5y6LD/bKG+sBjbf7hiDgYwmOvcdQPXR6sQ4XuR4YyAvWXfzDf0qpfgAPSPmijwXt1yuMuWvrmB/MWQLFWOZ0DzYcuEahioIHBC2/cLRsdFMoTvX6jeEwiDizxWaxjMrEOeSAHfKs84ZrkNnbj3z56tkJL+HwvFwrqVqjc6XaLraHUeZz+8/24UWHyHI5ev/Hl+fsXBJO3VxEgfHcRVPG2peyr2Y0XpWdD7Pi23155tSFb8jZdRKDUcWgQ3iCdMiMOXb9pLnh2yOcPmve68zVET4eM8o/qC7T4T/LtBsbkRlV2r7yeREtJOkqZfGgUN0P3USqinNApvfd/ZoOymHtPgmcLIrDujMYitvLH6FE6NLAN3nwVFlwVzyBf5WqQ2uG7f394H9M5GVQGQUQod2deJxPxPiM7qV/Iffc+Kk8ou4YSksxin8oPDydb2CoNYRq8fmMFfH3kb0xH4uQQ2l/krzIYDZ+YLxwG6fHpZ1+FVTwChqCtCUx0r6Y0KDzRth/K38XkNQX3WF7R4caSfNb4WSG7QAk7NhB6hcljn3L9xghlwDGbPhUDnuEUZiDyf7NTTEoVKQZj9LCBEvsqLLS9KYZVvGL6htmZSWAUfD73AZjRzAfKILrQTva9+GyYX2Wr6X1FSD1rniH4SomhZmFgNRqoU9CtnzwDOknLHlUn7aLtxiaAsYYG6VH9zkyS/7UqCk3hR3pedaNAOHDOxftR4JxCN5NFiLMe84NwytUXU5CDLujLNjFn1VBiCpoD6J11lYeZERfa4gjNz6T5dD02AKNLDTrDpWlsamAiPdBiL/vRFM+YrcY34tYA+iec0Iba/Er4pQjeUB0paYv7IqWRMI+nC/poOwtkFShhxADpftOghaiQv1EEzoGeGUxuYMln1mxAaazHILZPezV5twpMocfjaNoKmqGNZ8JrAhtBn441KNpYO4UT31iRI6ZDX2vcLSHiaknhSFlMmEZYIukWxezIeRIbE28Jy2EOsQPlyst/pmczHbF1X1qa4vcGo/R4hJ/Ih273FViFWeRjIodaS49tUH7MEo4IAPjzRnFnZRSHYIILeZiM+g69KeusAZUZ6i9nbivvIKTiN1jJgkS1f63i8JGXMX/Tc0uj6pkNLNbcMVqZrKGzVUbPsyC3QEEYAjIIIgwiBrWO8rBozL6tOYjYzMQUeqha+RAgnEEYtrjGV36EAnMXwXB55WP3IzQ22Sjo6kboEBK3HpCPcDFh/U2uC9ZH1H8mmEFmtFjv+kltJOMX1FkiuOSruUxu8CoL3M9Sy/tK2M2KzQLvc9TQFA4gTLy5Gwoe5klrTal0TDN27sLF9RvFIWCxwWJ9RH8NwdgEmYTfUANL00QfS4ZffT1MMjZZWNXEDU0a5GdiyAKraygxoPRXVM8YozaZZWMDyw0opYcD0cr/rng0wSDkpEd12ZdgTwqDMx39MkRA8TGN80p5MJtDsEGCUHShO+i66fbcO0FOxM/qM7py9gVrdhMYJpsWv/RMW924Bh8FWEPFeBTmSQ7nFihmvsFZT8Q3gyYZy4UZ1WZMYOhcZna2zWeblipbih4GBzuA8LQXlM6AYUD82Mlkg9YGW5hsfZQqWGFZCyfhZ5nNF75Z+8L4E/ChWQspjkkF3gwtL3onDcN5in9/Suaadx0OaCAwCHAt066ndbQo2vSmk84mD7N3bJeOuoFumdvY978InOVtYifi15QrHIAP3R1mJsyT8I1NKoYO9C2ZWKwe5+cWqMXqU8RzK/qd3MctTA/2sIQOlbWBbn6LeqWb9iGeMOulBjzv4F+fyZqqoehPMx3D+g0v85s0Ah38WmkFH8CzKzisn5x2Ek5P5a4j7cOL2KQTyToelVugWByyM7QE3K6SiO8yZ0mdW5RdSgemy5lAiC/s5rkZ1Q8QBpIJyMnHsU3MUUMfDylzo/SoQCjNgPKP7KHjj+LXyV/6sSUUoo0JhbFoPOj7au4nQZ7FOF4trqFdAcinnG+0S7WfUNNDNm87936fFtGhAYFAoK0RILZ2AWbY8DzONBXb6s9cjtuzmC/1bAPJR7c8BlEKj18rH8J5Bqo/Bb+zcgUj2JR55fnFmR0CBp3wEN5ASwzgYXRdF8s8FpdVoIS4LaKZGVI67KQyDJLncgwawtj+LeI9QxTtDu4YYAxW90VVpbVmJjJtASXoUJ3dnbsuaW5L2PNgysYK/eM0aLfC8Fn1sjY7yXFT/kxAFTeGX1hd0bBwQdueafSeOIeLyqCpT/KTxqorNPKT2+SjOXab6OhRECEIEIePvJ6NCQFhqOqGQMUzu5T6iiqdgFsEG9LB7NrwKoUIjys87u4K9hVnAss2g/c1ovgsfTFQfyyJCQH6skFWDeWxYub7t1zK7AUxaLWWltFzOBti61s6Amg7X1wlCfMpaRqo/KTBOFD76nQId3jBDGuHmgPotZLY7maCSppIlI/XTri4zPGC9UOrwhwPqjtXXyShAz3KCE1ZJ4vsGkoIMsgREsyyMaBzQxv9bMZVPc25gvKSbldwFgnTGGIT07egA7MNmDoQmehSJjtXuf/BlBo1EcMCBwhDT1ZhgubsAuUZ+UT+cx+OehIUZlhcOOthKkZf41B+zJRGW+mZGWZz2JAOtso/V/tJmgZGKS8XSDGvQ56TNAi+DTYhML8PD54O6JnEhxTCiwiU7wB2o3rtU5+nGQx6RmBMQzHjnxSHSt71V1SFHzSsTgftyiVrJ+VlAmL3b8rmBd3gQOU4NJ1V1urYiw8d0FMCnxJrKOsA7PQHco/l+joeU4ItXzYm3hKW+1rOXuNg0PAXlsyMbu3kw3qcbLZQphQcgQ54G9sFK8WTi6z33osXL9AMDGgOvopI7UVydiLR4j3anImDbxnuaX04kZLLy67+MlP6XhGT7/JYmoVit+ivwpSFl5tVUgVqM9afNcyuaJ9pfJa5RuyTA8XWUPskdz9YSRNdCxt2QntviICt8mEK2tWjt3p2xwakVdgfB6qG2qBPvDAN3hABLeXDDHwtn7M4tsnZsKmwYw5Ugdqmc1JuVoDZQzkufLLoZdu67tLBlR1DFahtOodztsEbIh4ttroRKjTVfyVQhCvsmANVoFbuHAkFaydceERxdkPEC43e63cAAAKfSURBVA9aiW9IcLOec7qU61zKVmErDlSBWpnzEhBuVeAc6PnshohP4iDb3ddTHoSPzYi6C+iZs1ev7vJt0zNjNyvAinXWtYSJ9RPwq8L1wPeWF7v9rQK1QddIMNA0g9pGecJb9r1YKh/mI0I356upvfXWhHkcqCbfPL7tqRRfTeXSKiYiWq0BxSNofACzMTGbxBoowoEqUEXYuk6lEhTWX/aCIRsbbFyEQFw1E0OOFA5Xk68wg8PqJQDZvpqruvjAJruAJjBsxb8M21P4cSSuk6U+5uRAFaic3BypywvBSK70ZNXnTDn5CA5rqWbdpbiHPm5wrZbeWs2ZwoFq8qVwaf952DVEW4VrJXdmpTjTYPun4g5gWDXUDjpRg57NhCXvQqGNuoLD+slpJ9XP5gQvaoYCp6gKuTlQNVRujs6rb+m7UOGti5MEh80KDoVNyPq+mjoP21qqlwNVQ/WyZtUEzLMlax3u/M35auqqRF5CY1WgNuhlaRA2EAbfhVIeTEDAfSFXPkIX/Vqu8mLKxW6ix+KUtUIpDlSTrxRne+r1wjT4LpQXplJfy+3BrEbn4EDVUDm4OK2OlHehmu8Pqmq0Wbav5U5DteaeyoFQoPh0V7c8s2Q1G7pcWfbMAWzI08d6bq2fxPPmPElppLsvnCreNhkUVWELDqgP+BwBu6pRQKDYIer7JG1r9yhaQ41M5oA6A22DC/navAtFRcrDesiBwuzWNdpKz0W/L+6brd4wB1r3JbtZr3wHhjNiN099zsQBeO357WpU2N6FYpcOzcVZEbPfb/J5sZBvSITCR76+yU9JFUpzQP0yKCv33r3Ldr2sNC13on51CCYcJp99LRcB+lAOk9t1lnzOpTAtMPHQYH/KAfwTRqPBbqPq75448P8DVNdMKplNEQAAAABJRU5ErkJggg==", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\\\\\frac{ds}{dx} u\\end{matrix}\\right]$" ], "text/plain": [ "⎡(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u)⎤\n", @@ -195,7 +206,9 @@ "⎢ ⎥\n", "⎢ \\frac{dw}{dx}⋅u ⎥\n", "⎢ ⎥\n", - "⎣(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) ⎦" + "⎢(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) ⎥\n", + "⎢ ⎥\n", + "⎣ \\frac{ds}{dx}⋅u ⎦" ] }, "execution_count": 6, @@ -210,8 +223,9 @@ "dv_dx = Symbol(r'\\frac{dv}{dx}')\n", "dw_dx = Symbol(r'\\frac{dw}{dx}')\n", "dp_dx = Symbol(r'\\frac{dP}{dx}')\n", + "ds_dx = Symbol(r'\\frac{ds}{dx}') # passive scalar\n", "\n", - "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "L" ] @@ -266,33 +280,19 @@ "metadata": {}, "outputs": [ { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- \\frac{\\frac{dP}{dx}}{2 c^{2}} + \\frac{d\\rho}{dx} + \\frac{\\frac{du}{dx} \\rho}{2 c}\\\\\\frac{\\frac{dP}{dx}}{2 c \\rho} + \\frac{\\frac{du}{dx}}{2}\\\\\\frac{dv}{dx}\\\\\\frac{dw}{dx}\\\\\\frac{\\frac{dP}{dx}}{2} + \\frac{\\frac{du}{dx} c \\rho}{2}\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡ \\frac{dP}{dx} \\frac{du}{dx}⋅ρ⎤\n", - "⎢- ───────────── + \\frac{d\\rho}{dx} + ───────────────⎥\n", - "⎢ 2 2⋅c ⎥\n", - "⎢ 2⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dP}{dx} \\frac{du}{dx} ⎥\n", - "⎢ ───────────── + ───────────── ⎥\n", - "⎢ 2⋅c⋅ρ 2 ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dv}{dx} ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dw}{dx} ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dP}{dx} \\frac{du}{dx}⋅c⋅ρ ⎥\n", - "⎢ ───────────── + ───────────────── ⎥\n", - "⎣ 2 2 ⎦" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" + "ename": "ShapeError", + "evalue": "Matrix size mismatch.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mShapeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[8], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m dQ_dx_outflow_x1_upper \u001b[39m=\u001b[39m simplify(S \u001b[39m*\u001b[39;49m Inverse(lambda_waves) \u001b[39m*\u001b[39;49m L_outflow_x1_upper)\n\u001b[1;32m 2\u001b[0m dQ_dx_outflow_x1_upper\n", + "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/core/decorators.py:105\u001b[0m, in \u001b[0;36mcall_highest_priority..priority_decorator..binary_op_wrapper\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 103\u001b[0m f \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39m(other, method_name, \u001b[39mNone\u001b[39;00m)\n\u001b[1;32m 104\u001b[0m \u001b[39mif\u001b[39;00m f \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m \u001b[39mreturn\u001b[39;00m f(\u001b[39mself\u001b[39;49m)\n\u001b[1;32m 106\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39mself\u001b[39m, other)\n", + "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/core/decorators.py:106\u001b[0m, in \u001b[0;36mcall_highest_priority..priority_decorator..binary_op_wrapper\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[39mif\u001b[39;00m f \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 105\u001b[0m \u001b[39mreturn\u001b[39;00m f(\u001b[39mself\u001b[39m)\n\u001b[0;32m--> 106\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39mself\u001b[39;49m, other)\n", + "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/matrices/common.py:2958\u001b[0m, in \u001b[0;36mMatrixArithmetic.__rmul__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 2956\u001b[0m \u001b[39m@call_highest_priority\u001b[39m(\u001b[39m'\u001b[39m\u001b[39m__mul__\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 2957\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__rmul__\u001b[39m(\u001b[39mself\u001b[39m, other):\n\u001b[0;32m-> 2958\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mrmultiply(other)\n", + "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/matrices/common.py:2979\u001b[0m, in \u001b[0;36mMatrixArithmetic.rmultiply\u001b[0;34m(self, other, dotprodsimp)\u001b[0m\n\u001b[1;32m 2975\u001b[0m \u001b[39mif\u001b[39;00m (\u001b[39mhasattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mshape\u001b[39m\u001b[39m'\u001b[39m) \u001b[39mand\u001b[39;00m \u001b[39mlen\u001b[39m(other\u001b[39m.\u001b[39mshape) \u001b[39m==\u001b[39m \u001b[39m2\u001b[39m \u001b[39mand\u001b[39;00m\n\u001b[1;32m 2976\u001b[0m (\u001b[39mgetattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mis_Matrix\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mTrue\u001b[39;00m) \u001b[39mor\u001b[39;00m\n\u001b[1;32m 2977\u001b[0m \u001b[39mgetattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mis_MatrixLike\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mTrue\u001b[39;00m))):\n\u001b[1;32m 2978\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m] \u001b[39m!=\u001b[39m other\u001b[39m.\u001b[39mshape[\u001b[39m1\u001b[39m]:\n\u001b[0;32m-> 2979\u001b[0m \u001b[39mraise\u001b[39;00m ShapeError(\u001b[39m\"\u001b[39m\u001b[39mMatrix size mismatch.\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 2981\u001b[0m \u001b[39m# honest SymPy matrices defer to their class's routine\u001b[39;00m\n\u001b[1;32m 2982\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mgetattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mis_Matrix\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mFalse\u001b[39;00m):\n", + "\u001b[0;31mShapeError\u001b[0m: Matrix size mismatch." + ] } ], "source": [ @@ -302,7 +302,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -340,7 +340,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -391,7 +391,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -431,7 +431,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -476,29 +476,31 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\\\\\frac{ds}{dx} u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ K⋅(P - Pₜ) ⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ dw_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎣(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎦" + "⎡ K⋅(P - Pₜ) ⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2⎞ ⎥\n", + "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dv}{dx}⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ \\frac{dw}{dx}⋅u ⎥\n", + "⎢ ⎥\n", + "⎢(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u)⎥\n", + "⎢ ⎥\n", + "⎣ \\frac{ds}{dx}⋅u ⎦" ] }, - "execution_count": 13, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -507,42 +509,64 @@ "K = Symbol('K')\n", "p = Symbol('P')\n", "p_t = Symbol('P_t')\n", - "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4]])\n", + "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4], L[5]])\n", "L_outflow_x1_upper" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 \\left(c - u\\right)}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(- \\frac{dP}{dx} + 2 \\frac{d\\rho}{dx} c^{2} + \\frac{du}{dx} c \\rho\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 c \\rho \\left(c - u\\right)}\\\\\\frac{dv}{dx}\\\\\\frac{dw}{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 \\left(c - u\\right)}\\\\\\frac{ds}{dx}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 ⎞⎤\n", - "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝2⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", - "⎢────────────────────────────────────────────────────────⎥\n", - "⎢ 2 ⎥\n", - "⎢ 2⋅c ⋅(c - u) ⎥\n", - "⎢ ⎥\n", - "⎢ K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", - "⎢ ──────────────────────────────────────── ⎥\n", - "⎢ 2⋅c⋅ρ⋅(c - u) ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx ⎥\n", - "⎢ ⎥\n", - "⎢ dw_dx ⎥\n", - "⎢ ⎥\n", - "⎢ -K⋅(P - Pₜ) + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", - "⎢ ───────────────────────────────────────── ⎥\n", - "⎣ 2⋅(c - u) ⎦" + "⎡ ⎛ 2 \n", + "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝-\\frac{dP}{dx} + 2⋅\\frac{d\\rho}{dx}⋅c + \\frac{du}{dx}\n", + "⎢─────────────────────────────────────────────────────────────────────────────\n", + "⎢ 2 \n", + "⎢ 2⋅c ⋅(c - u) \n", + "⎢ \n", + "⎢ K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", + "⎢ ──────────────────────────────────────────────────────── \n", + "⎢ 2⋅c⋅ρ⋅(c - u) \n", + "⎢ \n", + "⎢ \\frac{dv}{dx} \n", + "⎢ \n", + "⎢ \\frac{dw}{dx} \n", + "⎢ \n", + "⎢ -K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", + "⎢ ───────────────────────────────────────────────────────── \n", + "⎢ 2⋅(c - u) \n", + "⎢ \n", + "⎣ \\frac{ds}{dx} \n", + "\n", + " ⎞⎤\n", + "⋅c⋅ρ⎠⎥\n", + "─────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, - "execution_count": 14, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -554,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -565,7 +589,8 @@ "dQ_dx[1] = (1.0/2.0)*(K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u));\n", "dQ_dx[2] = dv_dx;\n", "dQ_dx[3] = dw_dx;\n", - "dQ_dx[4] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n" + "dQ_dx[4] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n", + "dQ_dx[5] = ds_dx;\n" ] } ], @@ -575,10 +600,11 @@ "dv_dx = Symbol('dv_dx')\n", "dw_dx = Symbol('dw_dx')\n", "dp_dx = Symbol('dP_dx')\n", - "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "ds_dx = Symbol('ds_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", - "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4]])\n", + "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4], L[5]])\n", "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" ] @@ -592,14 +618,14 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOQAAAC1CAYAAABPhVPfAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2dXbIcNdKG2yd8TRgTwf2YHQBeAWd2APYKYHbgCV+ZuxPMDoAVmGEHDCvAsANm7on4zAk24O99dJQKVZXqv7pb1Sczolqlv1QqlalMqdRVh3fv3h2WXK9evXqypF5NdbbowxY4auKJ07JMH3K+rZGJq8MC+Prrr1+o2scLqtZW5UnsyyK6LogPi/rvlXo5sFiuHqDZc0BC+LnKP1X4zzn1ai0blepW4XdzaNyaD8LHBPe9rie6flD8H3Poua9lx/imfIzH33VdRx79R+FtvH+k8LGuN7r+qbKWHrOXB7Hd2XL1QOYVQfi1p+kfhfgLy9M9HfhZ4SeWdgmh+kP/P1M4aUCOyQfhZob8QuGPl8DbU/VhjG8x/zeFHdlV2k+i81Ndf9P9JBmY0i/h6siV0n5XXSbdDijvwcMs9V+6p3AO/80juv9G17ettEuI0if6NtUqHYUPGpB8Fr8Evp6kD2N8U74tr173EMT4w/uvdKEHW0FJrpCdNmDB8TwPuUJ+K8LbCtiu+Exlpgptu261cfXpO11/6prqthyLDwzMf0XHZrN0tUzflrAxvo1NdGaxPtiSrJJckdZuQ2kkBYWcvKmjSlQYU1gQ7xXo27Mx4o/MBwSHNY7DPA6M8Q2FPWjsfutBG/KV12dBe6pNSp4kV4bpod1MCCF6VFjUaUzy/0V8zPRvBhgRi20TqJ1HwoTb8ZGuXxVvzEaK/1vpXyosWSD6Rh8bdRRvwyZ8EA3MyvCKAYNftI9rdaMrgMqs6Y+hWR2KDgSevQT4Bt14EmeZnKfwTfS1oVdhhQ+ek0+f+hS2jW9OfKpcBZxzFJJFb+/6MTKKxTEdCxsSCinPQNoMpNujwku1SftYc3Ysk3IpDUX9XGHapGpRwvqZgRmD1XwQDbTD5PCJ7oNgK4R3QD7prenPHbaVv6KLSeORwrBUUQjtbFa8vxL17Oqx7Sl8S7hVx9aPxt+Qp3QmFvqErBxzE22qXAW65igks/XbUKv8Q4fZlc13B3EB04xfrrZNamT8LxEbE0CbVtKGZkDKM0hjsIoPopP6CFXbyqCY7AJihQ4b9Ac0q0A0IKxMYngcBjwiQEGvdeWTh+UfJVRbk/hWaNwmWR7VMbkYoCg/Ke3Yj++mylWga45CPlaNICzWIwvVKSwhwtxQPqUPzqLKh8k/6yKcCsxmJcViM8TSSxMBA9Ogr9UgCjGFjrV8MIuTrHekA/ryyWxtfwJa8YT2eBaHNTb+hLwJP3gZbYG1SauXV2pny3E1MqfyzcpbGLwz0dTnGVm5TriSd4ZvqlyF8nMU0hoohSjAf9SB21JmX1os33ku1Fd+KN3aVohgIxBJ4JWGEJE2NKP3KprqTYUpfAhlcoSiD9qgMblVG/THmmCyfCF8s5RR5Y2PPxiiGJIO9OKLtG8yrndNhd9JfMvK2y309tJqhXrCRbxr4ZolV1etykPRt8pEcBog5pPGlYSpUeD0EWbC9qMDXK+DaB0aGPpAH8dgMR8GeIWwQV9pwljaH+sHfS/htfy+kHaTC50Veq57+BvWvln60W4X8g1+fhyJWtJ/qi7lXc6LqXIV6jzMa47cMwDmrqSi6jTHg4jfpsTsRnknXWuoaWhsKx5uSxgU0cPmDkfT2vQyk00RssV8EH7WX0C7nbS+FV0IAYpgZWb1R/UQgJe6WCNxjwK91pVAZV7ECGtDXEHaDPdZu1iWhiArDwHn2tr6CeUkMJ5Y4SG+UYY+AJOMxYa8u2v17neqXIXSV3nNkXuE/GlPGdxDZtQGqIMM9hSr06i3MtIYtChEnwqnKelHSmsrI00iZFaGeB8s5kNsFyFHyQIoDWVAyE1Z/660vA/5/UF5lC32R3koIDugHPJgTGiL8kmxlI4ysvnGiRSEhbLcg5OyB8XBA43kB4hpbEb9Q/dT+BRrrg/UHuM1l280zGR0UP3Uf+IlUJlNeFfAPVWuQtU5FpJZlgHpgDrDIH3DpUxmZoAO3igNZp4S2IT4PtLC8z0EGqZAH8JIP0rAbMo2+Bis5QMTF/RBywe6wMdMb/SxbslhTn/gP2v5thLnCoRHY/mMkVkPns9aObMs7ATn1rRvQy2n91j3k/kmmuEhE4pNMPSRHdWhY3Fb8a7d/6lydVePw+W63uka/X+jyvyu6+P8v1+XcE/f6dvUvtTKB9H1p65r64fuX+j6yeLtUHnvdHXGXWnf6vq1Xf6S4+rvJrzLeQRvdY3Klcp8pUtV3x3muKxoMLPIFCtyp+37+cUK0bepUB0fNPtj7bjM+tEXLC+WgeeG5CVQHOuRrKXiyY1WOrP6qJuXkO38JvJmK97l3JgrV/MUUoSzLuHPl/ng5QTs7j72hT6lxyRjnaiRD6LpVnRzBVAchTPFekai0ujnn6HA3foqV16EhzIIJuNrhyxIvmhQnzfhXc4k4YSHs+SK+g9zJBPv8eVZSzL7XgKw3lhi9WvkAzSx7mNj5y33up7r+t2ETiE7zKwLw9ox3iuaDgCwuQPcGwt5192wKbmWdxFVCBbJVf4HZXYf8xkzR964Vzm0nyNVQ4vkRp0aI1EY2XGc1O92Hy6FD3m/1Ccs5KcK75tC5mxYdS/eMeFNliuV51Ecu90PFinkKmq9snPAOdDgQK6QV40cjzgHnANn5YAr5FnZ7407B5occIVs8uNiYnKDWOOz1q8CRIsdMKiCnlqJWLLLWmtfjkKXBIlHB+xWEvJohC1yNj44VsYh6/C4QPfVgGhik6BzAFzp7L5y2mbRJlbewbm4VP5futi4WLKjnTd90fduIUeGVwLEbiOPCBBwjgiyNU7II4Zrhe2jbiMYj5stepgsOA/b2CWN6R8r3EIZaWMJrn+r/TkHMI7LrAqxu0JOG5SnKtYQ8FiNZ3323G4apuOXQuBLkwQW3s6qrqViEa44STCJodAOBQ48LKR5UpcDCOCXebKEijSU8bNWOgrBofZbXRxZw1XDheSAOy4jFoq1HX934iQHlnYyqDzC/FIXbTBRcIA/VzQEPrmFuqct4p/r4qgc9L1u1VHSOGyEi4kN3uVvRxhv/J6UcIUcGegohCgByoNicY8y8Va7xitKFOefLriz/OOCo2u85d2O5HG6CdeXNVxIU8i7YME7x43klSfhnxmqF9pQPNABLt0zESSIuHGzUQKUd7EibISLI3mc8lpMR+rcBd64Qo4PKoLM+jGcSlKIQqJcbcHHTaScubYoGdaTzZ8fdKHMKGouiODC7T0onXaIm/VkvWW4KEIZdirfKDSLSBvh4LjSoIe6AZ/CNqC8DXztAjPiRVyigfbDGnsAl9E5UOT+ZrlCjo89s3kSZARfF8qHUuY7rM8UT+5nVBBTnIPi4KFOAMURanAhoAAKaJYOxeQQ+AMyMsD1TO6o7sP6NcNBPcOXqikfZc/bCnlKh4YpmyxY/WDF+3DFxmjH/g8bkzpB34TRKXgfE1whx0cdIWusHxVn7dYWfJRhyPVEeXIFBm9SdN2zxjQouZ7gJ/2NFVLIBJBb3GAxs3y7TRZNChXwKOQ1IUwYTBRzoA8X1pvJAi+AZ6A5XTl++jDEp7zsvbu/unc9ntFhCRXCgwDnigMG0sNMrzJsohBHuAkTKD1YH8OjkDIGKEL4xwUJysuFlHrJ2pIvQIEpdxtD2mpMFsrr0EBZAWte1m4AG0J5WyFxxk8Rl9o2lx5r2qeMNAPdY1Z0BjmXVfThZXVnu95IqJjxzXq8VJwNkaAMSr/RZa/hOCgdq4ACsX4ypUSRKQeQ1v5nDMqUu5+UAxfuMHhy5SULWvgHAXRBB4rBu1aNJkUDsI5tbxSBE0VhHcsOa7vOXc1pv0Vcwkl/p+ClH51+T2v68ku5QvaMsQQMBWorUSitPJQldzEPSsPqFAVNeVjYZGUVt/Vjw1IpHcuIMrLe412qefu4vEwKQ9ZHRcKaEDqSe6w60FukjQpzYAAXE8wbcKnMV7psdzmhVxpKS36j36mA38x7Y4DzazMOJOE1jBJSnlFi/XgUwkdb2wqU1m5WpxSqLor/SKFZ6lKxY6QFi652w25yTwNMOO1+9RS9n8luIc8z7ribaccVEiTIDYubkxWVC7d4iksILtxT3mKXu9k5ys3v1Vavh0BjykdR2Ul26zjAfVfIAeYcK0tCOctKRCG29ewkslQH1ze4iJMqHL9Q6eXUx291Zy2gkO9Fmi3cWRe2J1eCjMt4EaC+VNOPEi1Kaz9rrYbeExLyobXlFtI4kYUuJBkz/PakHLhSa3/FFi08KQHemHPAOXD4w3jgFtI4sYNQlvtaZLL+5J8bPP74RWn5oxElOeyZA66QOxo9KR87rTz+uFbYPsmzo544qX0cwGV12BcH2G1Nhwz2RbpTO8YBV8gxDtWXj9uazsDWR55TtIYDrpBruHfiutFdpVW3kCfm/amac4U8Fae3aQfryDlXP+2yDT+rw+IKWd2QDBJUXD9KQTm7irI67JwDvsu6rwFE6UrH7viP4w1dkWKyC8s/Qzgvay/b4m9apXoq4lATB9xC1jQaA7RERaNEY/2odJ5J8v9HO3jOl6v469NrXbyflXvL061DzRxwC1nz6ETapFT8Let5jPJPDm45OI4lxCKmg+dRAZUU3iYQdmOVlv4bSYZDvRxAIe1vM2/rJfN+UyaF4jTOpBM5Kmt/bEZJgyIqrfiH4fvN1ap6j9cTlhS4rE908VqGx7oc9s+BpyiguoF1fB7vwz/599+1i+0BewPo4MFd1h2MsZSKdSJviRt93KEyJz9SpzbNKu+Am3WT6Js6dY/PQcKOtav62aNoDF+2qpyVuyDPFbLiYZKgs3HT+ZJVpSTzeg7emeOwggOukCuYd4KqCHhYW5ygrVVNSBnZmOBfKEwiDgs54GvIhYyzatEq2AN4Tsxs+bUrBLzxQF9xNgB41MHmTVgvKgyWSeHixxsb4Q1KKdrGXlVp7POwxQG3kC2GzIlKiHkD908KeSTBTiYvVDYLwVvlsG4o6Xe6UBYU7InCUYjlbvOCSgM3H0qlPV7Xb23xVvJJeHN8dr8hXuhIz0QNv4fTOeAWcjqvGiUlxCjbmq9d2RE38PIKSD73Hd5tSoIABWs/G+bRFMrNrittB4VVyBvNnyptKUzCqzagibfZNax21ij0LJ4YMjz39tYVcvnQP1PV9IhBQoowJoVSHEuR3r2qOArIbmlQIt3jZiLcPM5Awb7Xlb+b9ZHiVla3h4PKhcceCp8rmtxCxcGd/iMZ41M2WDj1g2JPwqs2cJeHvsvRnkBU3GEOB1wh53CrWRaFGXouyLG2fE2HMOfnUPlwKwqKRUHB2ps34KaNEoArTQa6xxVOJ3l0z8SwxHXsxSucHN/DMg593Yq+DPFE2Q5DHLgayvS8QQ4g9AhgAgmtba6QztoxWUzFUZDcipkyogRYlsZpmli3gV9lDCjPdVA5yuTtkLwUevGqnaDwCrGqyTq3GoKWIQvaKu7RNgceKuG9mGhhu4zHyxzAQuFymtJgzW5iUdKSxYppKF5ae1FPF9aENWEQZIXv68rd1NKXrEAHHo7FYYUPCjsftiF9AfTiVRv0L6ethJ5JJ/WxVMDTihxovCj5r1jEwmINT2xyQAKKMhWFT3m4psk9VdzWj8Gdi8KNJbG3diPsJcDi0kbu+h7a+EsVl6SN4GVCCVZc5TqH1ZUW+qDQXdb5zP/DqlzZjYdH5UASZlqR0GJpcP0QbNZmL3VxIqdhgRRHqXF9zQorejYIbrFo6fu6lU0eZyPwEhrGZXU4PgdKX7ua5GZKAVDck37JqsQO0TDkEfiXrUpMW5DmCrmAaXOroFRz6+TlVZ+1ap9bmxc9171/2WojzrtCLmCklOMsX8dSuwuoPU2VPtqUbuvk0xCy81ZcIRcMoAvZAqZ5lUkc8E2dSWzyQs6B03DALeRp+LxJK7LM10LEepSjdjyc969fiQmXBK6QOxpNKaR//WpH47WEVHdZl3DtvHU4DZMOHZyXFG99aw64Qm7N0ePjw21NZ2KP35y3cEoOuEKektsr25LLyhE8wC3kHR8u7heFtBMYnPR3qJsDWEf+JeLnResep7nUMcGGwyMo5BNd/BfvsS6HujlQXD9KQTnvirI67JMDjF34P+zDfdJ/b6lm4ErH8DicfgNXpJi4tfwty79+BUN2Br6G3MmARUWD2sb6Uek8k/SvX+1kHMfIdAs5xqEK8qV0/EWL13wA/PuDkMPmWEIsIq5sAOXZv0iwpmE3VmmN/1PGoh5UyAFXyAoHpU2SFIq3D7TfQNAuFuIqa9/ZQEmDIiqt84fiYmVPPDsHXCHPPgSbE9D++hVWtPG+ns1bdISbccAVcjNWbodIFo114aSvXbVbVd38bXTt7JPEMyt9kvYuqRHf1KlsNHEvRdKunzWqD/41rIVy5Qq5kHHHqCZBZqNmL1+7GmOBfw1rjEOFfFfIAlPOmMSLosID4jPSsEnTmlx4PHMdJ5lNcN4HJL6GnDnKEjCU5mRfu4I8tXmtgMcb+RevsKa8/IrHINz/T9cnul90rO5IbQSlFF19L1ZWlkPOASykvSDZwjzf7zMOSGhP+rUrmlabKFvpi1fPlP4klrlViCKGOGlz4Iht+Newpg1EelEyCvlXrGPhNBT3rJSEFldy6GtXWDD+QJxbA5Spc2hfZfiEHXk5oEydskp7rKvzxSul8Zwx/xvWa8UXWUfVW9SG+sAJoSEXm4li0SShevcJ0ouS3WWdPuxYpPRIQYKIsP1m1RVHQYa+dhWKqhy7qCUhRUHB2QCVD0qmkJM6ubLjxjaUISvL5IBrPQa4u71fv1Ll3jYiYvKHvuVRmmDGaLrX+a6Q04cfhRmyQDyAz4+oIaylc6ek5eUUDQBu2ugDlCwooJSIcvzDI8eflFnpTBTpOF0fwkL6nDY4zsdBd/8aVoGRS5NwWR2mcQAhb1g2CX6wQgpJR0GSxVS84VIqD2Hvfb4Y6zbwq3wOKJxZHJQ/ger2vd4/lZl4M7kNtRmO8inEyuaWO2+K/gxZ0Lys34sDbiGni8Hir11JYLFonyq0g999rfZ97YryWFU+mc5GCYqDIjAhIPDJ7dT9GpjcRuwTdAwBk1Lp72JDde51nivkxOGXAOJSFoVLebiOyX1UvG0NHysfC4qbB2A5UC4+Y567wSgYbXRcWpVrtKEym8PMNnDJ30CE6nUOryuNSYi8vH8kOQxw4Gogz7OWcyAJKygQSl24eIMWUmVQOhR3yHUFZQ0Q3HPR2ucu2+RSA627ocEt5HGGqvO1K5qR8OLioZhh/UVaG1QmuKIKb2L5dpEq4qJtyGNASTk659Zx5mi5Qs5k2JTiEsSiazulLmVUv/avXY11xb+GNcahnnxXyB7G5MlSEP/aVc6QCffiWaeU0vxLWB2uNBNcIZv8KMZckIps8cQjcMA3dY7AVEfpHFjKASykLc7tofNSXF7vyByQpb5WE6xPeaMAD+P961diwgUAu+th3wELyRY7R7J4VuZQMQekkAxcOBig+y909e7WVtwNJ63LASbacCzSXdYuc2pP4fQLiulwgRxwhdzfoDKb5n+72l8PnOJeDrhC9rKmvgy5qBzJA9xC3vHh4n5dIfc1pFjH3n+M7KsrTm2JA66QJa7Um1ZcP8pycv4VZXXYOQce7pz++0Y+Slc6lvdS6TcwI7q1/F/Sv34FQ3YGbiF3MmBR0aC2sX5UOs8k/etXOxnHMTLdQo5xqIJ8KR3/o3weSeHfINzyf0MsIRs9uLIBlGd/8cKa+tevIl/2ErhC7mCkpGSDf9nKu4DyxvIoafijs+KdPxDndfy+Hg64QtYzFltR4l+/2oqTZ8CDQr4X27XwDGRcRpOyRKzlzvqnXLWfXlW5hKs19GEJ3Tuv86HRj0L+FSMWWl6VoQTmWoSxfnqiK/wzX2mNjY5zEC4aWOehjGdVyLG+T+Afk8rnuvyc7Bgzt8v/w1DtcZeVV0P8GAWGNdLZj5EhwKLjA+gyxlYcDvJPfQiTm0Jew+FwYg7sUSE/yXiEleQ9NWcDCS7WmjfIdd4Udzaihhse5Z/6gnVkN5e+OZyQA7tTSAlJ7hLyZrNVa6YNeA0N4a8zG+A6OooZ/KNP9K0XhAvXlkmxehCd9grOqmnd7S6rGIzA8DKo8DrCM3L5mWgonZ45KB0L80wX1ia3TKvIFS6ePXI6B1cZHhTXe0qHR7iePJvkHbCJVzGvl3/K5wM/f+qiTMcLURp4t3pBs1AdF0Rv+KqzwuJYHbf16dh3ZyHpmpjKzB2ESfdnm/nUNgqRW2zIC6A8lAahRSk3df2EG8Vi7cya9amuDqgMm1+PdfHtDSaEXBmn8o++MaE0QLjozx6/9Mz6edDqNzp6hsjuFFIM/VV8QgmZvXkb3DlnvOJhb8ZRtP2mC8tVVFjKrAQs7mtdKH4D1K5NAoSNTS/lzeEfGzzpFFDWCEKN9d0VqO/05zryp0raq3ZZxTgGvv214kHXT3WwSpRB8FAG1jg8HmE7f9Z6Mw4criE0YIlulJYsjeIcXTunYEIL/WsDbjQuJ5/Ha2w2KW2Qfy1EfDcES9sGhLozESqNskwQ6UvPVFQ6lmkW76mXw4a4g1IKd5U74tVaSA0AwsCHTbEyb3ShGIOgsuYaIogoCn9LQjARSoQoCC/lSvcF5D8r7bXKQsONLuI50N7bPOEU95H2XxUG62t9oW3doxS4qcFyKswnkLnk0beGwgsf8ds2IqXDi86XniMdJaVuo+iNb4ybdxKVrH5v+6fMuDplY1Pb0gCgTGwYhGdi3Ov6bEJ91kw/6EIYh75mzLrod+HH5UV5O0qlPNziNwpNoKEBRTalVzSs0TrCScaRIShdbAP6TPmgDRqhNS8Ti84OQp9btVDIDr+UBu9LX3qGDibUNTALt/qPN9TnuTBejUlmDWFb1324NcKN8KEwycURc2GiKUZvE1EQDwqZAVG0AIojsLcKk/Lofuwt2rhkuVuGe3rIcRBfCsIDTVM2GNiQQTFy+ERp9q8OhB13GhcsuKqxIDxorB9j+pwARUg8ixUfFdIORqPC58rPlQHaGnSozKy+z8EdaWQSwMMqQWkyKZU7SxoK+V5s2cKzENJqlEFvC2GryGAU5cnXTgyQWdtQUYNMG5TrbN3HPGbRfGZngkDoc2BwwTMb1MZvqrSF64TgsePZ7iPxnAezaVQF+kYfcyhZzTyfdnOFJM7aG3eWPh9iuKTvU3Dj2TCR9n3ZmXFdI1uqvjl8aBivdPNXjFhoeecMGbiGW6FBnGJNGGzq4baFwY+daFsLhIw1JUrKw202gnJg4A9Kv40hOEn7kngGDGyDzizvKLeiifby2Z9+MrGYqwrdWCDCnAckzYXHqtAQ3ohzrM+hjsrCM5SaeOCpwrUwiFttst4/KMSzaE+gZLX5R9q54Q8j4KHdVBZijXjOaAPPoLKpMgWoEwYlK4ww5O4ns2dQNqXj+v0ZQwUBUGDOyzLbUo5dWtxEq6NoAAQel6wDkXbapG3WNGHHWGGbtk7dvgTVtdkf95vHKkwoWHHWukH4Yhnop8w3utZYSXZkS0qNV0GfGsqqsgCTFmPHpEE+dDHhlfAoeRaM4la7yEp7nPJG4E0uC3ne2e+rVMg40IuYproIaXJPFcdaIJy58PxPae9n3G8PIBYHN6s0w2bVwnPAtFbNM2J7a5QhRxfuhRNlbii00qAdIQtQKmN5C8L2RGYomFwYn07/1D48y/mW31v9ReFE3ND8hgZU/itdttYmjrIS5rJAUjVwVQ0lxyMkDVDWxJcaFHNVXyq9vYOLEielzuo1boUjzPoKg4vYyNx5RH0K3onCDh9iGi6yeTA19dbGBKvcpt0mkprobdBSpYVsULg+grvZsGISpN5ZOwpZ7tKOUWCDvMiijyE/Yz7Wj74VQXxijYZLjCfR9jCKdU6RKFqwfp2xUDoKygGFaq0j/Ll4C6kBQHCS20Knh4AB05VcwKGy5EXcrKdqtBZj5BfzY1/o0yDflN9xWYsI60jkq85ti1kHZRkVF6+QWV+PecsmVL7Vf8y2ToGbvnSsTKlhCXk11rFEn6XthU5XSBuxFWEcbCwxu6C7htgH+lK1a7drJg8Qfx/WkAPd3y4rCnBjB3Q77KfDpH7svg+n49b2LVWnkBIIzpc6OAdOxgHJ3NgxypPRUqNCVsOck42CN+QciBzwNaSLgnOgIg48ePfOPcSKxmOQFLlW1yrA7ufnuniW+ouv+cSFC4IHr1694pQJ/67/SIPrO2uVD67GiJ1cXjuZH/2rnGonb4gDGksOLfASsgfusg5xqs48Di1U/4C7TtbVT5UrZP1j1KYQt7Xxh992AY/vlwOukDsaO7k0dojdLeSOxm0Oqa6Qc7h1/rJYx/Zfyc5PlVOwGQdcITdj5UkQFdePspz8FQplddg5Bx7unP77Rj5KVzr0zX86b2BGdGv5gzV/O7N32vK2g1I9qjhUxAG3kBUNxhApUdEo0lg/Kp1nkvxVyv518anu+dvUa128/Ip7y9OtQ80ccAtZ8+hE2qRUPHt8HqP8E4PbR7qwhGz0pP9vRgVUUniXT9iNVdqe/rcI7fcWXCF3MPRSqM67dPrIVtkXsTxKGhRR8ca7Zfrqevr5OeAKef4x2JoCvqvByQ+s43PdY0XDS5+2bsjxbc8BV8jteXoUjFIs1oq8+nHweKPyeXvBSUFtmlU+abuX2Jhv6uxgVCXwWLxqnz+KvvAx1B2wsnoSXSErHyIJO5s3e/g4avUfQ618qAN5rpD1jxKvYqz+BVqaOHgccx0nkPq5WimFvobcYGAkhCiNPYTn1AwuHG7mFh+ORciLD/Vju/adj7eK975vdmo3V+IMSqm2VtMxld5LK+cWcuWISoBRiMaHZZWGmwnwgmasG0ra+XAsBYZAdZ4ov/hQX3ng5WOyPPhnF9WeU+p2GWyA8xe1nJ6JLqPiftdyC7li/KMAlz4s+1hof9CFlRz6cOxBONg95V9l8s8AAAPASURBVIM9wdIpnr+cGIV8q6sE5H0faeAlwFvsrg7iVBvk8yGdosVWHpMHZRwWcsAVciHjYrVnCpMiSFARyPSVJ8WxFukzBopzqobd0mD1FKKwvKkBIX8Uy+YKSVooq7ANPPT/WReWklf6c141PBJRSDu9nwFQnkH7/au9OGOFa4XmIhuOPOybPPIyfj/AAVfIAeZMyEJhhp4L8lA+nJaJuBDo/CwqSoMikV76hAG4aaMBKo8Vovz78Z5DAFja8E5VpTEpzHIdJ+Dk+B6Wse9DqMoK1nGIH5RxGODA1UCeZ41zAMFvuGgS7GCZooCzdkwWU2VREjtfiqJx8WVhlJSwsZsa6zbwqxwADpT9oDIoAJsouaKTNRcGcaodU3asat+mDbQOWdC5NN278m4h1w057irupikNCnYTUZIWhDjGCbCEjfWXCTehLtaEuJ+5lcEStj+OitKj7Li8AG+fyxX/LnXe7yBO4advtyMomXAa/Rsp79ktDrhCthgyJyohRXGKAqg8LFayWorb+jEom+KsJTkKh2Llgv62RQOKQhvJ9VX5fJ3ZKr4sOgEnkwm7uQeV7RxWVxoKS14+mZDkMIMDVzPKetF1HEgCnaHBwmIROQuKu/qFwlw5D4qj1CitWeGs+klvgwUWHWHnuNCyTRyFLE+aygG3kFM5tb5c6cOxvRY2b05KwLoNxb3R1VDYvNwx79VuL63KQ0mr/xjqMfmzFW5XyK04OYJHQlt0bUeqpWzVt0cjKa2iG56DnmWiqIgHm5DiCrmQjRLAs3yDQe0upPi41Up0Kc0/nDST7a6QMxlmxV3YjBMebskB39TZkpuOyzmwkgNuIVcy8JTVZZWv1R5rUU7l8HDev34lJlwSuELuaDSlkBxb43kmf8lKZ2h31AUndYQD7rKOMKjCbE7DpAMHFdLnJK3ggCvkCuadqSpuazgPe6b2vdkjcsAV8ojM3Rp1dFdB6xZya+ZWgs8VspKBmEgG1pEzsH5edCLD9lbMFXJfI1ZcP0pBOeuKsjrsnAP5LuvvGtR2d/hLkO/mtblyvjhKVzqC91LpN5Cl8WIXlv9K+tevYEhloPHh/6JP+shCIXsPDce8vrqefkIOREWjxcb6Uek8k+x8/SqW50A673TlnxgOdXBgcCwevHt3liOZdbBmJ1RIoezrV1g/+9Mz/z/EEpLWeZFyrHNQaOVVzKF6DqCQfl0OD169evWC8VT4k66P4/1XPsb7GGO3kNVPmfMIlEXkLXc8p8SCfqCLNcsbpa99xYfQOBybA/8P/Hi0PadhkikAAAAASUVORK5CYII=", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" ], "text/plain": [ "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", @@ -619,10 +645,14 @@ "⎢ 2 ⎛ 2⎞ ⎥\n", "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", "⎢ ───────────────────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₆⋅(s - sₜ) ⎥\n", + "⎢ ───────────── ⎥\n", "⎣ Lₓ ⎦" ] }, - "execution_count": 16, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -632,6 +662,7 @@ "eta_3 = Symbol('eta_3')\n", "eta_4 = Symbol('eta_4')\n", "eta_5 = Symbol('eta_5')\n", + "eta_6 = Symbol('eta_6')\n", "Lx = Symbol('L_x')\n", "M = Symbol('M')\n", "u_t = Symbol('u_t')\n", @@ -639,6 +670,8 @@ "v_t = Symbol('v_t')\n", "w = Symbol('w')\n", "w_t = Symbol('w_t')\n", + "s = Symbol('s')\n", + "s_t = Symbol('s_t')\n", "t = Symbol('t') # gas temperature\n", "t_t = Symbol('t_t')\n", "R = Symbol('R') # gas constant (kB/mu)\n", @@ -646,20 +679,21 @@ " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", " eta_3*(c/Lx)*(v-v_t),\n", " eta_4*(c/Lx)*(w-w_t),\n", - " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t),\n", + " eta_6*(c/Lx)*(s-s_t)])\n", "L_inflow_x1_lower" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - 2 R c \\eta_{2} \\rho \\left(c + u\\right) \\left(t - t_{t}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - 2 R c \\eta_{2} \\rho \\left(c + u\\right) \\left(t - t_{t}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x} u}\\end{matrix}\\right]$" ], "text/plain": [ "⎡ 2 ⎛\n", @@ -684,7 +718,11 @@ "⎢ 2 ⎛ 2 ⎞ \n", "⎢ Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", "⎢ ─────────────────────────────────────────────────────────── \n", - "⎣ 2⋅Lₓ⋅(c + u) \n", + "⎢ 2⋅Lₓ⋅(c + u) \n", + "⎢ \n", + "⎢ c⋅η₆⋅(s - sₜ) \n", + "⎢ ───────────── \n", + "⎣ Lₓ⋅u \n", "\n", " 2 ⎞ ⎤\n", "M - 1⎠⋅(u - uₜ)⎥\n", @@ -708,10 +746,14 @@ " ⎥\n", " ⎥\n", " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", " ⎦" ] }, - "execution_count": 17, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -723,7 +765,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -734,7 +776,8 @@ "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", "dQ_dx[2] = c*eta_3*(v - v_t)/(L_x*u);\n", "dQ_dx[3] = c*eta_4*(w - w_t)/(L_x*u);\n", - "dQ_dx[4] = (1.0/2.0)*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n" + "dQ_dx[4] = (1.0/2.0)*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n", + "dQ_dx[5] = c*eta_6*(s - s_t)/(L_x*u);\n" ] } ], @@ -744,14 +787,16 @@ "dv_dx = Symbol('dv_dx')\n", "dw_dx = Symbol('dw_dx')\n", "dp_dx = Symbol('dP_dx')\n", - "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", + "ds_dx = Symbol('ds_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", "L_inflow_x1_lower = Matrix([L[0],\n", " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", " eta_3*(c/Lx)*(v-v_t),\n", " eta_4*(c/Lx)*(w-w_t),\n", - " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t),\n", + " eta_6*(c/Lx)*(s-s_t)])\n", "\n", "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" @@ -766,14 +811,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" ], "text/plain": [ "⎡c⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", @@ -793,10 +838,14 @@ "⎢ 2 ⎛ 2⎞ ⎥\n", "⎢-c ⋅η₅⋅ρ⋅uₜ⋅⎝1 - M ⎠ ⎥\n", "⎢─────────────────────⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₆⋅(s - sₜ) ⎥\n", + "⎢ ───────────── ⎥\n", "⎣ Lₓ ⎦" ] }, - "execution_count": 19, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -808,32 +857,34 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAK0AAAB+CAYAAABWBZHCAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAKUElEQVR4Ae1dUXLURhC1U/6mqLgqBzA3wMkJcG4A3CDhBnHxBX8U3IBcIdyA5AQQ3wAOkCooFxdwXi/7XPIy0kq7b9TC86ZKtDQjTXe/fp4dSaPm8Orq6mDO8vz587vQ9xjbE+yfzqnbum4HAkcgzn248m+PO2/Q/qinbXL1WtfZ+sIgr4sR+AYB8OQDKk++aUAF2g6POg2vsB8nd8vH7sG++1B4gT4uIB/u25evv9UIvCx49yvqVrzpkvY1yCQlaUGxq4zAVgTAwz83T0JdVK1I+8Nmo4+NwNIR6I60S7dVZh/+avnz8wmd3sP2cq5fmVZ1M3gK/5sbaQFa3HS+gzzHFvP4c2xvsV+c+BNshWxVN7FT+d8UaQHa7wDwLuSbDpCX2I/j16yrIVvVTSyV/jdFWgAYj+/iCcZmeYeKMwBb8zFcq7qJtcz/WUkLUpxgi/nkU2yrfRz/Qa9mkGfQ8bmgh09Nor1WaVU38ZT5f8Qe55AgaJAj5pCzF+geM4r+WMOwVnUTS7X/s460dCJJkpAxh+0rY4jdd+1Qfau6iYnU/5ZISwCH5PFQY+W2VnUT1tH+j5oerIf3f9D7lJHoEa67vunB/taVOTjnkB5UkKW5LNVwJIjntjVKq7qJpdT/saSNn9S9VmRVJiTB6ZXQf4kt2kt/eKzjDVlvP7s0tKqbWKn9b2168DeAPCGYHcmRNtprlVZ1E0+Z/62R9i8g+DNR7Mj4FYnVZ/GLUqu0qpt4yvxvirQgZawe+gx5vTQS+zE1iEXpvxHdGrJV3cRS6f+oOS0V3xIZo2oskPkFMm68Qj7A8fVNI45rlVZ1E0+J/4fPnj27jx5jEck9BK7KjQgt7kroijdjQZr4SY71ALF4xcUIFBEAP2LdSKz5PkyZHkBxfCERK6uCqO+xxWtdFyMwCoHZSQuixmqqj5C8U4/R/cEoa32SEQACGXPauOmJFT+rAvLG9GCO+eRao8X3jsDsIy0Ai7v12ebO33uAbP+3CGSQNkbVk64pGG35+Uu32vtGoIhAxvQgpgbxqQuJGyPvi6J1rjQCBQRmJy3IGlODJwVbXGUERiGQMT0YZZhPMgJ9CJi0fci4frEIyKcHnZuqeNs1a06BsShn2tiqbsZG4b90pIVB8To4JacAQdkmM21sVTdjovJfRloYlJZTgKBsk5k2tqqbMVH6LyMtjItHWaU3W3PkFCA222Smja3qZkxk/itJewbrPtPCjuTbr2jPLpk2tqqbMZf5LyEthv54QbCt8JOWbedVac+0sVXdDKTafwlpYRwJGYtf+soYYvddq6jPtLFV3Yyb1H8VaWnckDwealxIW6aNrepm6Ef7H6S9s76Kkp1MkaW5LK/nX1k8t80smTa2qpvxVvj/EzuTjLSYs3BaUJoCsI43ZNQ9q8y0sVXdDLDa/yDtl3XnlNQ1Vcq+a5+qeML5mTa2qpvh2df//9iRZKRddyb7rp3GVZCZNraqm2GU+S8jLX4C0nIKEJVtMtPGVnUzJkr/j9ipSJ6in6ycAmNdyLSxVd2MjcT/tLwH9MLSCIxBACN1bt6DMUb6HCPQh4BsTtunwPVGQI2ASatG1P1VR8CkrQ6xFagRMGnViLq/6giYtNUhtgI1AkFa5iEYWtSg1uv+jMBUBOI18CpfRpD2BFtkMuRqLOy6GIHFIRBfPgRPDzw9WFxsbNA2BEzabQi5fXEIqNceHOB1GzMgOllHIdyZ+GTqJhQKG6QjLQxysg5GpyAz8cnUTShUNshIC4OcrIPRKchMfDJ1EwqlDTLSwjhZMgY6WkFm2tiqboZR5r+StLJkDPSygsy0sVXdDKPMfwlpMfTz40UaWJKpz4EzbWxVN0mg9l9CWhhHQvKrXNrblWOI3T1fvZ9pY6u6GUOp/yrS0rgheTzUuJC2TBtb1c3Qj/Y/SHtnfRUlO5kih9Yt8K/MyTrKiNbGZwmxUdhwI1nHlzWWlGVoB2oxZ+G0oDQFYJ2TdXz9P9Q2kayKzxJiI7KhSt6DfZMxbAazxnGmja3qZhxl/ivntLJkDPSygsy0sVXdDKPMfxlp8RPgZB0MT0Fm4pOpm1AobThipyJ5in6crKMfzEx8MnUTEYkNTtZBOC0XjQBGaifrWHSEbNwgArI57aAWNxoBIQImrRBMdzUPAibtPDhbixABk1YIpruaBwGTdh6crUWIQJDWyTqEgLqragjEa2An66gGrzuugUB8+eBkHTWQdZ/1EfCctj7G1iBGQL324ACv25ysYyBImfhk6iYkChukIy0McrIORqcgM/HJ1E0oVDbISAuDnKyD0SnITHwydRMKpQ0y0sI4WTIGOlpBZtrYqm6GUea/krSyZAz0soLMtLFV3QyjzH8JaTH08+M8GliS/Oq01Fa9LtPGVnUzqGr/JaSFcSTkJQ0tyDHELlwmq8q0sVXdDJ7UfxVpadyQPB5qXEhbpo2t6mboR/uvIq0iGQONryUzbWxVN2Mp9V9CWsxZOC0oTQFY52QdTtZBLpDMIVk3mh8S0q4tkCVj6Hok3s+0sVXdDKHMfyVpZckY6GUFmWljq7oZRpn/MtJiiuBkHQxPQWbik6mbUChtOGKnInmKfpysox/MTHwydRMRiQ1O1kE4LReNAEZqJ+tYdIRs3CACsjntoBY3GgEhAiatEEx3NQ8CJu08OFuLEAGTVgimu5oHAZN2HpytRYiA+jmt0DR3dRsRwKOrWGvwGNsT7Mdz28nFpJ0MmS/YFQGQ9D6ujS8YonChzNejCf+atBPA8qn7IQDSXqCHC8iH+/TkOe0+6PnaFATkIy3+ipysYyCUmfhk6h6AZHKTdKQFKE7WMRCCTHwydQ9AslOTjLQAxck6BkKQiU+m7gFIdm6SkRYWyJIx7OzN9gszbWxV9/aoTDxDSdp4lFH6gI3f/vBRx0QTpadn2tiqbmkAo7MjRY/4+RnzzI3fvitUTu4j08ZWdW8GCTicoC6yeccf8AmO46b9E+QryNFFQlpoIyEvBzSPIfbA5Xs3ZdrYqu4bQQM541f3/EblDgfK6cE29cfbTlhAe6aNreqeHHbVSFuay9IYjjKfWJEkM21sVfd1qDHKXl0f9OzgnMOephvVEtJC2SW26Lg0BWAdb8huGDDXQaaNreruxhYYjCJk95q+feX0QJaMoc9YQX2mja3qFoTtZhdK0sqSMdw0UXqUaWOruqUBjM5kpMXw72QdA+HJxCdT9wAkOzdJ5rQd7bGo18k6OoBs7Gbik6l7A4b9Dp2sYz/8fPUOCGDkX71UwKXxXP8ujre+XMA5TtaxA9a+RIAAyPcB3bxdE/U99p9O7VY2p52q2Oe3hwCIGv+37UfIeJISJR6DPljtTfhHPaedoNqnNohAfNAYq91WBeSN6cHF+nC08Eg7GiqfKEAgXjTt/ZLJpBVEwl2MRiBG1ZPu2Rht+XlWt3pwvzs9+IAONk9+g7rr4Xyz0cdGYCICwaVzcIrEjZH3xWYfaI+bNZ6z2bxaTxvDdaxxLJW9h/JSp65rEwGQcYhrXVAGR9//AdC8Dmy1h+DtAAAAAElFTkSuQmCC", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- \\frac{1}{c} & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & \\frac{1}{c}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}- \\frac{1}{c} & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & \\frac{1}{c} & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\end{matrix}\\right]$" ], "text/plain": [ - "⎡-1 ⎤\n", - "⎢─── 0 0 0 0⎥\n", - "⎢ c ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 1⎥\n", - "⎢ 0 0 0 0 ─⎥\n", - "⎣ c⎦" + "⎡-1 ⎤\n", + "⎢─── 0 0 0 0 0⎥\n", + "⎢ c ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1 ⎥\n", + "⎢ 0 0 0 0 ─ 0⎥\n", + "⎢ c ⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 0⎦" ] }, - "execution_count": 20, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -845,20 +896,20 @@ " else:\n", " return 0\n", "ll = [pinv(l.subs(u,0)) for l in lambda_list]\n", - "linv_zerou = diag(ll[1], ll[0], ll[0], ll[0], ll[2])\n", + "linv_zerou = diag(ll[1], ll[0], ll[0], ll[0], ll[2], ll[0])\n", "linv_zerou" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{3}}\\\\\\frac{L_{x} c \\left(c du_{dx} \\rho - dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2} \\rho}\\\\0\\\\0\\\\\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{3}}\\\\\\frac{L_{x} c \\left(c du_{dx} \\rho - dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2} \\rho}\\\\0\\\\0\\\\\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c}\\\\0\\end{matrix}\\right]$" ], "text/plain": [ "⎡ 2 ⎛ 2 ⎞⎤\n", @@ -880,10 +931,12 @@ "⎢ 2 ⎛ 2 ⎞⎥\n", "⎢Lₓ⋅c⋅(-c⋅du_dx⋅ρ + dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", "⎢───────────────────────────────────────────────⎥\n", - "⎣ 2⋅Lₓ⋅c ⎦" + "⎢ 2⋅Lₓ⋅c ⎥\n", + "⎢ ⎥\n", + "⎣ 0 ⎦" ] }, - "execution_count": 21, + "execution_count": 32, "metadata": {}, "output_type": "execute_result" } @@ -895,7 +948,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -906,7 +959,8 @@ "dQ_dx[1] = (1.0/2.0)*(L_x*c*(c*du_dx*rho - dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 2)*rho);\n", "dQ_dx[2] = 0;\n", "dQ_dx[3] = 0;\n", - "dQ_dx[4] = (1.0/2.0)*(L_x*c*(-c*du_dx*rho + dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c);\n" + "dQ_dx[4] = (1.0/2.0)*(L_x*c*(-c*du_dx*rho + dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c);\n", + "dQ_dx[5] = 0;\n" ] } ], diff --git a/src/hydro_system.hpp b/src/hydro_system.hpp index 75ce7f619..e056250a5 100644 --- a/src/hydro_system.hpp +++ b/src/hydro_system.hpp @@ -73,9 +73,9 @@ template class HydroSystem : public HyperbolicSystem bool; - AMREX_GPU_DEVICE static auto ComputePrimVars(amrex::Array4 const &cons, int i, int j, int k) -> quokka::valarray; + AMREX_GPU_DEVICE static auto ComputePrimVars(amrex::Array4 const &cons, int i, int j, int k) -> quokka::valarray; - AMREX_GPU_DEVICE static auto ComputeConsVars(quokka::valarray const &prim) -> quokka::valarray; + AMREX_GPU_DEVICE static auto ComputeConsVars(quokka::valarray const &prim) -> quokka::valarray; AMREX_GPU_DEVICE static auto ComputePressure(amrex::Array4 const &cons, int i, int j, int k) -> amrex::Real; @@ -287,7 +287,7 @@ template auto HydroSystem::CheckStatesValid(amre template AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePrimVars(amrex::Array4 const &cons, int i, int j, int k) - -> quokka::valarray + -> quokka::valarray { // convert to primitive vars const auto rho = cons(i, j, k, density_index); @@ -295,6 +295,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePrimVars const auto py = cons(i, j, k, x2Momentum_index); const auto pz = cons(i, j, k, x3Momentum_index); const auto E = cons(i, j, k, energy_index); // *total* gas energy per unit volume + const auto Eint_aux = cons(i, j, k, internalEnergy_index); const auto vx = px / rho; const auto vy = py / rho; const auto vz = pz / rho; @@ -309,13 +310,17 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePrimVars P = quokka::EOS::ComputePressure(rho, thermal_energy, massScalars); } - quokka::valarray primVars{rho, vx, vy, vz, P}; + quokka::valarray primVars{rho, vx, vy, vz, P, Eint_aux}; + + for (int i = 0; i < nscalars_; ++i) { + primVars[primScalar0_index + i] = cons(i, j, k, scalar0_index + i); + } return primVars; } template -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputeConsVars(quokka::valarray const &prim) - -> quokka::valarray +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputeConsVars(quokka::valarray const &prim) + -> quokka::valarray { // convert to conserved vars Real const rho = prim[0]; @@ -323,9 +328,16 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputeConsVars Real const v2 = prim[2]; Real const v3 = prim[3]; Real const P = prim[4]; + Real const Eint_aux = prim[5]; + Real const Eint = quokka::EOS::ComputeEintFromPres(rho, P); Real const Egas = Eint + 0.5 * rho * (v1 * v1 + v2 * v2 + v3 * v3); - quokka::valarray consVars{rho, rho * v1, rho * v2, rho * v3, Egas}; + + quokka::valarray consVars{rho, rho * v1, rho * v2, rho * v3, Egas, Eint_aux}; + + for (int i = 0; i < nscalars_; ++i) { + consVars[scalar0_index + i] = prim[primScalar0_index + i]; + } return consVars; } diff --git a/tests/NSCBC_Channel.in b/tests/NSCBC_Channel.in index d4a4c0813..6cbeb6b46 100644 --- a/tests/NSCBC_Channel.in +++ b/tests/NSCBC_Channel.in @@ -33,13 +33,15 @@ ascent_interval = -1 hydro.rk_integrator_order = 2 hydro.reconstruction_order = 3 -hydro.use_dual_energy = 0 +hydro.use_dual_energy = 1 hydro.low_level_debugging_output = 0 channel.rho0 = 1.1e-3 # g/cc channel.Tgas0 = 320.8398927398333 # K channel.u0 = 2.0e3 # cm/s +channel.s0 = 0 # dimensionless channel.u_inflow = 4.0e3 # cm/s channel.v_inflow = 0. # cm/s channel.w_inflow = 0. # cm/s +channel.s_inflow = 1.0 # dimensionless From b5eb129589dca26503368b4da0099e11aefdf189 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 24 Aug 2023 21:35:40 +0000 Subject: [PATCH 44/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/hydro_system.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hydro_system.hpp b/src/hydro_system.hpp index e056250a5..e4ab68300 100644 --- a/src/hydro_system.hpp +++ b/src/hydro_system.hpp @@ -334,7 +334,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputeConsVars Real const Egas = Eint + 0.5 * rho * (v1 * v1 + v2 * v2 + v3 * v3); quokka::valarray consVars{rho, rho * v1, rho * v2, rho * v3, Egas, Eint_aux}; - + for (int i = 0; i < nscalars_; ++i) { consVars[scalar0_index + i] = prim[primScalar0_index + i]; } From 41adb8d67df0802077477ce1ea3ea11fd191aeff Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 25 Aug 2023 14:59:54 -0400 Subject: [PATCH 45/64] Apply suggestions from code review (add const) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- src/NSCBC/channel.cpp | 24 ++++++++++++------------ src/RadhydroSimulation.hpp | 4 ++-- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index be41b35f3..eea5d2549 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -82,8 +82,8 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: { // set initial conditions amrex::GpuArray const dx = grid_elem.dx_; - amrex::GpuArray prob_lo = grid_elem.prob_lo_; - amrex::GpuArray prob_hi = grid_elem.prob_hi_; + amrex::GpuArray const prob_lo = grid_elem.prob_lo_; + amrex::GpuArray const prob_hi = grid_elem.prob_hi_; const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; @@ -344,7 +344,7 @@ auto problem_main() -> int RadhydroSimulation sim(BCs_cc); - amrex::ParmParse pp("channel"); + amrex::ParmParse const pp("channel"); // initial condition parameters pp.query("rho0", ::rho0); // initial density [g/cc] pp.query("Tgas0", ::Tgas0); // initial temperature [K] @@ -369,8 +369,8 @@ auto problem_main() -> int // extract slice auto [position, values] = fextract(sim.state_new_cc_[0], sim.geom[0], 0, 0., true); - int nx = static_cast(position.size()); - std::vector xs = position; + int const nx = static_cast(position.size()); + std::vector const xs = position; std::vector xs_exact = position; // extract solution @@ -385,11 +385,11 @@ auto problem_main() -> int for (int i = 0; i < nx; ++i) { { - amrex::Real rho = values.at(HydroSystem::density_index)[i]; - amrex::Real xmom = values.at(HydroSystem::x1Momentum_index)[i]; - amrex::Real Egas = values.at(HydroSystem::energy_index)[i]; - amrex::Real scalar = values.at(HydroSystem::scalar0_index)[i]; - amrex::Real Eint = Egas - (xmom * xmom) / (2.0 * rho); + amrex::Real const rho = values.at(HydroSystem::density_index)[i]; + amrex::Real const xmom = values.at(HydroSystem::x1Momentum_index)[i]; + amrex::Real const Egas = values.at(HydroSystem::energy_index)[i]; + amrex::Real const scalar = values.at(HydroSystem::scalar0_index)[i]; + amrex::Real const Eint = Egas - (xmom * xmom) / (2.0 * rho); amrex::Real const gamma = quokka::EOS_Traits::gamma; d.at(i) = rho; vx.at(i) = xmom / rho; @@ -428,8 +428,8 @@ auto problem_main() -> int #ifdef HAVE_PYTHON if (amrex::ParallelDescriptor::IOProcessor()) { // Plot results - int skip = 4; // only plot every 8 elements of exact solution - double msize = 5.0; // marker size +sultsconst +utionconst using mpl_arg = std::map; using mpl_sarg = std::unordered_map; diff --git a/src/RadhydroSimulation.hpp b/src/RadhydroSimulation.hpp index e44734cc3..a20015feb 100644 --- a/src/RadhydroSimulation.hpp +++ b/src/RadhydroSimulation.hpp @@ -1241,7 +1241,7 @@ auto RadhydroSimulation::computeHydroFluxes(amrex::MultiFab const &co if (amrex::ParallelDescriptor::IOProcessor()) { std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); } - std::string fullprefix = + std::string const fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name, "raw_fields/Level_", std::string("StateL_") + quokka::face_dir_str[idim]); amrex::VisMF::Write(leftState[idim], fullprefix); } @@ -1250,7 +1250,7 @@ auto RadhydroSimulation::computeHydroFluxes(amrex::MultiFab const &co if (amrex::ParallelDescriptor::IOProcessor()) { std::filesystem::create_directories(plotfile_name + "/raw_fields/Level_" + std::to_string(lev)); } - std::string fullprefix = + std::string const fullprefix = amrex::MultiFabFileFullPrefix(lev, plotfile_name, "raw_fields/Level_", std::string("StateR_") + quokka::face_dir_str[idim]); amrex::VisMF::Write(rightState[idim], fullprefix); } From 8c117dbca78025788c5955cdd7405d35eabbeb59 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 19:01:02 +0000 Subject: [PATCH 46/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/NSCBC/channel.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index eea5d2549..5bc841802 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -428,9 +428,7 @@ auto problem_main() -> int #ifdef HAVE_PYTHON if (amrex::ParallelDescriptor::IOProcessor()) { // Plot results -sultsconst -utionconst - using mpl_arg = std::map; + sultsconst utionconst using mpl_arg = std::map; using mpl_sarg = std::unordered_map; matplotlibcpp::clf(); From 149dc748ac6956ff4b0d5ab9a183ae5fe35cf8f9 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 25 Aug 2023 15:09:59 -0400 Subject: [PATCH 47/64] update error tolerance --- src/NSCBC/channel.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 5bc841802..8a427477f 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -428,7 +428,9 @@ auto problem_main() -> int #ifdef HAVE_PYTHON if (amrex::ParallelDescriptor::IOProcessor()) { // Plot results - sultsconst utionconst using mpl_arg = std::map; + const int skip = 4; // only plot every 8 elements of exact solution + const double msize = 5.0; // marker size + using mpl_arg = std::map; using mpl_sarg = std::unordered_map; matplotlibcpp::clf(); @@ -491,7 +493,7 @@ auto problem_main() -> int // Compute test success condition int status = 0; - const double error_tol = 3.0e-5; + const double error_tol = 0.0007; if (epsilon > error_tol) { status = 1; } From 20c9093a975a2c4fe75b475b6f721084bd6195fa Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 25 Aug 2023 19:10:10 +0000 Subject: [PATCH 48/64] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/NSCBC/channel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index 8a427477f..c26df7fc1 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -428,7 +428,7 @@ auto problem_main() -> int #ifdef HAVE_PYTHON if (amrex::ParallelDescriptor::IOProcessor()) { // Plot results - const int skip = 4; // only plot every 8 elements of exact solution + const int skip = 4; // only plot every 8 elements of exact solution const double msize = 5.0; // marker size using mpl_arg = std::map; using mpl_sarg = std::unordered_map; From 6eeb041b1e82e6b80f3cae5a57fda39fae9ce5c6 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 25 Aug 2023 15:13:09 -0400 Subject: [PATCH 49/64] remove shock-cloud param file --- tests/ShockCloud_32.in | 53 ------------------------------------------ 1 file changed, 53 deletions(-) delete mode 100644 tests/ShockCloud_32.in diff --git a/tests/ShockCloud_32.in b/tests/ShockCloud_32.in deleted file mode 100644 index b42f599c8..000000000 --- a/tests/ShockCloud_32.in +++ /dev/null @@ -1,53 +0,0 @@ -# ***************************************************************** -# Problem size and geometry -# ***************************************************************** -geometry.prob_lo = 0.0 0.0 0.0 -geometry.prob_hi = 2.4688e+21 6.172e+20 6.172e+20 # 800 x 200 x 200 pc -geometry.is_periodic = 0 1 1 - -# ***************************************************************** -# VERBOSITY -# ***************************************************************** -amr.v = 1 # verbosity in Amr - -# ***************************************************************** -# Resolution and refinement -# ***************************************************************** -amr.n_cell = 64 16 16 -amr.max_level = 0 # number of levels = max_level + 1 -amr.blocking_factor_x = 64 -amr.blocking_factor_y = 16 -amr.blocking_factor_z = 16 # grid size must be divisible by this -amr.max_grid_size = 64 - -# ***************************************************************** -# Quokka options -# ***************************************************************** -cfl = 0.3 -do_reflux = 1 -do_subcycle = 1 -max_walltime = 6:00:00 -max_timesteps = 350 -checkpoint_interval = 5000 -plotfile_interval = 100 -ascent_interval = 1 -derived_vars = pressure entropy nH temperature cooling_length \ - cloud_fraction lab_velocity_x mass velocity_mag - -hydro.rk_integrator_order = 1 -hydro.reconstruction_order = 1 -hydro.use_dual_energy = 0 -hydro.low_level_debugging_output = 1 - -cooling.enabled = 0 -cooling.read_tables_even_if_disabled = 1 -cooling.grackle_data_file = "../extern/grackle_data_files/input/CloudyData_UVB=HM2012.h5" -temperature_floor = 100 - -sharp_cloud_edge = 1 -do_frame_shift = 0 -nH_bg = 0.003356403333 # cm^-3 -nH_cloud = 0.003356403333 # cm^-3 -P_over_k = 1.304005e+04 # K cm^-3 -R_cloud_pc = 16.09084149928867 # pc -Mach_shock = 1.2 From 32f2acea7e515cc58e39b8637b9233af971045e7 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 25 Aug 2023 15:50:06 -0400 Subject: [PATCH 50/64] refactor --- src/NSCBC/channel.cpp | 232 +++--------------------------------------- src/NSCBC_inflow.hpp | 151 +++++++++++++++++++++++++++ src/NSCBC_outflow.hpp | 116 +++++++++++++++++++++ 3 files changed, 282 insertions(+), 217 deletions(-) create mode 100644 src/NSCBC_inflow.hpp create mode 100644 src/NSCBC_outflow.hpp diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index c26df7fc1..ec7a5cfb6 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -26,18 +26,17 @@ #include "AMReX_ParmParse.H" #include "AMReX_REAL.H" #include "AMReX_SPACE.H" -#include "AMReX_iMultiFab.H" #include "ArrayUtil.hpp" #include "EOS.hpp" #include "HydroState.hpp" +#include "NSCBC_inflow.hpp" +#include "NSCBC_outflow.hpp" #include "RadhydroSimulation.hpp" #include "channel.hpp" #include "fextract.hpp" #include "fundamental_constants.H" #include "hydro_system.hpp" -#include "physics_info.hpp" -#include "physics_numVars.hpp" #include "radiation_system.hpp" #include "valarray.hpp" #ifdef HAVE_PYTHON @@ -67,23 +66,20 @@ template <> struct Physics_Traits { // global variables needed for Dirichlet boundary condition and initial conditions namespace { -Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -Real s0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_outflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -GpuArray::numPassiveScalars> s_inflow{}; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -}; // namespace +Real rho0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +Real s0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real Tgas0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_outflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED GpuArray::numPassiveScalars> s_inflow{}; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { // set initial conditions - amrex::GpuArray const dx = grid_elem.dx_; - amrex::GpuArray const prob_lo = grid_elem.prob_lo_; - amrex::GpuArray const prob_hi = grid_elem.prob_hi_; const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; @@ -106,117 +102,6 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka: }); } -template -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const &Q, - quokka::valarray const &dQ_dx_data, - const Real P_t, const Real L_x) - -> quokka::valarray -{ - // return dQ/dx corresponding to subsonic outflow on the x1 upper boundary - - const Real rho = Q[0]; - const Real u = Q[1]; - const Real v = Q[2]; - const Real w = Q[3]; - const Real P = Q[4]; - - const Real drho_dx = dQ_dx_data[0]; - const Real du_dx = dQ_dx_data[1]; - const Real dv_dx = dQ_dx_data[2]; - const Real dw_dx = dQ_dx_data[3]; - const Real dP_dx = dQ_dx_data[4]; - const Real dEint_aux_dx = dQ_dx_data[5]; - - const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); - const Real M = std::sqrt(u * u + v * v + w * w) / c; - amrex::Real const K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posed Euler equations - - // see SymPy notebook for derivation - quokka::valarray dQ_dx{}; - dQ_dx[0] = 0.5 * (-K * (P - P_t) + (c - u) * (2.0 * c * c * drho_dx + c * du_dx * rho - dP_dx)) / (c * c * (c - u)); - dQ_dx[1] = 0.5 * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); - dQ_dx[2] = dv_dx; - dQ_dx[3] = dw_dx; - dQ_dx[4] = 0.5 * (-K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); - dQ_dx[5] = dEint_aux_dx; - for (int i = 0; i < Nscalars; ++i) { - dQ_dx[6 + i] = dQ_dx_data[6 + i]; - } - - return dQ_dx; -} - -template -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray const &Q, - quokka::valarray const &dQ_dx_data, - const Real T_t, const Real u_t, const Real v_t, const Real w_t, - amrex::GpuArray const &s_t, const Real L_x) - -> quokka::valarray -{ - // return dQ/dx corresponding to subsonic inflow on the x1 lower boundary - // (This is only necessary for continuous inflows, i.e., where as shock or contact discontinuity is not desired.) - // NOTE: This boundary condition is only defined for an ideal gas (with constant k_B/mu). - - const Real rho = Q[0]; - const Real u = Q[1]; - const Real v = Q[2]; - const Real w = Q[3]; - const Real P = Q[4]; - const Real Eint_aux = Q[5]; - amrex::GpuArray s{}; - for (int i = 0; i < Nscalars; ++i) { - s[i] = Q[6 + i]; - } - - const Real T = quokka::EOS::ComputeTgasFromEint(rho, quokka::EOS::ComputeEintFromPres(rho, P)); - const Real Eint_aux_t = quokka::EOS::ComputeEintFromTgas(rho, T_t); - - const Real du_dx = dQ_dx_data[1]; - const Real dP_dx = dQ_dx_data[4]; - - const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); - const Real M = std::sqrt(u * u + v * v + w * w) / c; - - const Real eta_2 = 2.; - const Real eta_3 = 2.; - const Real eta_4 = 2.; - const Real eta_5 = 2.; - const Real eta_6 = 2.; - - const Real R = quokka::EOS_Traits::boltzmann_constant / quokka::EOS_Traits::mean_molecular_weight; - - // see SymPy notebook for derivation - quokka::valarray dQ_dx{}; - if (u != 0.) { - dQ_dx[0] = 0.5 * - (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - 2 * R * c * eta_2 * rho * (c + u) * (T - T_t) - - std::pow(c, 2) * eta_5 * rho * u * (std::pow(M, 2) - 1) * (u - u_t)) / - (L_x * std::pow(c, 2) * u * (c + u)); - dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / - (L_x * c * rho * (c + u)); - dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); - dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); - dQ_dx[4] = - 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / (L_x * (c + u)); - dQ_dx[5] = c * eta_6 * (Eint_aux - Eint_aux_t) / (L_x * u); - for (int i = 0; i < Nscalars; ++i) { - dQ_dx[6 + i] = c * eta_6 * (s[i] - s_t[i]) / (L_x * u); - } - } else { // u == 0 - dQ_dx[0] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * std::pow(c, 3)); - dQ_dx[1] = 0.5 * (L_x * c * (c * du_dx * rho - dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * (c * c) * rho); - dQ_dx[2] = 0; - dQ_dx[3] = 0; - dQ_dx[4] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * c); - dQ_dx[5] = 0; - for (int i = 0; i < Nscalars; ++i) { - dQ_dx[6 + i] = 0; - } - } - - return dQ_dx; -} - template <> AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundaryConditions(const amrex::IntVect &iv, amrex::Array4 const &consVar, int /*dcomp*/, int /*numcomp*/, amrex::GeometryData const &geom, @@ -229,98 +114,11 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda const auto &domain_hi = box.hiVect3d(); const int ilo = domain_lo[0]; const int ihi = domain_hi[0]; - const Real dx = geom.CellSize(0); - const Real Lx = geom.prob_domain.length(0); - - const Real T_inflow = ::Tgas0; - const Real u_inflow = ::u_inflow; - const Real v_inflow = ::v_inflow; - const Real w_inflow = ::w_inflow; - const Real P_outflow = ::P_outflow; - const GpuArray::nscalars_> s_inflow = ::s_inflow; - - constexpr int N = HydroSystem::nvar_; if (i < ilo) { - // x1 lower boundary -- subsonic inflow - - // compute one-sided dQ/dx from the data - quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ilo, j, k); - quokka::valarray const Q_ip1 = HydroSystem::ComputePrimVars(consVar, ilo + 1, j, k); - quokka::valarray const Q_ip2 = HydroSystem::ComputePrimVars(consVar, ilo + 2, j, k); - quokka::valarray const dQ_dx_data = (-3. * Q_i + 4. * Q_ip1 - Q_ip2) / (2. * dx); - - // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = - dQ_dx_inflow_x1_lower::nscalars_>(Q_i, dQ_dx_data, T_inflow, u_inflow, v_inflow, w_inflow, s_inflow, Lx); - - // compute centered ghost values - quokka::valarray const Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; - quokka::valarray const Q_im2 = -2.0 * Q_ip1 - 3.0 * Q_i + 6.0 * Q_im1 + 6.0 * dx * dQ_dx; - quokka::valarray const Q_im3 = 3.0 * Q_ip1 + 10.0 * Q_i - 18.0 * Q_im1 + 6.0 * Q_im2 - 12.0 * dx * dQ_dx; - quokka::valarray const Q_im4 = -2.0 * Q_ip1 - 13.0 * Q_i + 24.0 * Q_im1 - 12.0 * Q_im2 + 4.0 * Q_im3 + 12.0 * dx * dQ_dx; - - // set cell values - quokka::valarray consCell{}; - if (i == ilo - 1) { - consCell = HydroSystem::ComputeConsVars(Q_im1); - } else if (i == ilo - 2) { - consCell = HydroSystem::ComputeConsVars(Q_im2); - } else if (i == ilo - 3) { - consCell = HydroSystem::ComputeConsVars(Q_im3); - } else if (i == ilo - 4) { - consCell = HydroSystem::ComputeConsVars(Q_im4); - } - - consVar(i, j, k, HydroSystem::density_index) = consCell[0]; - consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; - consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; - consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; - consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; - consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; - for (int i = 0; i < HydroSystem::nscalars_; ++i) { - consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; - } - + NSCBC::setInflowX1Lower(iv, consVar, geom, ::Tgas0, ::u_inflow, ::v_inflow, ::w_inflow, ::s_inflow); } else if (i > ihi) { - // x1 upper boundary -- subsonic outflow - - // compute one-sided dQ/dx from the data - quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ihi, j, k); - quokka::valarray const Q_im1 = HydroSystem::ComputePrimVars(consVar, ihi - 1, j, k); - quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); - quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); - - // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = dQ_dx_outflow_x1_upper::nscalars_>(Q_i, dQ_dx_data, P_outflow, Lx); - - // compute centered ghost values - quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; - quokka::valarray const Q_ip2 = -2.0 * Q_im1 - 3.0 * Q_i + 6.0 * Q_ip1 - 6.0 * dx * dQ_dx; - quokka::valarray const Q_ip3 = 3.0 * Q_im1 + 10.0 * Q_i - 18.0 * Q_ip1 + 6.0 * Q_ip2 + 12.0 * dx * dQ_dx; - quokka::valarray const Q_ip4 = -2.0 * Q_im1 - 13.0 * Q_i + 24.0 * Q_ip1 - 12.0 * Q_ip2 + 4.0 * Q_ip3 - 12.0 * dx * dQ_dx; - - // set cell values - quokka::valarray consCell{}; - if (i == ihi + 1) { - consCell = HydroSystem::ComputeConsVars(Q_ip1); - } else if (i == ihi + 2) { - consCell = HydroSystem::ComputeConsVars(Q_ip2); - } else if (i == ihi + 3) { - consCell = HydroSystem::ComputeConsVars(Q_ip3); - } else if (i == ihi + 4) { - consCell = HydroSystem::ComputeConsVars(Q_ip4); - } - - consVar(i, j, k, HydroSystem::density_index) = consCell[0]; - consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; - consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; - consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; - consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; - consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; - for (int i = 0; i < HydroSystem::nscalars_; ++i) { - consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; - } + NSCBC::setOutflowX1Upper(iv, consVar, geom, P_outflow); } } @@ -408,7 +206,7 @@ auto problem_main() -> int // compute error norm amrex::Real err_sq = 0.; - for (int n = 0; n < sol.size(); ++n) { + for (size_t n = 0; n < sol.size(); ++n) { amrex::Real dU_k = 0.; amrex::Real U_k = 0; for (int i = 0; i < nx; ++i) { diff --git a/src/NSCBC_inflow.hpp b/src/NSCBC_inflow.hpp new file mode 100644 index 000000000..098e72a7f --- /dev/null +++ b/src/NSCBC_inflow.hpp @@ -0,0 +1,151 @@ +#ifndef NSCBC_INFLOW_HPP_ // NOLINT +#define NSCBC_INFLOW_HPP_ +//============================================================================== +// Quokka -- two-moment radiation hydrodynamics on GPUs for astrophysics +// Copyright 2023 Benjamin Wibking. +// Released under the MIT license. See LICENSE file included in the GitHub repo. +//============================================================================== +/// \file NSCBC_inflow.hpp +/// \brief Implements the Navier-Stokes Characteristic Boundary Condition for +/// subsonic, continuous inflow. This should NOT be used for a shock boundary +/// condition. + +#include "AMReX_GpuQualifiers.H" +#include "AMReX_REAL.H" +#include "EOS.hpp" +#include "hydro_system.hpp" +#include "physics_numVars.hpp" +#include "valarray.hpp" + +namespace NSCBC +{ +namespace detail +{ +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray::nvar_> const &Q, + quokka::valarray::nvar_> const &dQ_dx_data, const Real T_t, + const Real u_t, const Real v_t, const Real w_t, + amrex::GpuArray::nscalars_> const &s_t, const Real L_x) + -> quokka::valarray::nvar_> +{ + // return dQ/dx corresponding to subsonic inflow on the x1 lower boundary + // (This is only necessary for continuous inflows, i.e., where as shock or contact discontinuity is not desired.) + // NOTE: This boundary condition is only defined for an ideal gas (with constant k_B/mu). + + const Real rho = Q[0]; + const Real u = Q[1]; + const Real v = Q[2]; + const Real w = Q[3]; + const Real P = Q[4]; + const Real Eint_aux = Q[5]; + amrex::GpuArray::nscalars_> s{}; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + s[i] = Q[6 + i]; + } + + const Real T = quokka::EOS::ComputeTgasFromEint(rho, quokka::EOS::ComputeEintFromPres(rho, P)); + const Real Eint_aux_t = quokka::EOS::ComputeEintFromTgas(rho, T_t); + + const Real du_dx = dQ_dx_data[1]; + const Real dP_dx = dQ_dx_data[4]; + + const Real c = quokka::EOS::ComputeSoundSpeed(rho, P); + const Real M = std::sqrt(u * u + v * v + w * w) / c; + + const Real eta_2 = 2.; + const Real eta_3 = 2.; + const Real eta_4 = 2.; + const Real eta_5 = 2.; + const Real eta_6 = 2.; + + const Real R = quokka::EOS_Traits::boltzmann_constant / quokka::EOS_Traits::mean_molecular_weight; + + // see SymPy notebook for derivation + quokka::valarray::nvar_> dQ_dx{}; + if (u != 0.) { + dQ_dx[0] = 0.5 * + (L_x * u * (c + u) * (-c * du_dx * rho + dP_dx) - 2 * R * c * eta_2 * rho * (c + u) * (T - T_t) - + std::pow(c, 2) * eta_5 * rho * u * (std::pow(M, 2) - 1) * (u - u_t)) / + (L_x * std::pow(c, 2) * u * (c + u)); + dQ_dx[1] = 0.5 * (L_x * (c + u) * (c * du_dx * rho - dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / + (L_x * c * rho * (c + u)); + dQ_dx[2] = c * eta_3 * (v - v_t) / (L_x * u); + dQ_dx[3] = c * eta_4 * (w - w_t) / (L_x * u); + dQ_dx[4] = + 0.5 * (L_x * (c + u) * (-c * du_dx * rho + dP_dx) - std::pow(c, 2) * eta_5 * rho * (std::pow(M, 2) - 1) * (u - u_t)) / (L_x * (c + u)); + dQ_dx[5] = c * eta_6 * (Eint_aux - Eint_aux_t) / (L_x * u); + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + dQ_dx[6 + i] = c * eta_6 * (s[i] - s_t[i]) / (L_x * u); + } + } else { // u == 0 + dQ_dx[0] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * std::pow(c, 3)); + dQ_dx[1] = 0.5 * (L_x * c * (c * du_dx * rho - dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * (c * c) * rho); + dQ_dx[2] = 0; + dQ_dx[3] = 0; + dQ_dx[4] = 0.5 * (L_x * c * (-c * du_dx * rho + dP_dx) + (c * c) * eta_5 * rho * u_t * ((M * M) - 1)) / (L_x * c); + dQ_dx[5] = 0; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + dQ_dx[6 + i] = 0; + } + } + + return dQ_dx; +} +} // namespace detail + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setInflowX1Lower(const amrex::IntVect &iv, amrex::Array4 const &consVar, amrex::GeometryData const &geom, + const amrex::Real T_t, const amrex::Real u_t, const amrex::Real v_t, const amrex::Real w_t, + amrex::GpuArray::nscalars_> const &s_t) +{ + // x1 upper boundary -- subsonic outflow + auto [i, j, k] = iv.dim3(); + amrex::Box const &box = geom.Domain(); + const auto &domain_lo = box.loVect3d(); + const int ilo = domain_lo[0]; + const Real dx = geom.CellSize(0); + const Real Lx = geom.prob_domain.length(0); + constexpr int N = HydroSystem::nvar_; + + /// x1 lower boundary -- subsonic inflow + + // compute one-sided dQ/dx from the data + quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ilo, j, k); + quokka::valarray const Q_ip1 = HydroSystem::ComputePrimVars(consVar, ilo + 1, j, k); + quokka::valarray const Q_ip2 = HydroSystem::ComputePrimVars(consVar, ilo + 2, j, k); + quokka::valarray const dQ_dx_data = (-3. * Q_i + 4. * Q_ip1 - Q_ip2) / (2. * dx); + + // compute dQ/dx with modified characteristics + quokka::valarray const dQ_dx = detail::dQ_dx_inflow_x1_lower(Q_i, dQ_dx_data, T_t, u_t, v_t, w_t, s_t, Lx); + + // compute centered ghost values + quokka::valarray const Q_im1 = Q_ip1 - 2.0 * dx * dQ_dx; + quokka::valarray const Q_im2 = -2.0 * Q_ip1 - 3.0 * Q_i + 6.0 * Q_im1 + 6.0 * dx * dQ_dx; + quokka::valarray const Q_im3 = 3.0 * Q_ip1 + 10.0 * Q_i - 18.0 * Q_im1 + 6.0 * Q_im2 - 12.0 * dx * dQ_dx; + quokka::valarray const Q_im4 = -2.0 * Q_ip1 - 13.0 * Q_i + 24.0 * Q_im1 - 12.0 * Q_im2 + 4.0 * Q_im3 + 12.0 * dx * dQ_dx; + + // set cell values + quokka::valarray consCell{}; + if (i == ilo - 1) { + consCell = HydroSystem::ComputeConsVars(Q_im1); + } else if (i == ilo - 2) { + consCell = HydroSystem::ComputeConsVars(Q_im2); + } else if (i == ilo - 3) { + consCell = HydroSystem::ComputeConsVars(Q_im3); + } else if (i == ilo - 4) { + consCell = HydroSystem::ComputeConsVars(Q_im4); + } + + consVar(i, j, k, HydroSystem::density_index) = consCell[0]; + consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; + consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; + consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; + consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; + consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; + } +} +} // namespace NSCBC + +#endif // NSCBC_INFLOW_HPP_ \ No newline at end of file diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp new file mode 100644 index 000000000..13467a2e1 --- /dev/null +++ b/src/NSCBC_outflow.hpp @@ -0,0 +1,116 @@ +#ifndef NSCBC_OUTFLOW_HPP_ // NOLINT +#define NSCBC_OUTFLOW_HPP_ +//============================================================================== +// Quokka -- two-moment radiation hydrodynamics on GPUs for astrophysics +// Copyright 2023 Benjamin Wibking. +// Released under the MIT license. See LICENSE file included in the GitHub repo. +//============================================================================== +/// \file NSCBC_outflow.hpp +/// \brief Implements the Navier-Stokes Characteristic Boundary Condition for +/// subsonic outflows. (This also works trivially for _super_sonic outflows.) + +#include "AMReX_GpuQualifiers.H" +#include "AMReX_REAL.H" +#include "EOS.hpp" +#include "hydro_system.hpp" +#include "physics_numVars.hpp" +#include "valarray.hpp" + +namespace NSCBC +{ +namespace detail +{ +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray::nvar_> const &Q, + quokka::valarray::nvar_> const &dQ_dx_data, + const amrex::Real P_t, const amrex::Real L_x) + -> quokka::valarray::nvar_> +{ + // return dQ/dx corresponding to subsonic outflow on the x1 upper boundary + + const amrex::Real rho = Q[0]; + const amrex::Real u = Q[1]; + const amrex::Real v = Q[2]; + const amrex::Real w = Q[3]; + const amrex::Real P = Q[4]; + + const amrex::Real drho_dx = dQ_dx_data[0]; + const amrex::Real du_dx = dQ_dx_data[1]; + const amrex::Real dv_dx = dQ_dx_data[2]; + const amrex::Real dw_dx = dQ_dx_data[3]; + const amrex::Real dP_dx = dQ_dx_data[4]; + const amrex::Real dEint_aux_dx = dQ_dx_data[5]; + + const amrex::Real c = quokka::EOS::ComputeSoundSpeed(rho, P); + const amrex::Real M = std::sqrt(u * u + v * v + w * w) / c; + const amrex::Real K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posed Euler equations + + // see SymPy notebook for derivation + quokka::valarray::nvar_> dQ_dx{}; + dQ_dx[0] = 0.5 * (-K * (P - P_t) + (c - u) * (2.0 * c * c * drho_dx + c * du_dx * rho - dP_dx)) / (c * c * (c - u)); + dQ_dx[1] = 0.5 * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); + dQ_dx[2] = dv_dx; + dQ_dx[3] = dw_dx; + dQ_dx[4] = 0.5 * (-K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); + dQ_dx[5] = dEint_aux_dx; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + dQ_dx[6 + i] = dQ_dx_data[6 + i]; + } + + return dQ_dx; +} +} // namespace detail + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowX1Upper(const amrex::IntVect &iv, amrex::Array4 const &consVar, amrex::GeometryData const &geom, + const amrex::Real P_outflow) +{ + // x1 upper boundary -- subsonic outflow + auto [i, j, k] = iv.dim3(); + amrex::Box const &box = geom.Domain(); + const auto &domain_hi = box.hiVect3d(); + const int ihi = domain_hi[0]; + const Real dx = geom.CellSize(0); + const Real Lx = geom.prob_domain.length(0); + constexpr int N = HydroSystem::nvar_; + + // compute one-sided dQ/dx from the data + quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ihi, j, k); + quokka::valarray const Q_im1 = HydroSystem::ComputePrimVars(consVar, ihi - 1, j, k); + quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); + quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); + + // compute dQ/dx with modified characteristics + quokka::valarray const dQ_dx = detail::dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, P_outflow, Lx); + + // compute centered ghost values + quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; + quokka::valarray const Q_ip2 = -2.0 * Q_im1 - 3.0 * Q_i + 6.0 * Q_ip1 - 6.0 * dx * dQ_dx; + quokka::valarray const Q_ip3 = 3.0 * Q_im1 + 10.0 * Q_i - 18.0 * Q_ip1 + 6.0 * Q_ip2 + 12.0 * dx * dQ_dx; + quokka::valarray const Q_ip4 = -2.0 * Q_im1 - 13.0 * Q_i + 24.0 * Q_ip1 - 12.0 * Q_ip2 + 4.0 * Q_ip3 - 12.0 * dx * dQ_dx; + + // set cell values + quokka::valarray consCell{}; + if (i == ihi + 1) { + consCell = HydroSystem::ComputeConsVars(Q_ip1); + } else if (i == ihi + 2) { + consCell = HydroSystem::ComputeConsVars(Q_ip2); + } else if (i == ihi + 3) { + consCell = HydroSystem::ComputeConsVars(Q_ip3); + } else if (i == ihi + 4) { + consCell = HydroSystem::ComputeConsVars(Q_ip4); + } + + consVar(i, j, k, HydroSystem::density_index) = consCell[0]; + consVar(i, j, k, HydroSystem::x1Momentum_index) = consCell[1]; + consVar(i, j, k, HydroSystem::x2Momentum_index) = consCell[2]; + consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; + consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; + consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; + } +} +} // namespace NSCBC + +#endif // NSCBC_OUTFLOW_HPP_ \ No newline at end of file From 0c73a0eba7273cc97185f286a4b3493d986da06a Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 25 Aug 2023 17:44:31 -0400 Subject: [PATCH 51/64] add convecting vortex test --- src/NSCBC/CMakeLists.txt | 2 + src/NSCBC/vortex.cpp | 179 +++++++++++++++++++++++++++++++++++++++ src/NSCBC/vortex.hpp | 20 +++++ src/NSCBC/vortex.ipynb | 145 +++++++++++++++++++++++++++++++ tests/NSCBC_Vortex.in | 46 ++++++++++ 5 files changed, 392 insertions(+) create mode 100644 src/NSCBC/vortex.cpp create mode 100644 src/NSCBC/vortex.hpp create mode 100644 src/NSCBC/vortex.ipynb create mode 100644 tests/NSCBC_Vortex.in diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt index 1ce424c39..84ccdcb89 100644 --- a/src/NSCBC/CMakeLists.txt +++ b/src/NSCBC/CMakeLists.txt @@ -1,7 +1,9 @@ add_executable(test_channel_flow channel.cpp ${QuokkaObjSources} ../fextract.cpp) +add_executable(test_vortex vortex.cpp ${QuokkaObjSources}) if(AMReX_GPU_BACKEND MATCHES "CUDA") setup_target_for_cuda_compilation(test_channel_flow) + setup_target_for_cuda_compilation(test_vortex) endif(AMReX_GPU_BACKEND MATCHES "CUDA") add_test(NAME ChannelFlow COMMAND test_channel_flow NSCBC_Channel.in WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) diff --git a/src/NSCBC/vortex.cpp b/src/NSCBC/vortex.cpp new file mode 100644 index 000000000..1f0db29d9 --- /dev/null +++ b/src/NSCBC/vortex.cpp @@ -0,0 +1,179 @@ +//============================================================================== +// TwoMomentRad - a radiation transport library for patch-based AMR codes +// Copyright 2020 Benjamin Wibking. +// Released under the MIT license. See LICENSE file included in the GitHub repo. +//============================================================================== +/// \file vortex.cpp +/// \brief Implements a subsonic vortex flow problem with Navier-Stokes +/// Characteristic Boundary Conditions (NSCBC). +/// +#include +#include +#include + +#include "AMReX.H" +#include "AMReX_Array.H" +#include "AMReX_BC_TYPES.H" +#include "AMReX_BLProfiler.H" +#include "AMReX_BLassert.H" +#include "AMReX_FabArray.H" +#include "AMReX_Geometry.H" +#include "AMReX_GpuDevice.H" +#include "AMReX_IntVect.H" +#include "AMReX_MultiFab.H" +#include "AMReX_ParallelContext.H" +#include "AMReX_ParallelDescriptor.H" +#include "AMReX_ParmParse.H" +#include "AMReX_REAL.H" +#include "AMReX_SPACE.H" + +#include "ArrayUtil.hpp" +#include "EOS.hpp" +#include "HydroState.hpp" +#include "NSCBC_inflow.hpp" +#include "NSCBC_outflow.hpp" +#include "RadhydroSimulation.hpp" +#include "fextract.hpp" +#include "fundamental_constants.H" +#include "hydro_system.hpp" +#include "radiation_system.hpp" +#include "valarray.hpp" +#include "vortex.hpp" + +using amrex::Real; + +struct Vortex { +}; // dummy type to allow compile-type polymorphism via template specialization + +template <> struct quokka::EOS_Traits { + static constexpr double gamma = 1.4; + static constexpr double mean_molecular_weight = 28.96 * C::m_u; // air + static constexpr double boltzmann_constant = C::k_B; +}; + +template <> struct Physics_Traits { + static constexpr bool is_hydro_enabled = true; + static constexpr bool is_chemistry_enabled = false; + static constexpr bool is_mhd_enabled = false; + static constexpr int numMassScalars = 0; // number of mass scalars + static constexpr int numPassiveScalars = numMassScalars + 1; // number of passive scalars + static constexpr bool is_radiation_enabled = false; +}; + +// global variables needed for Dirichlet boundary condition and initial conditions +namespace +{ +Real G_vortex = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real T_ref = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_ref = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED GpuArray::nscalars_> s_inflow{}; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace + +template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) +{ + // set initial conditions + const amrex::Box &indexRange = grid_elem.indexRange_; + const amrex::Array4 &state_cc = grid_elem.array_; + amrex::GpuArray dx = grid_elem.dx_; + amrex::GpuArray prob_lo = grid_elem.prob_lo_; + amrex::GpuArray prob_hi = grid_elem.prob_hi_; + + constexpr Real gamma = quokka::EOS_Traits::gamma; + constexpr Real R = quokka::EOS_Traits::boltzmann_constant / quokka::EOS_Traits::mean_molecular_weight; + const Real c = std::sqrt(gamma * R * T_ref); + + const Real G = ::G_vortex; + const Real R_v = 0.1 * (prob_hi[0] - prob_lo[0]); + + amrex::ParallelFor(indexRange, [=] AMREX_GPU_DEVICE(int i, int j, int k) { + amrex::Real const x = prob_lo[0] + (i + static_cast(0.5)) * dx[0]; + amrex::Real const y = prob_lo[1] + (j + static_cast(0.5)) * dx[1]; + + Real const P = P_ref + -0.5 * std::pow(G, 2) * P_ref * gamma * std::exp((-std::pow(x, 2) - std::pow(y, 2)) / std::pow(R_v, 2)) / + (std::pow(R_v, 2) * std::pow(c, 2)); + + Real const rho = P / (R * T_ref); + Real const u = u_inflow + -G * y * std::exp(-1.0 / 2.0 * (std::pow(x, 2) + std::pow(y, 2)) / std::pow(R_v, 2)) / std::pow(R_v, 2); + Real const v = v_inflow + G * x * std::exp(-1.0 / 2.0 * (std::pow(x, 2) + std::pow(y, 2)) / std::pow(R_v, 2)) / std::pow(R_v, 2); + Real const w = w_inflow; + + Real const xmom = rho * u; + Real const ymom = rho * v; + Real const zmom = rho * w; + Real const Eint = quokka::EOS::ComputeEintFromPres(rho, P); + Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); + Real const scalar = ::s_inflow[0]; + + state_cc(i, j, k, HydroSystem::density_index) = rho; + state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; + state_cc(i, j, k, HydroSystem::x2Momentum_index) = ymom; + state_cc(i, j, k, HydroSystem::x3Momentum_index) = zmom; + state_cc(i, j, k, HydroSystem::energy_index) = Egas; + state_cc(i, j, k, HydroSystem::internalEnergy_index) = Eint; + state_cc(i, j, k, HydroSystem::scalar0_index) = scalar; + }); +} + +template <> +AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundaryConditions(const amrex::IntVect &iv, amrex::Array4 const &consVar, + int /*dcomp*/, int /*numcomp*/, amrex::GeometryData const &geom, + const Real /*time*/, const amrex::BCRec * /*bcr*/, int /*bcomp*/, + int /*orig_comp*/) +{ + auto [i, j, k] = iv.dim3(); + amrex::Box const &box = geom.Domain(); + const auto &domain_lo = box.loVect3d(); + const auto &domain_hi = box.hiVect3d(); + const int ilo = domain_lo[0]; + const int ihi = domain_hi[0]; + + if (i < ilo) { + NSCBC::setInflowX1Lower(iv, consVar, geom, ::T_ref, ::u_inflow, ::v_inflow, ::w_inflow, ::s_inflow); + } else if (i > ihi) { + NSCBC::setOutflowX1Upper(iv, consVar, geom, ::P_ref); + } +} + +auto problem_main() -> int +{ + // Problem initialization + constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; + amrex::Vector BCs_cc(ncomp_cc); + for (int n = 0; n < ncomp_cc; ++n) { + BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // NSCBC inflow + BCs_cc[n].setHi(0, amrex::BCType::ext_dir); // NSCBC outflow + + if constexpr (AMREX_SPACEDIM >= 2) { + BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic + BCs_cc[n].setHi(1, amrex::BCType::int_dir); + } else if (AMREX_SPACEDIM == 3) { + BCs_cc[n].setLo(2, amrex::BCType::int_dir); + BCs_cc[n].setHi(2, amrex::BCType::int_dir); + } + } + + RadhydroSimulation sim(BCs_cc); + + amrex::ParmParse const pp("vortex"); + // initial condition parameters + pp.query("strength", ::G_vortex); // vortex strength + pp.query("Tgas0", ::T_ref); // initial temperature [K] + pp.query("P0", ::P_ref); // initial pressure [erg cm^-3] + // boundary condition parameters + pp.query("u_inflow", ::u_inflow); // inflow velocity along x-axis [cm/s] + pp.query("v_inflow", ::v_inflow); // transverse inflow velocity (v_y) [cm/s] + pp.query("w_inflow", ::w_inflow); // transverse inflow velocity (v_z) [cm/s] + pp.query("s_inflow", ::s_inflow[0]); // inflow passive scalar [dimensionless] + + // Set initial conditions + sim.setInitialConditions(); + + // run simulation + sim.evolve(); + + const int status = 0; + return status; +} diff --git a/src/NSCBC/vortex.hpp b/src/NSCBC/vortex.hpp new file mode 100644 index 000000000..629cc5c8e --- /dev/null +++ b/src/NSCBC/vortex.hpp @@ -0,0 +1,20 @@ +#ifndef VORTEX_HPP // NOLINT +#define VORTEX_HPP +//============================================================================== +// TwoMomentRad - a radiation transport library for patch-based AMR codes +// Copyright 2020 Benjamin Wibking. +// Released under the MIT license. See LICENSE file included in the GitHub repo. +//============================================================================== +/// \file vortex.hpp +/// \brief Implements a subsonic vortex flow problem with Navier-Stokes +/// Characteristic Boundary Conditions (NSCBC). +/// + +// external headers +#include + +// internal headers + +// function definitions + +#endif // VORTEX_HPP diff --git a/src/NSCBC/vortex.ipynb b/src/NSCBC/vortex.ipynb new file mode 100644 index 000000000..70a1a35fa --- /dev/null +++ b/src/NSCBC/vortex.ipynb @@ -0,0 +1,145 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import *\n", + "init_printing(use_unicode=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convecting vortex" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "x = Symbol('x')\n", + "y = Symbol('y')\n", + "u_0 = Symbol('u_0')\n", + "R_v = Symbol('R_v')\n", + "G = Symbol('G')\n", + "R = sqrt(x**2 + y**2)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFIAAAAfCAYAAAB06popAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEdUlEQVRoBeWZ7VHcMBBAjwwFAOkg6YCPDqADSAnQAUx+wb8MdACpIIEOSAchdAAdAOmAvCcsR+ezfb7z2XMedmZvZVneXa12Vyvdyuvr62iocHZ2tovua+An8DN4Td8vaCdQJ2+1E4n9MdVw64qDatAXcMXnjqBS3oeOBPbFdisRpFf+TZ67aFbKG7Qh8cLHxFrntA+S54U36+StDDlHRksxwUval9D72NclLZWnIYeMp6en5+Cac4Aedz2XKnlL7ZGs/CaetQ26Iz+B5sAt+o+gI+gfiGMiPNLn2LmAb/f5cAd8on0hE6iePlXesu/a20ziCtRY59A90FwYgHaa/GN3W/obBnsygb9yN2wLdfJ6NyTKuLueBM3Kf/JakLFX2RDrxVvb9NV9mw3/T2aUd8P4a7425wq53LfHmt+uc0ob/jHnQW/BzSwPHrbhOe1b5DzEManc2FdFlz1H6h16osX2R/ABvMNrOtud4X2MDMF8bH5sVOD3HtpBxYY/TKLTurCoBvJMO25YhrgbT0wtxaETz0ttyAltu+/Q83cwohvMGjTs1k3E9hraKDbcG5Ip1uzVkFN0GfTrdxfaRIUljSFsPlzY1du7MyTGq7wK493cUGpIVs0VOwRDhQ+1FBBueedJw9U8gs5UHAcOHf+gkycfS5iom2WT8znhnfNIT0POI86N5vwwYUiEqcRX8Bt4kAkPEmjvg1b9hkd+VAsve/hBtnI1Sl1YWnfuMjaclVWLtnP6DjqfTq7exgyJEJVQSS8GUoF0BYWsr/RSx3R2pa+sCmgSlp6Pi7qps3PLgXnoEHrpQor73JAwDCsJ83Xade7uaeMLYyYMnWvZXaNJWHp784x+FtTWg24onlBuoAFoG00h1Gkfg7n3ZkNmJh/8ImNs2Jj36ozo8Gfwp42+Ad3SxdMYZScf56GRNJyeqUFzr6PfqzdD/YW2dW3jopuxlbAKM8NUxh6NmhyJnEy8HckZ8625y9zqvaGgJ8QEHzoW9YOs0rDMdBhBgzNAnZP6Gu5hEXhOvXpRKo30yLgiE8Ypk6KSYL7CjuFZL3Clf9C+EGnLT8MuFOAdw/Ketg6QgnrcpR20t0F19sjnYncCGlLhQjFBv/VO+UU5Pdr86sVramD5jiX4KaymvoZ/ZVjyzhB24TZo64ERTENuNof0R0+1+lDfsBBQ3xUXJX7fiK4ySkOMYJQaIf84E1C8vneFY50WPdkVj8pYu1lzzrU4ufBCA36VYck7c2K+ocRP6Y8RF7sizW/C6dDYraJHQz6DlS6PIobpCKrBLNLdkNJcqudZFoVxtJce0FV9rT6slQV391bRY2gHT4Rx8Ey5VkD03NSIcairOzTYZM4xCg31VtGjIWOImmNKITOynlcmzN3QUJ4AvqvkOTG4/46QIzMdy+Y1k0aWP5YI1mOeGsx9Yx7Hs4nb/KHBytzfXXQsD/GNqcJ+cSmhOM+2Sub3kcnkDWF3t1B3QR8UCtrviSHsfLRzoM9NRq/0PxXBjWcwOfNN5Xa//wCToZ0qXo7J3wAAAABJRU5ErkJggg==", + "text/latex": [ + "$\\displaystyle G e^{\\frac{- x^{2} - y^{2}}{2 R_{v}^{2}}}$" + ], + "text/plain": [ + " 2 2\n", + " - x - y \n", + " ─────────\n", + " 2 \n", + " 2⋅Rᵥ \n", + "G⋅ℯ " + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# streamfunction\n", + "psi = G * exp(-R**2 / (2*R_v**2))\n", + "psi" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "du = -G*y*std::exp(-1.0/2.0*(std::pow(x, 2) + std::pow(y, 2))/std::pow(R_v, 2))/std::pow(R_v, 2);\n" + ] + } + ], + "source": [ + "u = simplify(Derivative(psi, y))\n", + "print(cxxcode(u, assign_to='du'))" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dv = G*x*std::exp(-1.0/2.0*(std::pow(x, 2) + std::pow(y, 2))/std::pow(R_v, 2))/std::pow(R_v, 2);\n" + ] + } + ], + "source": [ + "v = simplify(-Derivative(psi, x))\n", + "print(cxxcode(v, assign_to='dv'))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dP = -0.5*std::pow(G, 2)*P_ref*gamma*std::exp((-std::pow(x, 2) - std::pow(y, 2))/std::pow(R_v, 2))/(std::pow(R_v, 2)*std::pow(c, 2));\n" + ] + } + ], + "source": [ + "P_ref = Symbol(\"P_ref\")\n", + "gamma = Symbol(\"gamma\")\n", + "c = Symbol(\"c\")\n", + "P = P_ref * -0.5 * gamma * (G/(c*R_v))**2 * exp(-R**2 / R_v**2)\n", + "print(cxxcode(P, assign_to='dP'))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tests/NSCBC_Vortex.in b/tests/NSCBC_Vortex.in new file mode 100644 index 000000000..2aca70532 --- /dev/null +++ b/tests/NSCBC_Vortex.in @@ -0,0 +1,46 @@ +# ***************************************************************** +# Problem size and geometry +# ***************************************************************** +geometry.prob_lo = -0.65 -0.65 -0.5 +geometry.prob_hi = 0.65 0.65 0.5 +geometry.is_periodic = 0 1 1 + +# ***************************************************************** +# VERBOSITY +# ***************************************************************** +amr.v = 1 # verbosity in Amr + +# ***************************************************************** +# Resolution and refinement +# ***************************************************************** +amr.n_cell = 128 128 32 +amr.max_level = 0 # number of levels = max_level + 1 +amr.blocking_factor = 32 +amr.max_grid_size = 128 + +# ***************************************************************** +# Quokka options +# ***************************************************************** +cfl = 0.3 +do_reflux = 1 +do_subcycle = 1 +max_timesteps = 2000 +stop_time = 1.0e-4 + +checkpoint_interval = -1 +plotfile_interval = 20 +ascent_interval = -1 + +hydro.rk_integrator_order = 2 +hydro.reconstruction_order = 3 +hydro.use_dual_energy = 1 +hydro.low_level_debugging_output = 0 + +vortex.strength = 1.1e3 # cm^2/s +vortex.Tgas0 = 300.0 # K +vortex.P0 = 1.01325e6 # 1 atm [erg/cc] + +vortex.u_inflow = 1.0e4 # cm/s +vortex.v_inflow = 0. # cm/s +vortex.w_inflow = 0. # cm/s +vortex.s_inflow = 1.0 # dimensionless From 1cdd641f10fbe4e585f1f0bc6457236514ae99ca Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Fri, 25 Aug 2023 18:33:09 -0400 Subject: [PATCH 52/64] add transverse terms --- src/NSCBC/dQ_dx.ipynb | 370 ++++++++---------------------------------- src/NSCBC_outflow.hpp | 28 +++- 2 files changed, 95 insertions(+), 303 deletions(-) diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index 262412b58..6c5ba9f10 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -19,7 +19,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -45,7 +45,7 @@ "⎣0 0 0 0 0 u⎦" ] }, - "execution_count": 13, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -69,7 +69,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -93,7 +93,7 @@ "⎣ 0 0 0 0 0 1⎦" ] }, - "execution_count": 14, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -234,34 +234,36 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### x1 Upper Outflow (simplified)" + "### x1 Upper Outflow (with relaxation term)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 17, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}0\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right) - \\left(1 - \\beta\\right) \\left(P dv_{dy} \\gamma + v \\left(- c du_{dy} \\rho + dP_{dy}\\right)\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\\\ds_{dx} u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 0 ⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2⎞ ⎥\n", - "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dv}{dx}⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dw}{dx}⋅u ⎥\n", - "⎢ ⎥\n", - "⎣(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u)⎦" + "⎡K⋅(P - Pₜ) - (1 - β)⋅(P⋅dv_dy⋅γ + v⋅(-c⋅du_dy⋅ρ + dP_dy))⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ (c + u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "⎢ ⎥\n", + "⎣ ds_dx⋅u ⎦" ] }, - "execution_count": 7, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -270,303 +272,72 @@ "K = Symbol('K')\n", "p = Symbol('P')\n", "p_t = Symbol('P_t')\n", - "L_outflow_x1_upper = Matrix([0, L[1], L[2], L[3], L[4]])\n", - "L_outflow_x1_upper" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "ename": "ShapeError", - "evalue": "Matrix size mismatch.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mShapeError\u001b[0m Traceback (most recent call last)", - "Cell \u001b[0;32mIn[8], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m dQ_dx_outflow_x1_upper \u001b[39m=\u001b[39m simplify(S \u001b[39m*\u001b[39;49m Inverse(lambda_waves) \u001b[39m*\u001b[39;49m L_outflow_x1_upper)\n\u001b[1;32m 2\u001b[0m dQ_dx_outflow_x1_upper\n", - "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/core/decorators.py:105\u001b[0m, in \u001b[0;36mcall_highest_priority..priority_decorator..binary_op_wrapper\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 103\u001b[0m f \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39m(other, method_name, \u001b[39mNone\u001b[39;00m)\n\u001b[1;32m 104\u001b[0m \u001b[39mif\u001b[39;00m f \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[0;32m--> 105\u001b[0m \u001b[39mreturn\u001b[39;00m f(\u001b[39mself\u001b[39;49m)\n\u001b[1;32m 106\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39mself\u001b[39m, other)\n", - "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/core/decorators.py:106\u001b[0m, in \u001b[0;36mcall_highest_priority..priority_decorator..binary_op_wrapper\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 104\u001b[0m \u001b[39mif\u001b[39;00m f \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 105\u001b[0m \u001b[39mreturn\u001b[39;00m f(\u001b[39mself\u001b[39m)\n\u001b[0;32m--> 106\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39mself\u001b[39;49m, other)\n", - "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/matrices/common.py:2958\u001b[0m, in \u001b[0;36mMatrixArithmetic.__rmul__\u001b[0;34m(self, other)\u001b[0m\n\u001b[1;32m 2956\u001b[0m \u001b[39m@call_highest_priority\u001b[39m(\u001b[39m'\u001b[39m\u001b[39m__mul__\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 2957\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__rmul__\u001b[39m(\u001b[39mself\u001b[39m, other):\n\u001b[0;32m-> 2958\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mrmultiply(other)\n", - "File \u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/sympy/matrices/common.py:2979\u001b[0m, in \u001b[0;36mMatrixArithmetic.rmultiply\u001b[0;34m(self, other, dotprodsimp)\u001b[0m\n\u001b[1;32m 2975\u001b[0m \u001b[39mif\u001b[39;00m (\u001b[39mhasattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mshape\u001b[39m\u001b[39m'\u001b[39m) \u001b[39mand\u001b[39;00m \u001b[39mlen\u001b[39m(other\u001b[39m.\u001b[39mshape) \u001b[39m==\u001b[39m \u001b[39m2\u001b[39m \u001b[39mand\u001b[39;00m\n\u001b[1;32m 2976\u001b[0m (\u001b[39mgetattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mis_Matrix\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mTrue\u001b[39;00m) \u001b[39mor\u001b[39;00m\n\u001b[1;32m 2977\u001b[0m \u001b[39mgetattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mis_MatrixLike\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mTrue\u001b[39;00m))):\n\u001b[1;32m 2978\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mshape[\u001b[39m0\u001b[39m] \u001b[39m!=\u001b[39m other\u001b[39m.\u001b[39mshape[\u001b[39m1\u001b[39m]:\n\u001b[0;32m-> 2979\u001b[0m \u001b[39mraise\u001b[39;00m ShapeError(\u001b[39m\"\u001b[39m\u001b[39mMatrix size mismatch.\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[1;32m 2981\u001b[0m \u001b[39m# honest SymPy matrices defer to their class's routine\u001b[39;00m\n\u001b[1;32m 2982\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mgetattr\u001b[39m(other, \u001b[39m'\u001b[39m\u001b[39mis_Matrix\u001b[39m\u001b[39m'\u001b[39m, \u001b[39mFalse\u001b[39;00m):\n", - "\u001b[0;31mShapeError\u001b[0m: Matrix size mismatch." - ] - } - ], - "source": [ - "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", - "dQ_dx_outflow_x1_upper" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dQ_dx[0] = drho_dx + (1.0/2.0)*du_dx*rho/c - 1.0/2.0*dP_dx/std::pow(c, 2);\n", - "dQ_dx[1] = (1.0/2.0)*du_dx + (1.0/2.0)*dP_dx/(c*rho);\n", - "dQ_dx[2] = dv_dx;\n", - "dQ_dx[3] = dw_dx;\n", - "dQ_dx[4] = (1.0/2.0)*c*du_dx*rho + (1.0/2.0)*dP_dx;\n" - ] - } - ], - "source": [ - "drho_dx = Symbol('drho_dx')\n", - "du_dx = Symbol('du_dx')\n", - "dv_dx = Symbol('dv_dx')\n", - "dw_dx = Symbol('dw_dx')\n", - "dp_dx = Symbol('dP_dx')\n", - "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", - "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", - "\n", - "L_outflow_x1_upper = Matrix([0, L[1], L[2], L[3], L[4]])\n", - "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", - "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### x1 Lower Inflow (simplified)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\0\\\\0\\\\0\\\\0\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎣ 0 ⎦" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "eta_2 = Symbol('eta_2')\n", - "eta_3 = Symbol('eta_3')\n", - "eta_4 = Symbol('eta_4')\n", - "eta_5 = Symbol('eta_5')\n", - "Lx = Symbol('L_x')\n", - "M = Symbol('M')\n", - "u_t = Symbol('u_t')\n", + "beta = Symbol('beta')\n", "v = Symbol('v')\n", - "v_t = Symbol('v_t')\n", - "w = Symbol('w')\n", - "w_t = Symbol('w_t')\n", - "\n", - "#L_inflow_x1_lower = Matrix([L[0],\n", - "# eta_2*(c/Lx)*(p-p_t),\n", - "# eta_3*(c/Lx)*(v-v_t),\n", - "# eta_4*(c/Lx)*(w-w_t),\n", - "# eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", + "dp_dy = Symbol('dP_dy')\n", + "du_dy = Symbol('du_dy')\n", + "gamma = Symbol('gamma')\n", + "dv_dy = Symbol('dv_dy')\n", "\n", - "L_inflow_x1_lower = Matrix([L[0], 0, 0, 0, 0])\n", - "L_inflow_x1_lower" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- c du_{dx} \\rho + dP_{dx}}{2 c^{2}}\\\\\\frac{du_{dx}}{2} - \\frac{dP_{dx}}{2 c \\rho}\\\\0\\\\0\\\\- \\frac{c du_{dx} \\rho}{2} + \\frac{dP_{dx}}{2}\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡-c⋅du_dx⋅ρ + dP_dx ⎤\n", - "⎢────────────────── ⎥\n", - "⎢ 2 ⎥\n", - "⎢ 2⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ du_dx dP_dx ⎥\n", - "⎢ ───── - ───── ⎥\n", - "⎢ 2 2⋅c⋅ρ ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅du_dx⋅ρ dP_dx⎥\n", - "⎢- ───────── + ─────⎥\n", - "⎣ 2 2 ⎦" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", - "dQ_dx_inflow_x1_lower" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dQ_dx[0] = (1.0/2.0)*(-c*du_dx*rho + dP_dx)/std::pow(c, 2);\n", - "dQ_dx[1] = (1.0/2.0)*du_dx - 1.0/2.0*dP_dx/(c*rho);\n", - "dQ_dx[2] = 0;\n", - "dQ_dx[3] = 0;\n", - "dQ_dx[4] = -1.0/2.0*c*du_dx*rho + (1.0/2.0)*dP_dx;\n" - ] - } - ], - "source": [ - "drho_dx = Symbol('drho_dx')\n", - "du_dx = Symbol('du_dx')\n", - "dv_dx = Symbol('dv_dx')\n", - "dw_dx = Symbol('dw_dx')\n", - "dp_dx = Symbol('dP_dx')\n", - "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx])\n", - "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", - "\n", - "#L_inflow_x1_lower = Matrix([L[0],\n", - "# eta_2*(c/Lx)*(p-p_t),\n", - "# eta_3*(c/Lx)*(v-v_t),\n", - "# eta_4*(c/Lx)*(w-w_t),\n", - "# eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t)])\n", - "\n", - "L_inflow_x1_lower = Matrix([L[0], 0, 0, 0, 0])\n", - "\n", - "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", - "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### x1 Upper Outflow (with relaxation term)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\\\\\frac{ds}{dx} u\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡ K⋅(P - Pₜ) ⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2⎞ ⎥\n", - "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dv}{dx}⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dw}{dx}⋅u ⎥\n", - "⎢ ⎥\n", - "⎢(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u)⎥\n", - "⎢ ⎥\n", - "⎣ \\frac{ds}{dx}⋅u ⎦" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "K = Symbol('K')\n", - "p = Symbol('P')\n", - "p_t = Symbol('P_t')\n", - "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4], L[5]])\n", + "T_phi = v * (dp_dy - rho * c * du_dy) + gamma * p * dv_dy\n", + "L_outflow_x1_upper = Matrix([K*(p - p_t) - (1 - beta)*T_phi, L[1], L[2], L[3], L[4], L[5]])\n", "L_outflow_x1_upper" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) + \\left(c - u\\right) \\left(- \\frac{dP}{dx} + 2 \\frac{d\\rho}{dx} c^{2} + \\frac{du}{dx} c \\rho\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 c \\rho \\left(c - u\\right)}\\\\\\frac{dv}{dx}\\\\\\frac{dw}{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) + \\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)}{2 \\left(c - u\\right)}\\\\\\frac{ds}{dx}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) - \\left(\\beta - 1\\right) \\left(P dv_{dy} \\gamma - v \\left(c du_{dy} \\rho - dP_{dy}\\right)\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\beta - 1\\right) \\left(P dv_{dy} \\gamma - v \\left(c du_{dy} \\rho - dP_{dy}\\right)\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) - \\left(\\beta - 1\\right) \\left(P dv_{dy} \\gamma - v \\left(c du_{dy} \\rho - dP_{dy}\\right)\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 \\left(c - u\\right)}\\\\ds_{dx}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 \n", - "⎢-K⋅(P - Pₜ) + (c - u)⋅⎝-\\frac{dP}{dx} + 2⋅\\frac{d\\rho}{dx}⋅c + \\frac{du}{dx}\n", + "⎡ ⎛ 2 \n", + "⎢-K⋅(P - Pₜ) - (β - 1)⋅(P⋅dv_dy⋅γ - v⋅(c⋅du_dy⋅ρ - dP_dy)) + (c - u)⋅⎝2⋅c ⋅drh\n", "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅c ⋅(c - u) \n", + "⎢ 2 \n", + "⎢ 2⋅c ⋅(c - u) \n", "⎢ \n", - "⎢ K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", - "⎢ ──────────────────────────────────────────────────────── \n", - "⎢ 2⋅c⋅ρ⋅(c - u) \n", + "⎢ K⋅(P - Pₜ) + (β - 1)⋅(P⋅dv_dy⋅γ - v⋅(c⋅du_dy⋅ρ - dP_dy)) + (c - u)⋅(c\n", + "⎢ ─────────────────────────────────────────────────────────────────────\n", + "⎢ 2⋅c⋅ρ⋅(c - u) \n", "⎢ \n", - "⎢ \\frac{dv}{dx} \n", + "⎢ dv_dx \n", "⎢ \n", - "⎢ \\frac{dw}{dx} \n", + "⎢ dw_dx \n", "⎢ \n", - "⎢ -K⋅(P - Pₜ) + (\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u) \n", - "⎢ ───────────────────────────────────────────────────────── \n", - "⎢ 2⋅(c - u) \n", + "⎢ -K⋅(P - Pₜ) - (β - 1)⋅(P⋅dv_dy⋅γ - v⋅(c⋅du_dy⋅ρ - dP_dy)) + (c - u)⋅(c\n", + "⎢ ──────────────────────────────────────────────────────────────────────\n", + "⎢ 2⋅(c - u) \n", "⎢ \n", - "⎣ \\frac{ds}{dx} \n", + "⎣ ds_dx \n", "\n", - " ⎞⎤\n", - "⋅c⋅ρ⎠⎥\n", - "─────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎦" + " ⎞⎤\n", + "o_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", + "─────────────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + "⋅du_dx⋅ρ + dP_dx) ⎥\n", + "───────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + "⋅du_dx⋅ρ + dP_dx) ⎥\n", + "───────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, - "execution_count": 21, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -578,18 +349,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(2*std::pow(c, 2)*drho_dx + c*du_dx*rho - dP_dx))/(std::pow(c, 2)*(c - u));\n", - "dQ_dx[1] = (1.0/2.0)*(K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u));\n", + "dQ_dx[0] = (1.0/2.0)*(-K*(P - P_t) - (beta - 1)*(P*dv_dy*gamma - v*(c*du_dy*rho - dP_dy)) + (c - u)*(2*std::pow(c, 2)*drho_dx + c*du_dx*rho - dP_dx))/(std::pow(c, 2)*(c - u));\n", + "dQ_dx[1] = (1.0/2.0)*(K*(P - P_t) + (beta - 1)*(P*dv_dy*gamma - v*(c*du_dy*rho - dP_dy)) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u));\n", "dQ_dx[2] = dv_dx;\n", "dQ_dx[3] = dw_dx;\n", - "dQ_dx[4] = (1.0/2.0)*(-K*(P - P_t) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n", + "dQ_dx[4] = (1.0/2.0)*(-K*(P - P_t) - (beta - 1)*(P*dv_dy*gamma - v*(c*du_dy*rho - dP_dy)) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n", "dQ_dx[5] = ds_dx;\n" ] } @@ -604,7 +375,8 @@ "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", - "L_outflow_x1_upper = Matrix([K*(p - p_t), L[1], L[2], L[3], L[4], L[5]])\n", + "T_phi = v * (dp_dy - rho * c * du_dy) + gamma * p * dv_dy\n", + "L_outflow_x1_upper = Matrix([K*(p - p_t) - (1 - beta)*T_phi, L[1], L[2], L[3], L[4], L[5]])\n", "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" ] @@ -985,7 +757,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.5" }, "orig_nbformat": 4 }, diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp index 13467a2e1..b1a923534 100644 --- a/src/NSCBC_outflow.hpp +++ b/src/NSCBC_outflow.hpp @@ -23,6 +23,7 @@ namespace detail template AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray::nvar_> const &Q, quokka::valarray::nvar_> const &dQ_dx_data, + quokka::valarray::nvar_> const &dQ_dy_data, const amrex::Real P_t, const amrex::Real L_x) -> quokka::valarray::nvar_> { @@ -41,18 +42,31 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const amrex::Real dP_dx = dQ_dx_data[4]; const amrex::Real dEint_aux_dx = dQ_dx_data[5]; + const amrex::Real du_dy = dQ_dy_data[1]; + const amrex::Real dv_dy = dQ_dy_data[2]; + const amrex::Real dP_dy = dQ_dy_data[4]; + const amrex::Real c = quokka::EOS::ComputeSoundSpeed(rho, P); + const amrex::Real gamma = quokka::EOS_Traits::gamma; const amrex::Real M = std::sqrt(u * u + v * v + w * w) / c; const amrex::Real K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posed Euler equations + const amrex::Real beta = M; // TODO(bwibking): average over boundary + // see SymPy notebook for derivation quokka::valarray::nvar_> dQ_dx{}; - dQ_dx[0] = 0.5 * (-K * (P - P_t) + (c - u) * (2.0 * c * c * drho_dx + c * du_dx * rho - dP_dx)) / (c * c * (c - u)); - dQ_dx[1] = 0.5 * (K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c * rho * (c - u)); + dQ_dx[0] = (1.0 / 2.0) * + (-K * (P - P_t) - (beta - 1) * (P * dv_dy * gamma - v * (c * du_dy * rho - dP_dy)) + + (c - u) * (2 * std::pow(c, 2) * drho_dx + c * du_dx * rho - dP_dx)) / + (std::pow(c, 2) * (c - u)); + dQ_dx[1] = (1.0 / 2.0) * (K * (P - P_t) + (beta - 1) * (P * dv_dy * gamma - v * (c * du_dy * rho - dP_dy)) + (c - u) * (c * du_dx * rho + dP_dx)) / + (c * rho * (c - u)); dQ_dx[2] = dv_dx; dQ_dx[3] = dw_dx; - dQ_dx[4] = 0.5 * (-K * (P - P_t) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); + dQ_dx[4] = + (1.0 / 2.0) * (-K * (P - P_t) - (beta - 1) * (P * dv_dy * gamma - v * (c * du_dy * rho - dP_dy)) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); dQ_dx[5] = dEint_aux_dx; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { dQ_dx[6 + i] = dQ_dx_data[6 + i]; } @@ -71,6 +85,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowX1Upper(const amrex::IntVect const auto &domain_hi = box.hiVect3d(); const int ihi = domain_hi[0]; const Real dx = geom.CellSize(0); + const Real dy = geom.CellSize(1); const Real Lx = geom.prob_domain.length(0); constexpr int N = HydroSystem::nvar_; @@ -80,8 +95,13 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowX1Upper(const amrex::IntVect quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); + // compute two-sided dQ/dy from the data + quokka::valarray const Q_jp1 = HydroSystem::ComputePrimVars(consVar, ihi, j + 1, k); + quokka::valarray const Q_jm1 = HydroSystem::ComputePrimVars(consVar, ihi, j - 1, k); + quokka::valarray const dQ_dy_data = (Q_jp1 - Q_jm1) / (2.0 * dy); + // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = detail::dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, P_outflow, Lx); + quokka::valarray const dQ_dx = detail::dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, dQ_dy_data, P_outflow, Lx); // compute centered ghost values quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; From f95ae4662cfbfbf87e41edc7da7d94a9d65969b9 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 28 Aug 2023 13:25:17 -0400 Subject: [PATCH 53/64] add all transverse terms, eliminate explicit gamma --- src/NSCBC/dQ_dx.ipynb | 675 +++++++++++++++++++++++++++++++++--------- src/NSCBC_outflow.hpp | 66 +++-- 2 files changed, 587 insertions(+), 154 deletions(-) diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx.ipynb index 6c5ba9f10..c8d6646e9 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx.ipynb @@ -14,13 +14,152 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Primitive variable eigensystem" + "## Conserved variable system" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKoAAAA2CAYAAABX0gK6AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAJgElEQVR4Ae2c23UUORCGxxwHACaCNRlwiQDIgEsEmAyW4yd440AGhgi4ZAAbASwZQAawzsD7f7KqUavVPS11tz3DqM7RSK1LqVT6VSppembv7OxsVeniNPDixYub6u2ewqnCVYUfyvuouNKABvYqUAe0M3ORAAkw3yp+aKyVfqX0lwpW00g63k9nb2+uB8OxH8Ghj58oHwuWTTPzuy0BTCaT5USJfxWqVTWNpGIs6p8Unj9/fhKOh2eF72FeTnpufqm+1ceZwtVU2dx56udwbp5z8RuS7UoKvFuedyQriA9oxNZ6qDx8wxKalZ/k+NsH+JI2C3tQIlxOG/pT/VI95HRVWpd5QsYOdbZ+X/G+atpkf1batk18LBT6VeGZ6lq+HjeGnkoS5JuLZuEnXaG7fxTQGzp1pPQnEop/nOcs8yn+D8T5uuLXy/TQ5qp+AFwWjtTms8JNBRbxm5Bj72FKFbkO+Kb4VtiAtPJQLv7WX0pvIlgR05Hkw6I+UHzDZ02KSvmpHb7ogeLmIIUgejagMqmLkPpwi0RxZy4X6TBgqj6zcaQ2+Ox3FTfYSm79qmDbw7ugzzCJ0hn8UZi5aWk/DizJLBM0kR+6SumTBY8+lyQW69J9dOSfgCNkReaGkkBVabjtN5WDhPlV14O8jUpKScjIYG8p3azMUiGn8FNbFjX07Tw6/1Q+i+gi7lEfqa/WVhrKsWC6CEdeVmQ2va06PqoX2m1DqthSbDAg26ZSFiKodjlJyQ1I8QVtHG5h6bnID5zKT+1PFdAlcjgZPM9jPd9VWIzUj1sMi3UwzNj0X4Ij9PRIwS2wPqCyEhqHP5RFA8ctoBwg9AkQNlkkrb6xlj89cyzmV+RRAAxsHchnLgwHomcKSVI9xoPvCB8DeQioLH7JTs4B+SqQid2o5Yf1tOvNFi8sDmA3PeCHM27GYQRYknNpFSwe0oPVyYyn4AiZkT0N1ECRzsk3wZTPBDLhrNCHer6UC2ovB7IxIU4GxQAJoDEwHHEmkLgh1UH2DikfwF+1csUol7bXfOUsfr5NJxJfwJOUoVN5RIaX041baWcwFLMwAW64KEf5wGq7Tg8jpPpdxctCRimOvqstc+Fo3xJBbIV3vPBWRMNPyguVYGUXGTPwj5IjXChsES8RQvkGMB4HSXVZdPGNAFdbAPeeAtclo/kNdjZjoWTCaKCHp0qHuxpz1wKGnlm0vxR6STzW6qG3cX/BVBwhM+N0lAKq+RWtaxRrMDbW4FEQ94bEYwlLHSq+1U5lWBCEd6C0QuWXgumteMQLz5STI7cTRXIs9oaPeO/ZeBWjB4gFZRfkuBIYknibP1D+KZUHaFY9+H6m4gjXq5mDFFBZCb1gGRhsq0gKQzmzXAsFjLGcWLl1ig+apJPiwThRxPuoBvlQtg7EMwTTOZdlPpGRXWXy5f0SevBDnoqj1gLbD/Uooe3wEa/KsNqlpCUboCLEW1upPOwYHL5i0D9WPldG7jBVytzrksmCP3LPfQ31ZaRsbKH030ez68GPnf6m4AiZkd1RC6jKQbHQXGA45zbDJ4BSgBMT3yGVOZ+yU9CfwVhbivQKZrFO2gnEByUfK27cJ6U58a8UQt+aZ+TA/SDmhMv4aI9FgTg0xouGZ7b6DqkuPnfYB3XNnenUV8ZoPYgvrkZS/xFjeEJTcMT4m3HvO3a/P7AmKwnTmsDfxZeeYiKZfHdlYdJIXk6s7+x5Xaz6AIHJMzAwZvI+KMQHFGVlEyftGBz4ldwghCCiX1wZ6vJCRutWQM+Mi8mOv/4lP66L/OQTQsKFuRNmWFr8R+vB1/1PcfJrdePp4zlwhLFo3C/3Xb86t0OKrQSAimM+2QeKBjD5UTLZRHALAaHsN8o/dU8jPlSXUy6gBACkIdInKmuU43Jn/BBvDlvXYln1jCy/FMfg46CEJe74vsqjDKva6EF5nflSHjvEB8Ux2FfKy9KD6ltfyW/7VD4bjnxfGA1nNJ1F1UNLQRrYxpJkZZucSpxIsQxsLZ3Jncqc9uJtp3EWEIvJLClWPF5UGIgnCjExL9auVSb+o+RWPca5UuCtpHgRZulB7W8o2MJuycODymbBkfi43Uhxs7M7oHZ6/PMzAEYSAFOHLuUCSq7l8C0bRSvt/DXFjd9FX3pmUmgT1iWPnQO3YI7Jhxd8Yl4leuB+fRHdST4jjJHtnC7vipXsSiwlAwqAMPbUnKsaFMwJvwFewCCVB1iwsEdq416qVprtmp/PxMBSdj6JDz49PjDjdqR0th58m5/GY4nYy4isrXPILlrU217BKdDMoXte52tO+wFD+k1t72y/WM5RW3nALzeJTPjC9AeV6IHFtLSc+LmdBbpzFlVK+KpwXwrHis1K4omVglq+oPLx6/ruUbGoU65x6G8t+fFyODHfOVsParsoSL1syNhyjxhc7xv+a0deKyQ1ICVzBdX4p3pmu8WSdd6U8mWcpDmkdCZH+ZW8BipQZ4aCAIdVxU+1qxyukF4qv2XB9YxlYxvGomKpOnWUV8lroAK1QmErNLCLPupWTEwVsq2BCtS2PurThmpgT/9Osdg7lBs65irWFmqg+qhbOGm7KHLd+ndx1rdwzBWoWzhpuyjyLn6FemHz7O9Uj32Hhz4u/gvMCxN8AzuqQF12UniXtPneWmm+x+abq867ocuKsf3c69a/7BzyEgffPBnxjRVvBvF2VKUMDVSgZiiroCrWlJc/Kk3UQL2emqjAnOaypFjU+A8vcljsbN1qUS9o6v12z+t+/GitUqYGKlAzFVZSXSA9VDusafJHcSU8d61NPfVPnHGBkMMSb8/zGh+AbP0O34OUPPdmvX9eKa7vn0pZY6kCdaymEvUENqwkf8rgrqAUA1qun9x/YekZ4HIlBVDtpE/dOX5JKza7Q3XrL5xrAQ9/k4NRc0+qZ074ABfAQoDWwEuacKTy1kvUyqu0RgPVoq5R0EDxW5XFlhELCvGW/0qALP2XQZpXCjRQLWqgjLFJbzEB4/uojVnS1o/7ojr1sUADFagFSlMTDk/8A0m8hT9W/uR/AiwT6c9uVbf+svnFcrb+F0Cg5bBEqPekZTodbFUt6qB6uoUCJFs+vuiBlfo8fhLNb9Lrtm+KmTGuFjVfmeaHcuVkf+bA21CDf+ue301tEWqgAjXUxrg0F/eL/hPgODF2q1bd+vPnu+Of5rOoLXI1UIGaobHAP13qnwAzpNmtqhWoefNd8g94eT3U2kkNVKAm1dKbmf0PeL2cakGWBv4HZ/VraflQxkgAAAAASUVORK5CYII=", + "text/latex": [ + "$\\displaystyle \\frac{P - c^{2} \\rho^{2} \\frac{\\partial}{\\partial P} e{\\left(\\rho,P \\right)}}{\\rho^{2}}$" + ], + "text/plain": [ + " 2 2 ∂ \n", + "P - c ⋅ρ ⋅──(e(ρ, P))\n", + " ∂P \n", + "─────────────────────\n", + " 2 \n", + " ρ " + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# define symbols\n", + "rho = Symbol('rho', positive=True) # density\n", + "p = Symbol('P', positive=True) # pressure\n", + "u = Symbol('u') # normal velocity\n", + "v = Symbol('v') # transverse velocity\n", + "w = Symbol('w') # transverse velocity\n", + "s = Symbol('s') # passive scalar\n", + "c = Symbol('c') # sound speed\n", + "e = Function('e')(rho, p) # specific internal energy\n", + "\n", + "E = rho*e + rho*(u**2 + v**2 + w**2)/2 # total energy density\n", + "\n", + "# (this is needed to rewrite the thermodynamic derivatives in terms of the sound speed)\n", + "de_drho = solveset(Eq(c**2, (p - rho**2 * Derivative(e, rho)) / (rho**2 * Derivative(e,p))), Derivative(e, rho)).args[0]\n", + "de_drho" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}1 & 0 & 0 & 0 & 0 & 0\\\\u & \\rho & 0 & 0 & 0 & 0\\\\v & 0 & \\rho & 0 & 0 & 0\\\\w & 0 & 0 & \\rho & 0 & 0\\\\\\rho \\frac{\\partial}{\\partial \\rho} e{\\left(\\rho,P \\right)} + \\frac{u^{2}}{2} + \\frac{v^{2}}{2} + \\frac{w^{2}}{2} + e{\\left(\\rho,P \\right)} & \\rho u & \\rho v & \\rho w & \\rho \\frac{\\partial}{\\partial P} e{\\left(\\rho,P \\right)} & 0\\\\s & 0 & 0 & 0 & 0 & \\rho\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 1 0 0 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢ u ρ 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ v 0 ρ 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ w 0 0 ρ 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 2 2 2 ⎥\n", + "⎢ ∂ u v w ∂ ⎥\n", + "⎢ρ⋅──(e(ρ, P)) + ── + ── + ── + e(ρ, P) ρ⋅u ρ⋅v ρ⋅w ρ⋅──(e(ρ, P)) 0⎥\n", + "⎢ ∂ρ 2 2 2 ∂P ⎥\n", + "⎢ ⎥\n", + "⎣ s 0 0 0 0 ρ⎦" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the P matrix from Sutherland and Kennedy (2003)\n", + "U = Matrix([rho, rho*u, rho*v, rho*w, E, rho*s])\n", + "q = Matrix([rho, u, v, w, p, s])\n", + "P = simplify(Matrix(BlockMatrix(Derivative(U, q, evaluate=True).T)).T)\n", + "P" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# compute the Q_n matrix from Sutherland and Kennedy (2003)\n", + "F_n = Matrix([rho*u, # flux vector in normal direction\n", + " rho*u**2 + p,\n", + " rho*v*u,\n", + " rho*w*u,\n", + " (E + p)*u,\n", + " rho*s*u])\n", + "Q_n = simplify(Matrix(BlockMatrix(Derivative(F_n, q, evaluate=True).T)).T)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# compute the Q_t1 matrix from Sutherland and Kennedy (2003)\n", + "F_t1 = Matrix([rho*v,\n", + " rho*u*v,\n", + " rho*v**2 + p,\n", + " rho*w*v,\n", + " (E + p)*v,\n", + " rho*s*v])\n", + "Q_t1 = simplify(Matrix(BlockMatrix(Derivative(F_t1, q, evaluate=True).T)).T)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "# compute the Q_t2 matrix from Sutherland and Kennedy (2003)\n", + "F_t2 = Matrix([rho*w,\n", + " rho*u*w,\n", + " rho*v*w,\n", + " rho*w**2 + p,\n", + " (E + p)*w,\n", + " rho*s*w])\n", + "Q_t2 = simplify(Matrix(BlockMatrix(Derivative(F_t2, q, evaluate=True).T)).T)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primitive variable system" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, "outputs": [ { "data": { @@ -45,31 +184,145 @@ "⎣0 0 0 0 0 u⎦" ] }, - "execution_count": 2, + "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "rho = Symbol('rho', positive=True) # density\n", - "c = Symbol('c', positive=True) # sound speed\n", - "u = Symbol('u') # normal velocity\n", - "\n", - "# Jacobian for primitive variable Euler equations\n", - "# \\partial_t Q + F \\partial_x Q = 0\n", - "# Q = [rho, u, v, w, P, s], where s is a passive scalar\n", - "F = Matrix([[u, rho, 0, 0, 0, 0],\n", - " [0, u, 0, 0, 1/rho, 0],\n", - " [0, 0, u, 0, 0, 0],\n", - " [0, 0, 0, u, 0, 0],\n", - " [0, rho*c**2, 0, 0, u, 0],\n", - " [0, 0, 0, 0, 0, u]])\n", + "# compute the A_n matrix from Sutherland and Kennedy (2003)\n", + "# (this is the primitive variable flux matrix in the normal direction)\n", + "A_n = simplify(Inverse(P) * Q_n).subs(Derivative(e,rho), de_drho)\n", + "A_n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}v & 0 & \\rho & 0 & 0 & 0\\\\0 & v & 0 & 0 & 0 & 0\\\\0 & 0 & v & 0 & \\frac{1}{\\rho} & 0\\\\0 & 0 & 0 & v & 0 & 0\\\\0 & 0 & c^{2} \\rho & 0 & v & 0\\\\0 & 0 & 0 & 0 & 0 & v\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡v 0 ρ 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢0 v 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1 ⎥\n", + "⎢0 0 v 0 ─ 0⎥\n", + "⎢ ρ ⎥\n", + "⎢ ⎥\n", + "⎢0 0 0 v 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢0 0 c ⋅ρ 0 v 0⎥\n", + "⎢ ⎥\n", + "⎣0 0 0 0 0 v⎦" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the A_t1 matrix\n", + "A_t1 = simplify(Inverse(P) * Q_t1).subs(Derivative(e,rho), de_drho)\n", + "A_t1" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}w & 0 & 0 & \\rho & 0 & 0\\\\0 & w & 0 & 0 & 0 & 0\\\\0 & 0 & w & 0 & 0 & 0\\\\0 & 0 & 0 & w & \\frac{1}{\\rho} & 0\\\\0 & 0 & 0 & c^{2} \\rho & w & 0\\\\0 & 0 & 0 & 0 & 0 & w\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡w 0 0 ρ 0 0⎤\n", + "⎢ ⎥\n", + "⎢0 w 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢0 0 w 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1 ⎥\n", + "⎢0 0 0 w ─ 0⎥\n", + "⎢ ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢0 0 0 c ⋅ρ w 0⎥\n", + "⎢ ⎥\n", + "⎣0 0 0 0 0 w⎦" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the A_t2 matrix\n", + "A_t2 = simplify(Inverse(P) * Q_t2).subs(Derivative(e,rho), de_drho)\n", + "A_t2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primitive variable eigensystem" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}u & \\rho & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & \\frac{1}{\\rho} & 0\\\\0 & 0 & u & 0 & 0 & 0\\\\0 & 0 & 0 & u & 0 & 0\\\\0 & c^{2} \\rho & 0 & 0 & u & 0\\\\0 & 0 & 0 & 0 & 0 & u\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡u ρ 0 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢ 1 ⎥\n", + "⎢0 u 0 0 ─ 0⎥\n", + "⎢ ρ ⎥\n", + "⎢ ⎥\n", + "⎢0 0 u 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢0 0 0 u 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢0 c ⋅ρ 0 0 u 0⎥\n", + "⎢ ⎥\n", + "⎣0 0 0 0 0 u⎦" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# \\partial_t q + F \\partial_x q + G \\partial_y q + H \\partial_z q = 0\n", + "F = A_n\n", "F" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -93,7 +346,7 @@ "⎣ 0 0 0 0 0 1⎦" ] }, - "execution_count": 3, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -110,7 +363,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -133,7 +386,7 @@ "⎣ 0 0 0 0 0 u⎦" ] }, - "execution_count": 4, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -146,7 +399,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -174,62 +427,184 @@ "⎣ 0 0 0 0 0 1⎦" ] }, - "execution_count": 5, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# compute S^{-1}\n", + "# compute S\n", "S = Sinv.inv()\n", "S" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(- \\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c - u\\right)\\\\u \\left(\\frac{dP}{dx} - \\frac{d\\rho}{dx} c^{2}\\right)\\\\\\frac{dv}{dx} u\\\\\\frac{dw}{dx} u\\\\\\left(\\frac{dP}{dx} + \\frac{du}{dx} c \\rho\\right) \\left(c + u\\right)\\\\\\frac{ds}{dx} u\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\\\ds_{dx} u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡(-\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c - u)⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2⎞ ⎥\n", - "⎢ u⋅⎝\\frac{dP}{dx} - \\frac{d\\rho}{dx}⋅c ⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dv}{dx}⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ \\frac{dw}{dx}⋅u ⎥\n", - "⎢ ⎥\n", - "⎢(\\frac{dP}{dx} + \\frac{du}{dx}⋅c⋅ρ)⋅(c + u) ⎥\n", - "⎢ ⎥\n", - "⎣ \\frac{ds}{dx}⋅u ⎦" + "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎥\n", + "⎢ ⎥\n", + "⎣ ds_dx⋅u ⎦" ] }, - "execution_count": 6, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# compute the \\mathcal{L} matrix\n", - "drho_dx = Symbol(r'\\frac{d\\rho}{dx}')\n", - "du_dx = Symbol(r'\\frac{du}{dx}')\n", - "dv_dx = Symbol(r'\\frac{dv}{dx}')\n", - "dw_dx = Symbol(r'\\frac{dw}{dx}')\n", - "dp_dx = Symbol(r'\\frac{dP}{dx}')\n", - "ds_dx = Symbol(r'\\frac{ds}{dx}') # passive scalar\n", + "\n", + "#drho_dx = Symbol(r'\\frac{d\\rho}{dx}')\n", + "#du_dx = Symbol(r'\\frac{du}{dx}')\n", + "#dv_dx = Symbol(r'\\frac{dv}{dx}')\n", + "#dw_dx = Symbol(r'\\frac{dw}{dx}')\n", + "#dp_dx = Symbol(r'\\frac{dP}{dx}')\n", + "#ds_dx = Symbol(r'\\frac{ds}{dx}')\n", + "\n", + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "ds_dx = Symbol('ds_dx')\n", "\n", "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "L" ] }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}c^{2} dv_{dy} \\rho - c du_{dy} \\rho v + dP_{dy} v\\\\v \\left(- c^{2} drho_{dy} + dP_{dy}\\right)\\\\\\frac{dP_{dy}}{\\rho} + dv_{dy} v\\\\dw_{dy} v\\\\c^{2} dv_{dy} \\rho + c du_{dy} \\rho v + dP_{dy} v\\\\ds_{dy} v\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 2 ⎤\n", + "⎢c ⋅dv_dy⋅ρ - c⋅du_dy⋅ρ⋅v + dP_dy⋅v⎥\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ v⋅⎝- c ⋅drho_dy + dP_dy⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dP_dy ⎥\n", + "⎢ ───── + dv_dy⋅v ⎥\n", + "⎢ ρ ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dy⋅v ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢c ⋅dv_dy⋅ρ + c⋅du_dy⋅ρ⋅v + dP_dy⋅v⎥\n", + "⎢ ⎥\n", + "⎣ ds_dy⋅v ⎦" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the y-transverse terms\n", + "\n", + "#drho_dy = Symbol(r'\\frac{d\\rho}{dy}')\n", + "#du_dy = Symbol(r'\\frac{du}{dy}')\n", + "#dv_dy = Symbol(r'\\frac{dv}{dy}')\n", + "#dw_dy = Symbol(r'\\frac{dw}{dy}')\n", + "#dp_dy = Symbol(r'\\frac{dP}{dy}')\n", + "#ds_dy = Symbol(r'\\frac{ds}{dy}')\n", + "\n", + "drho_dy = Symbol('drho_dy')\n", + "du_dy = Symbol('du_dy')\n", + "dv_dy = Symbol('dv_dy')\n", + "dw_dy = Symbol('dw_dy')\n", + "dp_dy = Symbol('dP_dy')\n", + "ds_dy = Symbol('ds_dy')\n", + "\n", + "dq_dy_def = Matrix([drho_dy, du_dy, dv_dy, dw_dy, dp_dy, ds_dy])\n", + "T_1 = simplify(Sinv * A_t1 * dq_dy_def)\n", + "T_1" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}c^{2} dw_{dz} \\rho - c du_{dz} \\rho w + dP_{dz} w\\\\w \\left(- c^{2} drho_{dz} + dP_{dz}\\right)\\\\dv_{dz} w\\\\\\frac{dP_{dz}}{\\rho} + dw_{dz} w\\\\c^{2} dw_{dz} \\rho + c du_{dz} \\rho w + dP_{dz} w\\\\ds_{dz} w\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 2 ⎤\n", + "⎢c ⋅dw_dz⋅ρ - c⋅du_dz⋅ρ⋅w + dP_dz⋅w⎥\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ w⋅⎝- c ⋅drho_dz + dP_dz⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dz⋅w ⎥\n", + "⎢ ⎥\n", + "⎢ dP_dz ⎥\n", + "⎢ ───── + dw_dz⋅w ⎥\n", + "⎢ ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢c ⋅dw_dz⋅ρ + c⋅du_dz⋅ρ⋅w + dP_dz⋅w⎥\n", + "⎢ ⎥\n", + "⎣ ds_dz⋅w ⎦" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the z-transverse terms\n", + "\n", + "#drho_dz = Symbol(r'\\frac{d\\rho}{dz}')\n", + "#du_dz = Symbol(r'\\frac{du}{dz}')\n", + "#dv_dz = Symbol(r'\\frac{dv}{dz}')\n", + "#dw_dz = Symbol(r'\\frac{dw}{dz}')\n", + "#dp_dz = Symbol(r'\\frac{dP}{dz}')\n", + "#ds_dz = Symbol(r'\\frac{ds}{dz}')\n", + "\n", + "drho_dz = Symbol('drho_dz')\n", + "du_dz = Symbol('du_dz')\n", + "dv_dz = Symbol('dv_dz')\n", + "dw_dz = Symbol('dw_dz')\n", + "dp_dz = Symbol('dP_dz')\n", + "ds_dz = Symbol('ds_dz')\n", + "\n", + "dq_dz_def = Matrix([drho_dz, du_dz, dv_dz, dw_dz, dp_dz, ds_dz])\n", + "T_2 = simplify(Sinv * A_t2 * dq_dz_def)\n", + "T_2" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -244,23 +619,38 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right) - \\left(1 - \\beta\\right) \\left(P dv_{dy} \\gamma + v \\left(- c du_{dy} \\rho + dP_{dy}\\right)\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\\\ds_{dx} u\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}K \\left(P - P_{t}\\right) - \\left(1 - \\beta\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho - c du_{dy} \\rho v - c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\\\ds_{dx} u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡K⋅(P - Pₜ) - (1 - β)⋅(P⋅dv_dy⋅γ + v⋅(-c⋅du_dy⋅ρ + dP_dy))⎤\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ ⎥\n", - "⎢ ⎥\n", - "⎢ dv_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ dw_dx⋅u ⎥\n", - "⎢ ⎥\n", - "⎢ (c + u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", - "⎢ ⎥\n", - "⎣ ds_dx⋅u ⎦" + "⎡ ⎛ 2 2 \n", + "⎢K⋅(P - Pₜ) - (1 - β)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ - c⋅du_dy⋅ρ⋅v - c⋅du_dz⋅ρ⋅w + d\n", + "⎢ \n", + "⎢ ⎛ 2 ⎞ \n", + "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ \n", + "⎢ \n", + "⎢ dv_dx⋅u \n", + "⎢ \n", + "⎢ dw_dx⋅u \n", + "⎢ \n", + "⎢ (c + u)⋅(c⋅du_dx⋅ρ + dP_dx) \n", + "⎢ \n", + "⎣ ds_dx⋅u \n", + "\n", + " ⎞⎤\n", + "P_dy⋅v + dP_dz⋅w⎠⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, "execution_count": 17, @@ -279,7 +669,7 @@ "gamma = Symbol('gamma')\n", "dv_dy = Symbol('dv_dy')\n", "\n", - "T_phi = v * (dp_dy - rho * c * du_dy) + gamma * p * dv_dy\n", + "T_phi = simplify(T_1[0] + T_2[0])\n", "L_outflow_x1_upper = Matrix([K*(p - p_t) - (1 - beta)*T_phi, L[1], L[2], L[3], L[4], L[5]])\n", "L_outflow_x1_upper" ] @@ -291,50 +681,54 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0YAAAC8CAYAAABcxb76AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2dXdLdNLaGN6lcd6VDVd8fmAE/I+gwAyAjSHoGULni3KVgBsAIAsyA7hEQmAGc+64i/VVPgPM++iQje0u27O3961dV3rL1u9Yj2fKyZO+3/vjjj52dCZyawP/+7/++o+23U9fr+kzABEzABK6fgMeQ/TY0k30mDtkOgbX6/0MV9J6w/VxB94PiP6nEOdgEFhFQn/pMGTGKJg0jpX2idI+0vaPtXW3fK+yf8jfvzGbzXcAATGDLBHi49rG2r7YMIekuDs3jasoz5nt8GaPjuAsl0HRNUN/+VfJzT7nnFPfWgyyUi8s/BtvXWbx3TeBgAup0H6uQt+X/0FgYhhAGOv3zc20/NubbQjKz2UIrW0cTMIE9AhoTwgMy+c/3IjcWIAZzx9UWQh5fWig5zcUQmHFN+FJCD+2d7p70YabR1yp08gl+lv6ku/HE/+WSZawBkcyfaVv9qdYlMWnRUWmY+Xkh//0aq0J4nhYL/66QZqtBZrPVlrfeJmACO40lX2n7Wdt32lYfG1QmBsdZ7zskw+j9g+KXjKstvcfjSwslp7koAjofJq8JSvPNUGiFEcT5vssNI46P5lQpS6Kw0KgYoX5UWGehaZ/lfNz4coEjXed0zBOh3+TvGW4Ko1xmEvApl4sjF4rH2nCfl/LdR7X/HlKP8tJQGJ49vdpr30+psqpMSK14WMIkuUcKO8g4U364fqrtH9rPL5o7ytY2pSNW+qxZSJWZtzn5J5d2Kg/pWFbwvvZ/kX+TzmyWN+tW+shSQuazT67GROEnGYP2JTpOyBXqyZiSngCvBkUcRsfY1SqaKEhyTI2t1XFVeYPRFKvgngD3TOHcJ406pTnJ2Kt64Mw9HPcPB92jjCp0AZHS7+bvTWo6KvyU18mDrgkPTtVXBIVp75+03WmfG+vcKAIY8f9DnPzO6ZgT+yP5xfdKYvj3SoPhRLkYQvjcQHNir7L0SuVR/yH1MC3NSXGwUzlTTHhv7InSfZM2HTNTQ75FTnkpkwsYZdTKmdLxU+RZIoDy0dFp22I/GJQZjC+lvXijKOo1EH/e4a2ymUdhduqr6SOzNVsnw03zWXjeFZmorEPHhnVarFDKFvSUjowpjC21calHpoVJLKt639Er8DQHY2Pr2Lj6pXRh3GTjnuiNtto75UVNlI9+f7SxV+XTfjzIbhnbizIeKzDqvmbxxWvImhVcQFlFHcXyZNfJ2KearwlDZiczjGLFH8nvdX4pwJP9nXxOvLuYLveqT0OyRHvlxrjf5aenJFnyxbuL65Fu6I2x0nTxnpBwislT1dMZINrH8Hwtv8R3oqr7aOVlOQFPc/KnSL28iq/qqDhmCqt5ewUNDpQXfekfyBD6yyDJ8JC6ev1smOCCjg/qnzfO5pjNdE195JgcamXfOp8l590Yk8VjQ60BVgrfip6MLaxmaHEtTKbG2JZ6Vkuj63xxbFU4fXJsXH2uNIz/yaEXL6jzoHPSKd3Rx17VEdpD/iU+yGzpK5McswRj15As2VXvjul4yuvknGtCD/jD3tHxDzhBw4xQPBnYf6n9sRt2jIneLFJBTMp9VggnXzczVYifG3RoPeHitoJMVSaR60/yMSDe1kYnZZaut/RNYcdyNR1rJ0Qnh2TkIowxS38IS/8UxtMtLuKfaV9eGAR60+0Kx9h8oY0vjbD/VNsrbcEpnnajjA+1H5biyaeunXym8FdzKi/Jgh4faqN/H3zBVxmnZIMOPGlk5pX9/9PGssSxAVhJ2l0slzY7Oiekyupr7iMxH09qQ5/heC2XybOnv+KO1l9V9l4/QqdMnmvls3qfnWIy6AuHjg2D4vqHkuWYfSJds4pt35dkdzQ9Kzq2tivjDmNM90BwIPfcw7ExtngOza2gpC9lKLx2zSmNrVPjKvdAr6dkU517OilsjbGX+w9kZOUOs0K0J1+XZXxJ4wl96p86ZkUKjutteBAajrKfTE7ubXY6XnX8zqqatZvJdaeM3WsLCh89txS/d15TscJrfWCWXMPEmTx7484wbetxVuZZrx8FeRdfEx4UCjtKkOClJxTpBOCk+13hdKSiUxzWejWeTDENnQ8IwRGmjWVv1LXKTc1K9bCUkIvEYhflGGMSLjKqAIOQjhqMyphvcb0zMtZ0/CDKUyxK8iEr751h9HAh56Z5p2NuyN/KNi6qnVM4bU9fYn0ygyL9gL4W+kOMf08+5fJpV9LjkLP4NEhpuGhT5hL3L2V6Fet7qX2OD3Iq69RsePIa2Khu+hoD2NqsTslpUR+R7vQjzqeqU5qlfaWov8pD1ln9tSrcIEJl1/rRLfBp7rMDLMXD2A7V60qeSWk5N2DYPAYpT3O/ibIcq0+Mtv2p9BzRsbVd6dvFa1SuQ8t+bM+7UlrFFc+hUtqxsJq+Ch+75pTG1qlxleX0uS7cD/DaQfewTvtFnRR+0Ngb9X8s/3tt33KsMhmHkRk9k+OeiHu2sPRf+xhRYfxPCfAVz/kY7hG0j0HEOZGMKZJ0TuHN51eXaeGO6qrxGz23lI/4vfNa4WN9IEh5gH7/UgGr3Z9EHS7iOlloPtpl0TXhYaGwYwWlGwxOzK+1cRNL5+89/ddx7lCKNbFjjnI58Z+rkVI6buSaXjBMGRr8pnokAzLztCMYJINykXNRQ2XlTDF5V3VTD1t4eqbjV9pHnlM8Xanp+Ej1F9tS8tEfuFinGwva7+/aWhxPujCA09OnkEfH6cLPhZkLLk+uqAP5dvL5BDgzOiXHhRl5ZzmVxywdSxZT3cjE0yO2UO+sApVY+U7ORtWmJ3xJXPpPj2+KkD+blXQ6NadFfUS6cc5PPW1dVX/Vt6S/Ktu4m+hHV89H2s/ps+Ow7mOnmORlNI0NeQbtz+k3R+kTUZ5L0bOoo2RsbVfGlkPH1ogklLM3Vk2cQylvq1/Td+yawxgy1JFxak/WkhCS/z2FMw52q0cO1Gm078T6GNPRibE3zeZxb5bGSEWF+Hy85+Fnb7wpyEk+yqB/pHIJS27O+ZXyzPYLciF30mWUj9It6QNJxtn6SdbVx10JM6Vjkhf/2NfJvC72OS+G58swTfH4YTG0EiiwnFiAmHIswel1bGWgA3MDm27OMR6ea8OyT2HDcjnpp24oU7ljBlYoV/WsIf9UPTQ+lmrJ9S5gC+VpYTKsm2ln8gW3sN6Ufcrv6Zgl5iJQa0ueCnYze5KPdFz0WlwvrzLAPxlYO5UV+qH8pwpnFi04HdMXuLiU3HAwLqUphWF85gYxT8aQIegtHyNneKJ+oPChHEyjp4t9T79Y1lHZSEYYImvnVO/wfE5xS1hNcVpyno5x6sVJ8LE+kuuN4Txsm6R38tfWP/WVan9VW5jP4HyObZq33S71WfkHn3ex/O66kho/+s1jUJavud9kelT7BOVes541HaVW67WI69MjOORuIRPKCedhXpb2e9cRlU2acC3W/qxzcqBv3m/HrjmlsfVxRdae6KqPcYd7N2aBct2qOvUKKB/08irJ8Lqa2NDXX6UiVH83fkW5dnlYLGd4T0hdz1IZ0Yd5V9Ygrvn8Svkkw8HXCZXR9QmVO8Unvzdp7QNJ3Nn6KePRx13V0esDSdjoIzM2wNQ9dJ5tiZ4pf/GakCLH/IdjkcO42HkRdIkDWH7TSBkvtWEY1d4zalGMcocnEWXvuRXkH61H5X+mStGRxmfZVncjHoXh4hROBo4Vz0k9l2eVicp7pPJ+p+yB6zFaWO+gyOphT8dqqn4Ecndc+lH1o6jvMG84kWLcTj4XKhwMOuOLY8V1J6j205Q85fFUrbtQKY5jBiyWfoY88nufJtcx+dA9n2Ggvq4PKM2w/+8UxtKAsT4w1E9FTjuVSb5h3hobBpigb8onP78JvMtrVFyVFekUzwAMM3SnP3bLORSHTFOclpwXQ11VTZCF8GFcjQN9pGt37XPMtYnlDt0ArP2q/oob7SuKn9RfdeKq/TXKMtZn7kvo/w4ZhNgozzDuaHyoVHUe1D+iWs19VvXNOu9mMkEc2mp0bCCRyl3cb8gvV+0TRKr8a9Cz2vboINfcrvfJu9/H2rvrjuLOXCYxW22MHZ4nXXWqZ8k1i/y06eQ1J1a0ZGylX5CPB9HhmhGPCU96nmLszXWM6gQP/bsxM8rGsjpWdOTXXdjn12COe+ed0o+dX/SrD7QxG8WYRF/BSOzOmXxfccEpbNH4rHzIx5azPdp1VfWN6hflWXXcnakjPHvtRUDJqdyD2jErs3hNyOKruw+qMStGxEajxPxma6dwbjLpoC+IHDrFcyLQmEWneOLofL1yi4kPCGytJ+qzk8+MWXdDnFWNvLXZpCxZfVfljjFJJ35XgNJjrLG866iMugrv26uk4xuloa1Kbk8nycsAOuqUhr7DFpyOuThw8qErT2tyR/1sO6WjHagzOB1zIrIEkRt4+uRj+fkFjXSs7+aiulMc9XDS5Y56iQvyyKcOwp4RfoA7BRtkDmzk04c6Jz1g0/WdeDzFCqMRVvQDHhJ0baTjk3KKdXf163isj0i8+4FM6ZDzUTwOMhOp8EP7Sqv+tEdoE9XZ66/IscAV+5HKhs2p+azRP5C5qc/OZTWHSWwb+kl3jpTqU7pD+w3FrtonzqTnWNuj49J2pQ1Sf6CcxU5c9s6VWNheuNJOjlMNgoSxRmUVrzlZ/tL9Azqje9GpTPJglMAdQ4PrH0Z8YrVIJ5VDO7EFF8tF/t7Yq3DqZyl57fwIxsJ9KeGXMtK909MsHEa5nt/qmP93Qv6d/Knzi5UZrMJ4pY3PsLPfya/9pa7IT+U38ckqHe0DK+jXOu5kIo3vztFRaUM/UIm1fhAqW0HPXGj6S+rnefjk/sPJFAcmkKLcmIcnFfIxGLrZIe3zdBUXvjim49JTN9am8gShd6Oq42q590Wu8zunHqWlIcZONjh0TygOkLDIROVx0eMCCBvkQB7SdjMjOl7kVAYdG9k5wWgPBoRuBkX7ydV0pP0oo+SYWeGJVopH7pelhIWwlJcXADkJ6ENcUH9VeXlbIPtThYUbf/lpqZqCg16Us1M4DLsnWDGMp1e8QJqeesFguMQKvUmX2GMYDJctKGi2S/odkw3MXkh2jD+YcZ7Svhg29J/83INjlZXidqTXFgyqQV6iz8EpMZzqI88kH/0w6K19Bmj0CIOvfNyo/so71Vda9R/rr/eSzPtNDEr9KMUdnQ8i0ye0Hdo/5vTZeaTuU08ykQ5zxqBD+w1Srd0nKPPUeo61PfIsbdfHyptfpyjrEIecw/uOxKp0Di2tq+Wak8rm2kEfyN3YuEo6zmnGU/zOSbdUziE6pbxj1w3qToZOV3+2M4znxhnDhfHnZZYO3dO1mVcD+IBAXi76IM9O4aUxPI333ditdPS1Q11iUOoTKW6MD/W39IFD9YPfMe9PqjqK85rXyTntuPiacArDiJvy4o25gNGx886twz3HCUKn6HVi5a2Wu1fCAQEz6+Gke011yvdcW2pEjrkA4K9x8S4yieVzE5ffyBF8sIty99pgWOiEjsj04TAPx7Fs2ni2U14upKNPISh0Ih1t84Z0cuHCqfTDpZA8bUv1hIv0ffLuF4MLo3+qP3cZWnZUHv3lnGyGYk6yksxhUJN/p40b4O/YjwWdnJPqbu0jw+tRqS0n9ZeeY32lSf9WmYeNUztWedV+1FqX0q3CR+Uc3D9aZa7xmApvKV9p5oxBh/abXYtMU3oN41vKXFNPlTXW9rsWeYY6xGM+KLDmuLc3xkq26jlUkWkyWGW2nFNwof/gD+8fquNqTP/XMSFieUcbX1Q+8gWDpSSH4hlLOxfl2UvfIOfo+aX8PHznfO3Gbh337tE6IWbsjMmluJONO6prSr+mcWeG6iFpi45Ks9p1skHPXIXF14QHeSmXuB/BMxWbLPJLFDPJFC7MkjU8DU2B0U8X2kHw/MMLZjKm4ytpypOcS3TpKeXHUThme3jakLswExfb9on84SCMbslwyvNN7Q8Huqn0544fZSUuPB1ixoUPSODv5N/hR7eUU8p/bn9U/yjcWF+5dv2n+I/yuaD+cerzbpRLQ7+Z4l6Lvxg9G9q+pkNLeDcT0JB4kolk5Vp+SfcdtbH1ksfVhqZYLcnU+cV/GHJfxkoPVo6w/7qh9sm+0lDGGkkO1e9axp1D9cxZz7km5Pl2b33xxRcAYxqM9wYupRP0hORAsnFh6Jbh7SW44IB4EjI1v+TGuapZzkT7tCPvxqxaR7XyQYTq5UIzqqPScKP8ifyhUTEo7bIOJS9GObMATEVjPDHV3z1li/HcDPeefl2WFueXZgucoo7FvrIF/Q/pZVvmM9ZvDmG6hbyRHS/Jh3dA19RZZZ79vkMyjI6tir/KcXXNdnJZdQLqH9y/bOr+JOo865oQzzM4vfWwjvOyYiQs60vDdPJlSdYkTb6UqClDS6KcifbPbWy06JieenVGRYueF5CGfscTp8fyeYrYk1/HPFCwUTTRUBvhVO0rG9F/ohfUozfOp9pv6sQcEwnwlJmxZXWnPnkJ9x1TY+u1jqurt5cL3Cew0evqQdeEq5kx2m9uh1wjAZ2kTGXzcv/Fzk5eI1fLbAImYAJbI6BxZHNPw0tt7HG1RMVhWySw9JqgfMzMhhmjB1sEZ53PSoAXK9PX3c4qiCs3ARMwARO4agKMJb0Z/KvWZrnwHleXs3PO2yJw8DXBhtFtdYiL10ZW+Z2EZMaIl/TtTMAETMAETGA2gTiGePWByHlcnd19nOEGCax1TWheSqcK/7hBjlbJBEzABEzABEzABEzABEzgRgnIhnlrTDXFd0vpmj++MFXoWIWOMwETMAETMAETMAETMAETMIFLJtBsGF2yEpbNBEzABEzgPAT00Iz/i+CrarwIzyeT+Q+r6t8GKI5P3v8i/6wfYFH96U8RJY6dCZiACZiACex2NozcC0zABExg4wRkJGDYvIgYMHBwzxTOO4FTDkPorySK5fxHu8VlC4pP/8lyVqMoyvqV5OErRH55HyB2JmACJmACO398wZ3ABEzABEzgSxkI/GcLG1+4eqONP/5uce9niTCqisaUysX44s+Rq7NJWTmn2sWoO8p/4JxKAddjAiZgAiawHgEbRuuxdEkmYAImcK0EnstAYElcchgL7yjsvRRQ85Umn/0hH4ZVyRF3UZ/ql+wYaU/kY7TZmYAJmIAJbJyAl9JtvANYfRMwARMQAZaTvZ4iIQMC4+Z3bcwKPdLxVymP9jF6mHH6JYUNfAyQ6rI1xVXLHpQzeqhyMPAw6D7UfmekaZ/Zoe44KyQYRzr+IQvzrgmYgAmYwAYJeMZog41ulU3ABEwgJyCD4Rtt+RI4DJjfFNYZOdr/VWE/yscYwohK7yTtFIZRE4wi7e/9R5nCqkvslI/81bKJb3Uqh5mf9+Qj48fxeCcfQymfEcuL/EkHH+UB3jcBEzABE9gmARtG22x3a20CJmACRQLRiODLcd27QwpjNghDKb0fxPK5v1OAwngXCWPoP9rn/+5Ks0IYRry3tOeUp1r2XuLpgMdKgpGH/MibjD2MotqMGGmQz84ETMAETGDjBLyUbuMdwOqbgAmYQCIgQwIDgdmf9zOjguhPtXXL0GJcmE3SfmdAkbDimMlJRsowyVjZzPQgz5T7h+TAEArvO8l/qgwYXMl9qJ0f08HALxpsgzQ+NAETMAET2AABG0YbaGSraAImYAJTBGRMYBSxHC4sK4vHO/kYGxg2+UcWpoobxqcyhuEcV8tW3RhfS5a5MUOUG0Ycv1R5LLMLBp2Ok0PvQ3RL5dg3ARMwARO4cgIPrlx+i28CJmACJnAgARkLGAcYEvyvD8YDMzWfa0uzKRgTpOmc0rTM5IT0SruXvytIf/aq/cVlZ+UMd4Oxo7oxipLxxf7QUTfvONmZgAmYgAlsnMDDjetv9U3ABEzABO7/swjjofffRTIq0vtCLKNjNikZMKR9ORMcS934BPhwdmaNsoeiPIvyYvBQH1+c489lMcKGjhmppOcwzscmYAImYAIbImDDaEONbVVNwARMoERAxspfS+EpLBozhxoPzDBRBjNRnVup7K48dlQmhhBbcvl+CiMdBh7+0Fjr0njHBEzABExgOwQebEdVa2oCJmACJnAuAjI++KId/32UZp3OJUpebzLW8jDvm4AJmIAJbJSADaONNrzVNgETMIFTE5BRxIwRX5ALMzWnrj+vTzKwtI4/ffVsUQ7G+yZgAiawYQIYRn+J+id/wzisugmYgAmYwDEJyBDpLaU7Zl0TZX8nWdL/Mk0kdbQJmIAJmMANE/hb0s0zRomEfROIBHSzdElLfdwuJnBzBHSO3Z1bqUuQ4dwMXP/xCHgcOR5bl2wCxyTAxxf+GytI/jHrc9kmcNEENJh9JgFZWjO5vEZp+fQvS4IwpN7VxrIcP4EWCLMRBDsTMIEtE+ALjB9r+2rLEKy7CVwJgX8nOT1jlEjY3zwBBjFBeFt+8QtWBUAYQj/EgY/lQT8W0mw1yGy22vLW2wRMYKdxITwkk8+7bHYmYAJXQsCG0UoNpYsfT4aubgmWZGaG5CjuUpi06Kg0zPy8kD/n/Yf3M3C0/dmXB2XynHvXbM7dAq7fBEzgrAQ0njBbdJSPjajss99zSIam+4dLkPWsHeGCK29twwtWYXXR/D9GEak6B8ui+GISswbfaPtRYd3Mgfb540Nufnlht/d/HjrmiRB/XthbfqVjyuRGG58yuXHmBvyxNhx/mNjLcx887/eQepT3K238231Pp3kS7KdWeUUmpFQcHGGSHJ/wPWi5gfLD9VNtDEL5TfmOsrVN6chne79OArX4KjNvO/LzR5WTTvlIy4DyvvZLfzg5WcalJ1jCZgtcWtrNHKYpmdE+oxoThZ9kHNqXaP2QK9WRcWXVz8KLQ3V8XZ96vUTJMTm2Hiprrc3rUl1nTE1PhR/1/FX5k214nUSXS/1gedbbyqnOwbT3T9rutM/NdW4U0TGJ/x/i5HdOx9yQfyR/792SGPa94jGaKBNDCJ8baG6qV1l6pfKo+5B6WPbEhXvSKd2k8aA0Y0zeUyVPlOabtOmYmRryLHLKS5kMFJRRK2dKx0+RZ4kAygcT2navD1TKCwyV/qKNoqhXRYW24JlsroJLm+YHpTKHaXw3zWjhuVdkorIOHR+mW2NBii3oCBbpybjC+FIbmzp6LUxiOcV7jq6g0+5Ux9aVZC3269OqOK+2lnYslFjUU2Wd4vyttmFBzpsPsmHUb+KPdNi7uVWnDFPF8rnxvesnD0cYFKFDF+II2iszpvtdPjMna7nF9cQTD2Nl8sItYVtkHmPyVPV0Boj2MTpfyy+xbWKjvL9oY8Ypn8Hp5VU87VrUUXHMElbz9goaHCgvutI3kKFpWYHSU1+vnw2KvZTDlrauyrqAzbVwqeq8UoQ5TIO8dUZLzr0xJovHh+mmWJxiCzomOIwvrGiYci1MxsbXqfJXj9d1vjq2qrI1ZB3r16vrs1KBLe04rGpMz6OevxNtOJTz5o8f3ryG8xTkJj3MCKmj0LHZf6n9sZt2brZ7s0iDKinz2SCMQ/J0s1KF+LlBh9YTLm4ryVRkEpn+JB8D4m1tXAiYoestfVPYsVxNx9pFp5NDMnKBx5ilL4SlfwpjeSWzVZ9pX14wrvaWBCoOg/OFtl+1sf9U2yttwSmetqOcD7UfluPJp76d/DnvPJGl6lRWkgM9PtRG3z541kplLGKTyTOHCzp8qbzMvLL/f9pYkrjIsFXePZfJdXROVJ7V18wh5uMpX9PyzT0lRwIyefb0V9xR+6rK3+tLUdfUd6+V0er9NmunIpNBEx86PgyK+/PwmH3iwnWc06aMPYwz3UPBPwnO3iuOr5QiXsXzZ24NpTaN5deuObWxdbasU22+QLa56u+lz2TauybuJW4MyMo86/mbiVtrwyzJNnYfbEPNaS3VSbkxxf1T+yzL+lnb79q/I7DkFIfxNBXPxZMOFxx5tLHsjXpWuamJchxaD8sIuXAf5KIsNSYMzrDAIORikBuhOjy6q+n4gWpGnqKTTsTxzhlGz2ttGDk7HXND/la28cnunlMc7UJf4h0nBkX0p6+FPhHj35NP2bxMS3ocshafOikNhgFlznX/UoZXsa6X2uf4IKeyFrFRvqVceOoauKgM+hkG0TVzWsRButOHOJ+qTmlW7SexzWb11apwhQiVX+tLt8Coud8W0OwFxbaoXlfyDErL+QHD5nFIeZr6TpTjKH3iCnSc06b07eJ1Km+rqf3Yllz39pziiufPXsKJgFqbKnzsmrM3ti6RNdZd7dcLZQsaK29Tn67g+ZfCVxs7p/TMZVDaWefvAXrutWEux5b2H25J2Qld000GN+ssjeMmlhvgvRkAhSVHh32TDgo+ZXIRe67OmqK5kXum4+LFLSWa6TfVE08wln0Fg2RQB/IcfOGOZdSYvBv1pq7w5EzHr7SPPKvNjKismqvp+EgZijJLPvoC74ilmwra7++1CgrhPMHDCO7NaOg4zdQ8VjzvWzF7Rj3IuJPPZ8CZ1Sk53k1D5manspilY8liqhd5mPliC3U2FxYTKt8hbBZxUdUY7/m7efSfHtsoHt41cFrKgXMeI33Mraq/KlrSV8fk6+Im+tLVM5Kic/ptx2VkZ4pJnrVpfMgzaL+17xytT0iGi9ZR8s1pU8aXo42vE+ePqp7lim2qEsauOYwhQ/2K90cTsk61+RLZkvKtfTqlD77kXX3sVMFTeuYyzD1/F+mpCkttmMuxmf2Hm9F0WlEuctzApht0DAgMGp4ypLBhKdycjt1UpjLHjKtQpup4TzucLFOOJUTDG8HWejjBeKpUcnuGgerhxnd4sftA4Zx4uWN6PS0RmGKS52OfJXXkCU7lHMIhFVPz93SMCbnY1tqRp4LdzJ7kI10yLmL2Ua+XXylpg2Rk7VReaEv5TxXeLa3UMRyGnBUU3HBATuFjPsZnbhAzS0b9QW/5S9q6p1ssq5VNL69EaeIS0yFr51Tv8LbcQ5QAACAASURBVHxIccfgtKR/9nQdcOrFSfAxDrneGM21/nEs/VNfGe2r0s+MBudzbNe8/Xap38o/+Nwb9pvUAaLfOj7k2ZrOnUyHqT5xczpG5sU2zUHGfa5Rj/Lwhe1OGeE8zMvSfu86orJJE67F2p91Pg7aNNdv7JpTGltnyzrUQ8fnvh5KhDBuHnXsHOpJpZmbe/42nbtZ+Wm31IYpblP+w01pO64sJ2De+Un9UhuGUe09o72LHZkyR5k1oypLFm5QuYjRoZe4yXqkw2cqGP0w/liy1d2ExwoxgHo3mEoz5LFTGEvKxuQsMlEeLpK/x7pyrye70h3CIS+3tL+nYynRIAy5e1wG8dXDqPMwf7hoxbid/LtYABw6A0z7TxTXGdTaZ3knjvKYXeoGLMVxzKDF0s+QR373eXLtkwfd8xkG6ur6gNIsaeuhbipy2kV5hnlrXBjUg64pn/zOsFTcXV6j4qqcSKd4Hj7AC93pj8zWhTLkI9MUpyX9c6irqgmyED6Mq3Ggf3Rtrn2OuS6xjAmZgtN+VX/FHdxPYjVTffVqGaGfOB3URyKj5n6r+made0o/p98gDu01OQ6p3GLfUfhov4n6TvWJi9Yx6rCTrtW2V5rmNk3lZf5j7d9lx9Q1i0nMWxxfFTe8jnRVqZ4l5yP5adPJa06sqDS2zpJVcs7p102yqcxin0ZmxdGeH2hjCTxjAe3D8viuXbSPTFNjQpdeaYNTvup9Uixz2F616z7lTZ6/KvMgPe+lDnouuteJ+W/GeyBNAEHDvrkZrWYqok7FCYLLb7h2Cucmk5PlBZFDp3guOJw0e05xhNP5e2XuJTwwoLWeqMtOPjNO3Q1xVj3y1maTsmTjuyq7xiRdgLoClBZjjeVdR2XUVXjfViUd6fu0Vcnt6SN5W2b2dkpH32ELTsf0My5y6MsTvtwhAxv5aAvqDU7HXPRYhshNPH3ysfzhBYz1weEdJ8VRz2NtyVHnTuFBFvmUT9gzwg9wi9hEOVq5kC5wkU8f6pzKgUvXd+LxFCcMRjjRD3hI0Mmh45NyinV39et4rH9IvHsDXemQ81E8DjITqfBT9RPaI7SJ6uz1VeRY6Ip9SeXD59SM1ugjyNzUb+fymsMktg99pTtPSvUp3VTfGbu+UOSqfeJMOqLHWNsf0qa0QeoP1LPIicveeRIL2gtX2qZxakKQMM6orOI1J8u7d/8wV1alhy9bcDo+9vWQ1S+sdHmljc+fs9/VH4Q4wpgwR0+lhSt9p3r+Ks3UuduiJ+rutSGBG3IwDkbuQ+0Ag6cCBA47hYJu26lTcXOOtY7DaOhmh7TPkzJc+OqYjktP3XgvhA8qdDeq2q+WeV/cOr9z6lFaTq6x9oXB3pOPhZLuMVE5XOQYdGCDHMhDum5WRMeLnMqgDyM7F2/aggGhmz3RfnI1HWk7yig5ZlZYVpnikftlKWElLOXnhVIGRvrQU22/qsy8PZD/qcLCzb/8tDRRwUE3ytkpHI75zA9hvI/0vcLT0z045Mus0Js0iT2GAU/G8voVNNsl3ZawSXmnuMDrhWTlxgx5OUdpXwwb+k933hGnrcpJcTvSawsG1SAv0efg1MrhmeSjHwa9tc/DDfTghii5Uf2Vd61+MtZXkyxz/cSh1JdS3FRfOZgRQtMvtB3aR+b027msSD/JRDrMGYeqfUflTPUb5Dlmn6i2+1o6ogBO5Y21/SFt+ljF59eqUN/CH2Ts3XOonNQfSufPwmrCg7Opa04qm2snfWDo5sqa9Ki2eazg4HNdDNMY242XCqONc4dexxw7q3pKltbzt3ruokijniSttSFxW3D0A+6hvnm4BW3HdFSn4ca8eHOuOG4+SrMreZHcpNExuxNqrMw846H7M+uh0cMNtfI915YuCjvtc7OPv9aFe49JLJ+buPxGjuCDXZS7418qcEJHZPqwkg8mpQt+KflemOrlgUP1aU/KMJGO9nkT04aLuNIPl0OypCrVwwUu54GxhcE/1ZdjFW2eylvMJsqa5K1W2JouFjDJSeXRN8PDD+1z8/udfAwu3Mk5teqndMNrUaktJ/WXjgf3k1aZA9HGH5VZ7Uut9a3FSOUc3EdaZW7Es5espXylqY5tewXeP6gau8aM9ZtdizyFOkeDWspcWUf0qLZ9izwjCvGXFGuNfXvjq2Srnj8jMo1GqcyWa85O6bju4CPD0M2SVWW0jpctso1eD1UXD7w5R7rxUse9eyPFHWtMmNQzyla8Nx1APlhP1TXWhoPqbv/wwe2reFwN1aHo4HzZKz2pOW6Fy0sPF2XJGZ6EDopJF69BcPGwdPHrJbxQJmM6vpICzMRcqsPIYdbk4yggMz48gcxdmI2L7ftEfj4Io9ukEZIXFvcn27qQ55xBo5zEhCdwzLjwsRD8nfw7/OiWckr5z+2P6h+FO0Y/Obfec+ofZXRBfeTU594oFwEe6zdz+OdpL0rHhrbPZZ+7Hx5oNWSaZCI5L+2eozq2nlnWqT7N/wZyP8TqClZrsP960EZLx4TJdhzUc8jhGnpW2/AQwa4171tffPEFDc90HmvzT9mY18qsKLfY0bG6ZXjFRBcYGC8GTHcvuXEe1SgxUSKMRt6LWb2OUQFiZIuOSsON8ifyc4Oipfizp5HM8OWJLlP+GE+slw6zXDGOmxqeitlVCGyBU9TR/aTSB6aCt9BHSgzG+k0pvcP6BCI/XsYP74D2Y5cfqbyz33NIBoyJyfuHS5B1LmnJzLh682NnaxvO5Xdt6SMH2vutzS+lW6vxBJO1uGE6cq0yT1ROvpRo1SoTE/nnNjZadExPTBYvm1sV3rzC6Hc8/Xosn9nLTgft87DDRtEEz41wcj+Z6Adj0RvpIyUE1X5TSuywPQI80Wd8WdWpP17CPUfL2Lq7EFln8d/Q+d7UhrPgXXlizxhdeQNa/PUI6ELIlDov93vmdD2sLskETMAENklAY8kmZh022bhW+qYI6Fxl9jPMGD24Kc2sjAkcRoAv4qQvux1WknObgAmYgAlsnQDjSTeDv3UY1t8EroGADaNraCXLeBICemJwp4qYMeIlfTsTMAETMAETWEQgjiNegbCInjOZwPkIbPodI124/jgfetd8yQTUN1ZfE37J+lo2EzABEzCB1Ql8qbFk9UJdoAmcgoD67lunqOfS6ti6YbTJRr+0Tmh5TMAETMAETMAETMAETODcBLyU7twt4PpNwARMYEME9BSSPyfmpfSzOsngJbNnbQFXbgImYAKXR4AZo79EsZJ/eVJaIhMwARMwgaMRkJHAJ5lfxAqS0fJM4bx3t5pTeel/T87+5UfJ8pU2vkLkl+NXa2EXZAImYAJXSeBvSWpmjP4bD5Kf4uybgAmYgAlsgwDvQvC/KGx8nfGNNv74ezWncjG++PPhs/zRc0WR7yWP3yeswHGwCZiACWyEwL+Tnl5Kl0jYNwETMIHtEnguA+FJpj7GwjsKey8LO3SXMi/qc/jRSHsiH6PNzgRMwARMYOMENv3xhY23vdU3ARMwgUSA5WSv00HNlwGBcfO7NpbYPdLxVyltNC5Yjkf8h9peKuyXFC8fA6S6bE1x1bKzMiZ3VQ4GHgbdh9pn9is47TM71B2ncPnMYJHnhyzMuyZgAiZgAhsk4BmjDTa6VTYBEzCBnIAMhm+05e8TYcD8prDOsNH+rwr7UT7GEEZUeidJu8H9S7+vYvxL7XMcnMLe0U5efozp4qfK7qWvHageZn7eizLwkQeOd/IxlPIZMYKT+0k7H6UD+yZgAiZgAtslYMNou21vzU3ABExgj0A0Ij5WxPspUmEsgcNQSu8H8fGEv2fxfOHtteKTIUU8M0rBMNE+hhHvLe25qbL3MowHPFY0Rh7yI28yxjCKajNipEE+OxMwARMwgY0TeLhx/a2+CZiACZhAJCBDAgOBJW3vZ0YFsZ9q65ahxbhkBBHPDFO+TO4DArMyMJCSkUJU7qplKz8zPcgz5f6htBhC4Wt38p8qQ/4+E0v7fqwUUjTYKmkdbAImYAImcMMEbBjdcONaNRMwARNoJSBjAqOIr9KFZWXxeCc/zP4oLhgdw/IUj9FD3nxGBiMqf2cnlTHMzjH5a2VjfC1Z5sYMUW4Yccw7Tyyzyw06BQfZi/UTaWcCJmACJrAdAg+2o6o1NQETMAETKBGQsYBhgyHB//pgPDBT87m2NJuCMUGazilNmsnB6NjpOMwIyScdYc8IxylsL/99TPjdi1P6VHaWbPZuMHZUFrIk4yvIOigJeXnHyc4ETMAETGDjBB5uXH+rbwImYAImcP+fRRgPvf8uklGRlscxA8RsUjKOSMsHFnDM6PygON4zwjh6V9twKZ6Cwjs/fAJ8ODszVjb5ljiMMuTF4KE+Zq/4c1mMsKFD/qTnMM7HJmACJmACGyJgw2hDjW1VTcAETKBEQAbEX0vhKSwaMzXjgfeJWKaWL51LWXOfWSDKYCaqcxNld+nm7ERZcnny/a4opcPA20UZunDvmIAJmIAJbJPAg22qba1NwARMwARWIsCyu/S1umqRMj5Iw5fq0qxTNe0JI5KxdsIqXZUJmIAJmMClErBhdKktY7lMwARM4MIJRCPnn/JZQjfplI4ZI74gF2ZqJjMcMYFkYGkdf/o6XNp3xFpdtAmYgAmYwCUTYCkdgwKD1ZtLFtSymYAJmIAJXBaBaFTwjk6zUx7e/Tm7YSSBv5McTQZds3JOaAImYAImcI0EWNEQloszY8SyBr5GxB/j2ZmACZiACZjAUQlcgkFyCTIcFbILNwETMAETaCXAF0vDXzx4KV0rMqczARMwARMwARMwARMwARO4WQI2jG62aa2YCZiACZiACZiACZiACZhAKwF/rruVlNOZgAmYgAk0EdAyNb5U9602lmrzLk9Yu92U2YlMwARMwARM4EwEbBidCbyrNQETMIFbJSBDiD9S5U9e/5D/463qab1MwARMwARui4CX0t1We1obEzABE7gIAjKKeJkVN/kfR/fJ/GsCJmACJmAC5yVgw+i8/F27CZiACdwqAT7j/ZsMJH8S+1Zb2HqZgAmYwI0RsGF0Yw1qdUzABEzgQggwY+TZogtpDIthAiZgAiYwTcDvGE0zcgoTMAETMIERApoV4iMLX2rjD8N/14ZBxAcYXmoLTmn4U9fn2t7W9quOvwkR+tH+r/L449cfUph9EzABEzABEzg1Ac8YnZq46zMBEzCBGyIgY4aZoZ+1YdiwfaV9jCRcPmP0Isb9pPAUHxLphz8Yf5oO7JuACZiACZjAOQjYMDoHdddpAiZgAjdAQIYOs0Dfa8MgYrYoOfZ/UVh4v0g+s0cYRLjw7tH9bvf7THt5/i7COyZgAiZgAiZwKgIspftLrCz5p6rb9ZiACZiACVw3AWZ+Hsnw6ZbFRXWYRcqXxfERBj7hjftUW7fELoRMGEXKSz2faeMT4KmcmNWeCZiACZiACRxE4G8pNzNG/40HyU9x9k3ABEzABExgjABGTr5cbifDhVkk3jnq/r9IYWnm6GOFE79nSClNbkgpSc99zZHS2CjqYfGBCZiACZjACgT+ncrwUrpEwr4JmIAJmEAzARkpGDhsnQEUM2MsYcT0DKYYV/uENx9kGHMYVKXyxvI4zgRMwARMwARmEfBX6WbhcmITMAETMIEBgeG7QRg/YWZHxhEGDe8apTTMJPVmfWKaMCOUylUYBtcLbXytjn0+zPBKW+eUhqV1uHe1sdSOusJ+Vp+C7EzABEzABEygjYBnjNo4OZUJmIAJmEBGQMbHnQ6ZxcHYCU5hGCd8aOH1fcjuo4GRglGUp2f/nTyN9jGE+Mrd19pnyR11UGY3Y6RwjKIf5PMFvMfaSMv+B9pIa2cCJmACJmACswl4xmg2MmcwARMwAROIBD6R/200VFgOx6wOM0ZfxrDhTBBfr8OI4Ut2YQme9jFocsfszz8VnmaZQpyO85mmuyweQyot53s2SJeX630TMAETMAETGCVgw2gUjyNNwARMwARqBGSEMGuEcTR0pbCQRnn+MUw8OOYdpTw/X7jrZotIqzLyjzcQH8pUeG48kdTOBEzABEzABJoJeCldMyonNAETMAETOCYBGTbM/rDls0XMQP1IXIzvRNAxy+a62SMdd8v0ukTeMQETMAETMIFGAjaMGkE5mQmYgAmYwHEJyLBhBootuGj4pBmj9LU73kn6T0zCRxlyI+rzGG7PBEzABEzABGYT8FK62cicwQRMwARM4IgEWEbHu0h8gOEN+9owgH5NhpP877TxAYb0nhL7OBtG9xz8awImYAImsICADaMF0JzFBEzABEzgOARk8PA+Ue+domFNSpO/pzSadpjXxyZgAiZgAiZQI+CldDUyDjcBEzABEzABEzABEzABE9gMARtGm2lqK2oCJmACJmACJmACJmACJlAjgGHEi6ssS2Att50JmIAJmIAJmIAJmIAJmIAJbIUAS7LDEm0Mo3e08Sd8/Hu4nQmYgAmYgAmYgAmYgAmYgAlshQBfPw1/SO6ldFtpcutpAiZgAiZgAiZgAiZgAiZQJWDDqIrGESZgAiZgAiZgAiZgAiZgAlsh4M91b6WlracJmIAJHJGAPqH9nor/VhvLs/mfofyT2kes2UWbgAmYgAmYwDoEbBitw9GlmIAJmMCmCcgQ+kUA3pf/h/zwx6ubBmLlTcAETMAEro6Al9JdXZNZYBMwARO4TAIyiniBFec/Xb3n4F8TMAETMIErImDD6Ioay6KagAmYwIUT+Ejy/SYD6e7C5bR4JmACJmACJrBHwIbRHhIHmIAJmIAJLCTAjJFnixbCczYTMAETMIHzEvA7Rufl79pNwARM4CoJaFaIjyx8qY0/Cf9dGwYRH2B4qS04pXmknefa3tb2q46/CRH60T5p/yE/fKRB/sc6pjzeU/KMk0DYmYAJmIAJnJaAZ4xOy9u1mYAJmMDVE5DhwszQz9o+1z7bV9rHqMHlM0YvYtxPCk/xIZF+XmjDuEoOY4jjD1KAfRMwARMwARM4JQEbRqek7bpMwARM4MoJyNBhFuh7bRhEzBYlx/4vCguzPfKZEcIgwvHu0Zuw9+cPxlX39Tqlx6Diy3Z5mX+m1p7SfKntD22UbWcCJmACJmACqxLAMPpLLDH5q1bgwkzABEzABG6KADM/j2ScdMvionbD94v4CMMPMe5T+V/H/V00bDCw8tklol8rrmoYKT6UoTQYUHYmYAImYAImsAaBv6VCMIz+Gw+Sn+Lsm4AJmIAJmMCQAEZOz6CRoYKRwzK4fAYozRzx7hDxuSGFEXVXMHB+VfiYo6xe3WOJHWcCJmACJmACDQT+ndI8TDv2TcAETMAETGCMQDSAMHI6Ayimx1jaKb5ktLCMrltiF9MT1kurvCyP680Exfp4FwmDiXqfanulrXNK81k8eFc+s1kYT2FfcWOzTzGbPRMwARMwARO4J+B3jNwTTMAETMAE5hIYGhzB+KEQGSMfa2P2KDn2h+lLYU+VrzOWtI8hxAcevtY+s03EYTzlaTCKflA8H394rI207PMBB9LamYAJmIAJmEAzARtGzaic0ARMwAS2TUBGx50IYJh0ho/CmKHBCHmtDfeRwnJDiFkgjJzgFMcyOoyYvAzChrNQzP78c1DWTsf5rBLL8VJd1JHKeKbw9H6Tgu1MwARMwARMYJqAl9JNM3IKEzABEzCBPwl8ot1vZXgwW8P/E7G0jRkjvhhHWPeRBe3vFMbX65jJIRzDiv88+h9tlJHCev9xpDjcp9qoKzmMp262iEDlH763lP4TKTeeUn77JmACJmACJjBKwIbRKB5HmoAJmIAJ5ARkjGDc5AZLii6FhTjlCQZLShj9sfTM/rCl2SCyYHz9qLII30U52GWfGatu9kjH72jL84Z0/jEBEzABEzCBMQJeSjdGx3EmYAImYAInJyCjBuOLLbho+KQZI2aSdgrD+PnPfYrwUYbcEPo8htszARMwARMwgWYCnjFqRuWEJmACJmACJyTAjBLL8PgAwxv2tfFVOpbdBcNJ/nfaWL4X3i2K+zoMafHtTMAETMAETKCZgA2jZlROaAImYAImcCoCMnJ4n6j3TtGwbqXJl+iNph3m9bEJmIAJmIAJDAl4Kd2QiI9NwARMwARMwARMwARMwAQ2R8CG0eaa3AqbgAmYgAmYgAmYgAmYgAkMCWAY/SUGJn+YxscmYAImYAImYAImYAImYAImcIsE/paUwjD6bzxIfoqzbwImMCCgdxreGQT50ARMwARMwASaCHgMacLkRCZwagL/ThV6KV0iYd8EJghoQOPrV/xfip0JmIAJmIAJLCHAZ+YZS+xMwAQukIC/SneBjWKRLo+ABrKPJdXb8r9qkU7p+M8V/oiSGaZ3tX2vMH81SyDMRhDsTMAENkmAcUDbe9qea/tmkxCstAlcMAHPGF1w41i0yyCgwQsD54X8OX8aiSH0gzYMKfKF/1m5DI3OLoXZnL0JLIAJmMC5CMRx4R/yGVvsTMAELoiADaMjN4YufB9rY9bg6pzkPsp0/yUxadTxSzXe1zMb8P0sPe3PH1La3RMwG/cEEzCBrRNgTGFsWdVdyvjaMrZeiqyrNsANFdbShjekbqeKl9J1KMo76hgsieJPBFlKxbT3jwr7QX5w2udf2bnx5R/Y8z8b3On4ucJ/k/9bSJz9KIxymUnAp1xunHl69Fgbjn9838t3H9X2e2gdyv+Vtq+19fRqq72cSmVVmZBD8bCESXKPFNa0fC1lGPrKD9dPtfGELr8p31G2tikdP1WaWQyUPm87Br9PhnINj5WHdBij72v/l2H8rRybzfKW3EofWUrIfPbJ1Zgo/Ohj0L40xwu5Nj0l7zfa/qONsX6VB2cqZ3R8PR79/ZIly+jYuoasKmMrY2ZRT+l/1HN4qg33W/02Qh7chhrH00Idg/dCftJ2p31urHOjiE5J/P8QJ79zOuZm/CP5xfdKYvj3SoPhRLlcHPG5geam+uClVyqLug+tg2VPnJQHO5UzxYQPGzxROgaMsOmYJWzkW+SUlzIZLCijVk5VR+XHIM6NHB22O+XnqSBtW+wHg5LCrJTSXrxRFPUaiD/v8FbZzKMwO/XV9JHZmq2T4ab5LDzvikxU1hrjwzqtNihlK3pKbcYWHtqNuhYeSjM6vo5WcLzI4ti6oqzFvn08dQ4vuaUtC7UU9VRZpziHi21YkPFmgmwYtTXlR0rWu7FVhwzLzOTXnvZgTITOPFLFXrkx7e/ymTlZwx1URzzxMFZqRsUcGaeYPFU93cuo2sfwfC3/bk4leVrl/UUbM05V40bxtG1Nxxq/vJrivspFX/oHMoT+Ukz4ZyBGWK+f/Rl1cXsH9c8bZ3PMxrqmPnJMDrWyb53PkvNujEnt+rbmGFRrq7HwrejJ9Z42mHItPKbG16k6Vo/Xdb42tq4l61jfXl2flQpsacthVWN6HvUcHmnDoYw3c/zwZjQ5riLcoIcZIXUSOjX7L7U/dsPOjXZvFqkgIuU+K4STr5uZKsTPCVqjjnBxW0GmKpPI9Sf5GBBva+NCwCxdb+mbwo7lajp+oApHDVzJyEWeGwn6Q1j6pzCWWDJb9Zn25QXDrLckUOEYmy+0/aqN/afaXmkLTvG0HWV8qP2wFE8+de3kz/kQBFlGncpLsqDHh9ro3wfPXKmMU7JBhy9VJzOv7P+fNpYlVo1ixc9ysVza7OicECyrr7mPxHw85ZtcvknaOS6TZ09/xR2tv6rsvX6E3Jk818pn9T47xWTQ3muMD4Mi/zyULMfsE+maVWz7P6UIe0fTs6Jja7siO7Kt4arjK4VLzuI5NLfikr6x/No1pzS2LpJVdY+2+QLZ5qq/lz6Tae+auJe4MSAr86x9OxO31IZZ9G3tPrgtddbXRh2UG1Mcn9hkSdbP2n7X/h2BJac4jKdqPHliGk5yOlxwhGlj6Rt1HXxTs2IdLCVseap1r0jhN8oyxoTBARYYhFwMckNUh0d3NR1poze12qUXsvLeGUbPa23cNO90zA35W9nGJ7s7p3DKpS/xfhOzZOhOXwv9IcbzSVfK5QMepMchZ/GJk9JgFFDmEvcvZXoV63upfY4Pcirr1GxYkhLYqG76GgbR2qxOyWlRH5Hu9KPRmy2lWdpXivqrPGSd1V+Vvsmp7Fo/ugU+zX22BVZsh+p1JS9DaTk3YNg8BilPc7+JshyrT4y2/an0HNGxtV0ZW4rXqFyHqf3Ylne1dIovnkO19LXwmr4KH7vm9MbWpbLGuqt9e6FsQVXlbe7XBTbFa2IhXVPQlJ55IUo76xw+QM9eG+Yy3OL+w1tUamWd0g0GN+rMHHATy81v7+m/jnNHZ63eTMeElMuF7Lk6awwKN3LPdFy9wKWEjX5THfHkYslXMEYKZSPPoRfvKSbvRr2pKyyn0/Er7SPTqrMjKq/kajo+VuJie0g++gPviKUbC27E/14qvBDG0zsM4N5sho7TLA318p4VM2fUEWSQzyfAmdEpOd5Le1SKGAtTeczSsWQx1Y1MzHyxFXUfK4845Ts5G1WL8Z6/m0f/6fHVcXKzWUmnU3Na1EekIOc9RvqYW1V/VbSkv47JF+Im+tHV85GSc/rsJC8lmGKSl9E0PuQZtD+n3xylT0R5LkXPoo6SsbVdw7V2wHjJYXV8nTiH5tZV03fsmsMYkt8/LJV1qs2XyJb0n9OvU57dMcYEFT6lZ1e/duaew4v0VD3DNsxluLn9hzenUUEhdd73FExnm3IswRneSHGB4wY23ZxjQGDM8IQhhQ3L5eZ06oYylTtmYO1Uxxqyj9YhWTm5eKJUcz0jb6FMLUyG9bOkjnzBLaw3ZZ/yezpOJY7xPBXsZvYkH22ejIupInp5lZg2SAbWTmWFfij/qcK7ZZU6pj9wcSu54WBcSlMKw/jMjWKWDyJD6MPyMXLygY3oDxQ+lIOlFOkdsZ5+sayjspFMMETWzqne4fmc4pawmuK05Fwd49SLk+BjfSTXG8N52DZJ7+SvrX/qapLySwAAEaRJREFUK9X+qrYwn8H5HNs0b7td6rPyDz7vYvnddSU1fvSbxqBCnqm+FbJkelT7BAmvWc+ajlKr9Vr0WGnDuQML3EIej5S1V04o7P6ndx1R+aQL12LtzzonlT4fl/J+O3bNGY6ti2SVzD09dHzu6yF0p8aESzuHl1z30XPYhoTdrHsozejoNO7NKq6TmYsAHWKJ4+TLbxop46U2DKPae0Yw5eQfc5RbM6y6fCvIPlqHyv9MlaEfxh9Ltrqb8E6I+5vi7gZzoUxVJioPVr9n9aXdHqOF9aaypnxu/Dsds8ScF7W2JLyUJ8u+vxv1HeYNF6wYt5N/F3PCoDO+tP9EcZ2hq32Wd+Ioj9mlbrBSHMcMWCz9DHnk9z5NrmPyoXs+w0B9XT9QmmH/3ymM5YNj59RQPxU57VQm+YZ5a2wY1IO+KZ/8/CbwLq9RcVVWpFM8D09ghu70R2bsQhnykWmK05LrzFBXVRNkIXwYV+NAH+naXfscc21iGRMyBaf9qv6KG+0rip/UP1ZT7a9RlrE+E4voeUMGSZeT8qFSyX9Q/4haNfdZ1TfrvFP6OUwQh7YaHR9IpHIX9xvyy1X7BJEq/xr0rLY9Osg1t+t98u6XNmOM6dxcHjFjdXxVfPEcIp/qWnLNIittOnnNIaHccGydLavknNO3m2RTmWP9mvb8QBtL4BkL7rSxPL7rq1GmqTGhS6/8wSlfdeyMZQ7bq3bdp7zJc1hlHqTnvdR7bRiDb8rj3iG01wPt0LB08Mfa7DIC6lCcHLj8ZmuncG4yOVFeEDl0iudiA9eiUzxxdP5eucXECwNb64i67OQzW9bdDA+qRd6xGaVB8v1DlT3GJF2AuoxKj8HG8q6jMeoqu9+p6chFvNaWezpJ3smZSaWh77AFp2P6GRc4dOWpWO7e6IBtp3TIQZ3B6ZgLHksQuYGnTz6WPzTUWBsc3m9SHPUMz3Pq3SkuyCOfOgh7RvgB7hRskDmwkU8f6pz0gE3Xd+LxFCuMRljR13lQ0LWRjk/KKdbd1a/jsT4i8e4NdKVDzkfxOMhMpMIP7Sut+tMeoU1UZ6+/IscCV+xHKhs2p+azRv9A5qY+O5fVHCaxbegn3TlSqk/pDu03FLtqnziTnmNtj45L25Xr8fCaTXmznJjsnSdZAXtxSj85TmX5a7tBbpVVvOZkmbgOdPcPS2RVHviyBafjY18PWRHB6odX2vjbFfa7+oMQRxgT5uiptHB9pK16DivN1Pnboifq9tqQgBt09ONg7D+8QeVWUUkdihvz9HQTo6GbHdI+T1dx4YtjOi49deO9ED6m0Lvo6bha7n2Rh//OqUNpObGGJ/xQCDjsPfkYJmo4LjJRPi5yDDywQRZkIm03M6LjRU5lcEIjO52e9mBA6GZQtJ9cTUcGFWZdSo6ZFZZWUgcOuV+GvemflJeXSblxoA891farysvbA9mfKizc+MtPS9UUHPSinJ3CYZjP+hDG+0jfKzw92YPBcBkMepMusccw4MlYLoOCZruk3zHZwOyFZMX4Q17OU9qXQZj+k597cKyyUtyO9NqCQTXIS/Q5OCWGU33kmeSjHwa9tc8DDvSg7yY3qr/yTvWVVv3H+muSZY6fGJT6UYo7Oh8Epk9oO7R/zOmzcziltJNMpMOcMejQfoNca/cJyjy1nmNtjzxL25WvrubnKWUtdci4d8+hwhKr0jm0tK6Wa04qm2sHfSB3S2RNehz9fBfHNM52Y6bCaOPctV4T8zwt+5N6zjiHp87fFj2RudSGLbpcZRobRpVmU8fjprx4Y644bjxqsyupRG7Q6JS9k2ms3JTxUH9mHZz44YZa+Z5rSydKEEPH3Ozv5Oc3mSFuwU+RSSyfwWGtAaITLcrda4MuMu5M6PhKyTAu9lwse3jB30tXClBenvJUn/SkPBPpaJs3MW24gCv9cDkky6lSPVzchiwwuDD6p/pzrKbNU3n0l3OyGQo6yUoy0z/DAxDtcwP8nXwMLtzJOanu1j4yvB6V2nJSf+k41lea9G+VORBt+FF51X7UWpfSrcJH5RzcP1plbkBTTNJSvtJUx7ZCoYf2m12LTIV6R4NaylxTT5U11va7FnkqCnHdXnSdLJSHjKV7juo5VCijKUj6tpxTcKH/4A/vH2bLqjJOdj1UXTz05jzpxkwdD++Pmq6JTUCzRC16RtmK96dZUeyOnr8qZ1JPpam14aCq2zl8cDuqXJYmsXPzVa/0lOayBPxTmmCMSM7wJPTP4G4vXcC6gKU7F8ykqqNkTnyYkbk0h5HDjMnHUTBmex4PhAwzcbF9nyR9sjTolQynLHhydzjQTWY4c4JRVuLCU3RmXPiARFj2If8uk3kpp6yIs+6O6h8lG+sr167/FPxRPhfUP0593o1yaeg3U9xr8RejZ0Pb13QYDVe54d5Afsv1d5JHLOfS7jmKY+sFyDrVr/nvQO6JWGHBig32Xw8adOk1cbItB/UccriGnsU2PESoS8/71hdffEHjMjXJ+vtTNtils1lFPjGlU3XL8FYp9ESFxIsBU94tF+5mqXIm2qf/8W7MqnW0CqN6ueCN6hjT9F68bC3/nOkkNwMvswAsk8J4Yq1093QyxnMzzFMxuwqBLXCKOhb7yhb0rzR9U/CW+Yz1myZ4G04kdixx/ll+b5XGoUhU3kXcc0iOlrH1ImSdy1y6Mbbe/NjZ0oZz2V1q+qgrbfqWDaMTtJJAL/4/mBOIV63imHIfs+yqQoWIVjmUjidHvMNyNQ8PJCtG51NtzIDQB1um3pXUbmsE3Fe21uLr6Ot+s4yjuB31xlrln/2eo1WG1nTLSDvXIQS21DbSFUPehtEhHcZ5t0WAC4Q0ZpmVZ1e21fTW1gRMwARWJaBx5OoetK0KwIWZwIURyA2jBxcmm8UxgYskoJOG902YMeJdFDsTMAETMAETmE0gjiFXtfpgtpLOYAJXTMBfpbvixrPopyWgAY1ldF6Odlrsrs0ETMAEboaAxhGPITfTmlbkFgncvGGki9Aft9hw1skETMAETMAETMAETMAETklA99VvnbK+U9e1BcPophvw1B3G9ZmACZiACZiACZiACZjALRLwO0a32KrWyQRMwATOREBPE/mTYb66dVYnGfw+4FlbwJWbgAmYwPURuPkZo+trEktsAiZgApdFQEYGX2V8EaVKRs8zhed/grvTcfrvkrN/1l6yfKWNz692/911WVQtjQmYgAmYwKUR8IzRpbWI5TEBEzCByyPwpQyMz+P2icR7o40/Bu+c4jCe+BPhs/xZcydIf4dP7PMnknYmYAImYAImMEnAhtEkIicwARMwgc0TeC4D40lGAWPjHYXxJ8LJEfZ1OrgEPxppT+RjtNmZgAmYgAmYwCgBL6UbxeNIEzABEzABEWA52usJEhgg1WVrisNw+l0by+8e6XjRZ4uVDwMNg+xD7TN7FZz2mR3qjlO4fGawyPNDFuZdEzABEzABE9gj4BmjPSQOMAETMAETyAnI4PhGW/4+EQbQbwr7hXTyee8ojye4c4r/VQc/yscYwsBK7yt1aVp2lJ+Zn/diOXzkgeOdfAylfEaL4OR+0s5H6cC+CZiACZiACdQI2DCqkXG4CZiACZjAHoFohHysiPezSAwj3jvac0rP8jqMqPTuER9m+PtewraAx0qGkUb9lJmMMYyi2owWaZDPzgRMwARMwARGCTwcjXWkCZiACZiACUQCMkQwMFgS935mlBDLzE0yUjjO3ac66Ja4xXxppomZHsqbcv9QPgyh8LU7+U+VIX+f6UMd/1gppGiwVdI62ARMwARMYMMEbBhtuPGtugmYgAm0EpAxglHEl+nCsrR4vJOPscKGcVRyhAeDZhipvBhIS5a5MUOUG0Ycv1R5LLMLRldWF3IX68/SeNcETMAETMAEdg/MwARMwARMwATGCMjYwLjAEOF/gTA+mOn5XFuYjYnGCGlKDkOlF6f0LbNEpbLysGDsqCyMomR8sT901M07TnYmYAImYAImMErg4WisI03ABEzABEzg/j+LMD6G/12Uf4WOpW58wns4O8MyOmaaknFEOS8PhPoslonBQ318cY4/lx3OFikozEjlchJmZwImYAImYAJ7BGwY7SFxgAmYgAmYQE5ARs1f8+PKPrNAGCDMJHUuGkqrGiYqE0OILbl8P4XtlA4jDH9orHVpvGMCJmACJmACicCDtGPfBEzABEzABJYSkPHBV+f4f6I0M7S0qDXzJWNtzTJdlgmYgAmYwI0SsGF0ow1rtUzABEzg1ARkFDEzxBfkwkzNqevP65MMLK3jT189W5SD8b4JmIAJmECVgA2jKhpHmIAJmIAJzCUgQ6S3lG5u/hXTfydZ0n8nrVisizIBEzABE7hVAjaMbrVlrZcJmIAJnImADJK7M1XdVXsJMnTCeMcETMAETOAqCNgwuopmspAmYAImYAImYAImYAImYALHJGDD6Jh0XbYJmIAJmIAJmIAJmIAJmMBVEPDnuq+imSykCZiACVwPAS1j4w9gv9X2jjbe9Vn1c93XQ8KSmoAJmIAJXBMBG0bX1FqW1QRMwASugIAMIf5o9X35f8j/8QpEtogmYAImYAImsPNSOncCEzABEzCB1QnIKHoSC/WX4Van6wJNwARMwASOQcCG0TGoukwTMAETMIGPhOA3GUhn/0Kdm8IETMAETMAEWgjYMGqh5DQmYAImYAJzCTBj5NmiudSc3gRMwARM4GwE/I7R2dC7YhMwARO4DQKaFeIjC19q+03b79owiPgAw0tte07pSUs63LvaPvfMUmDhHxMwARMwgTMSsGF0Rviu2gRMwASunYAMGmaGvtfGxxYwjHby0wcX9maMYhyGEB9oIC35MZT85TqA2JmACZiACZyNgA2js6F3xSZgAiZw3QRk1DySBhhFGDrBKIoasf+LwnrvF+mYmaUn8oNRFNN+Lp8yqk7pMZw+04bxleet5nGECZiACZiACcwlYMNoLjGnNwETMAETSAQwWB7JWPkmBUSfWaAfBmHdodIzo4Qx9E/t85GGKfe1Enxmo2gKk+NNwARMwAQOIeCPLxxCz3lNwARMYNsEPpX6veVyMl6YRWJmKC2n6wgpjpmkr7RhOGHs/KowjKsp97ES9OqZyuB4EzABEzABE5hLwDNGc4k5vQmYgAmYwC4aQBhBQwMIY4n4oiGjcJbOsfQO44h9ZoJeauuW3Wmfcl9o+1Ub+0+1vdLWOaVhaR2OjzdgXGE8hX3F5cv6FGxnAiZgAiZgAtMEPGM0zcgpTMAETMAE6gSGRghL49KHFT6WkcLs0U7+l9owdILTfnEZncIxhH7W9rX2WaKHgcUX7jpDS+EYRT/IZ/bpsTbSsv+BNtLamYAJmIAJmMBsAjaMZiNzBhMwARMwARkizPBgrATDByIKY9YGw+Q1x3IfKSwZTmn53H2MfmP6b+RTVnLM/mA0pXwhXMf5RxfusngMqTRr9Uzh1XebUgX2TcAETMAETKBEwEvpSlQcZgImYAIm0ELgEyX6VsYIMzhva2O5GzNGzA4RxntEyT3TzhOFP5ePMYPDwBl+pvtThVNuchhU3WwRgcqTf+yB+FCGwnPjiaR2JmACJmACJtBMwIZRMyonNAETMAETyAnIEGGmJzdiUvReWDRaRg0XpcFgYstnizC0foxxO/nUGZz2mZ3qZo90/I62PG9Mac8ETMAETMAEpgl4Kd00I6cwARMwARM4AYFo9AwNnzRjxEzSLho//4ni8FGG3BDiYw52JmACJmACJrCIgGeMFmFzJhMwARMwgSMRYLaJr9bxAYY37GvDAOLT3hhNzBB9p42leuHdorivw5AW384ETMAETMAEZhOwYTQbmTOYgAmYgAkci4CMHN4n6r1TNKxLafL3kkbTDvP62ARMwARMwARqBLyUrkbG4SZgAiZgAiZgAiZgAiZgApshkM8YsUxhqDj/E7H3Eu0wkY9NwARMwARMwARMwARMwARM4JIJyK7h//S6v5kYyophxIur+bKEPE3+Umse7n0TMAETMAETMAETMAETMAETuCYC/Fde1f0/zAqgP06ZYyAAAAAASUVORK5CYII=", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) - \\left(\\beta - 1\\right) \\left(P dv_{dy} \\gamma - v \\left(c du_{dy} \\rho - dP_{dy}\\right)\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\beta - 1\\right) \\left(P dv_{dy} \\gamma - v \\left(c du_{dy} \\rho - dP_{dy}\\right)\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) - \\left(\\beta - 1\\right) \\left(P dv_{dy} \\gamma - v \\left(c du_{dy} \\rho - dP_{dy}\\right)\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 \\left(c - u\\right)}\\\\ds_{dx}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{- K \\left(P - P_{t}\\right) - \\left(\\beta - 1\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho - c du_{dy} \\rho v - c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right) + \\left(c - u\\right) \\left(2 c^{2} drho_{dx} + c du_{dx} \\rho - dP_{dx}\\right)}{2 c^{2} \\left(c - u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\beta - 1\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho - c du_{dy} \\rho v - c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 c \\rho \\left(c - u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{- K \\left(P - P_{t}\\right) - \\left(\\beta - 1\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho - c du_{dy} \\rho v - c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right) + \\left(c - u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)}{2 \\left(c - u\\right)}\\\\ds_{dx}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ ⎛ 2 \n", - "⎢-K⋅(P - Pₜ) - (β - 1)⋅(P⋅dv_dy⋅γ - v⋅(c⋅du_dy⋅ρ - dP_dy)) + (c - u)⋅⎝2⋅c ⋅drh\n", + "⎡ ⎛ 2 2 \n", + "⎢-K⋅(P - Pₜ) - (β - 1)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ - c⋅du_dy⋅ρ⋅v - c⋅du_dz⋅ρ⋅w + \n", "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅c ⋅(c - u) \n", + "⎢ 2 \n", + "⎢ 2⋅c ⋅(c - u) \n", "⎢ \n", - "⎢ K⋅(P - Pₜ) + (β - 1)⋅(P⋅dv_dy⋅γ - v⋅(c⋅du_dy⋅ρ - dP_dy)) + (c - u)⋅(c\n", + "⎢ ⎛ 2 2 \n", + "⎢ K⋅(P - Pₜ) + (β - 1)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ - c⋅du_dy⋅ρ⋅v - c⋅du_dz\n", "⎢ ─────────────────────────────────────────────────────────────────────\n", - "⎢ 2⋅c⋅ρ⋅(c - u) \n", + "⎢ 2⋅c⋅ρ⋅(c - u) \n", "⎢ \n", - "⎢ dv_dx \n", + "⎢ dv_dx \n", "⎢ \n", - "⎢ dw_dx \n", + "⎢ dw_dx \n", "⎢ \n", - "⎢ -K⋅(P - Pₜ) - (β - 1)⋅(P⋅dv_dy⋅γ - v⋅(c⋅du_dy⋅ρ - dP_dy)) + (c - u)⋅(c\n", + "⎢ ⎛ 2 2 \n", + "⎢ -K⋅(P - Pₜ) - (β - 1)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ - c⋅du_dy⋅ρ⋅v - c⋅du_dz\n", "⎢ ──────────────────────────────────────────────────────────────────────\n", - "⎢ 2⋅(c - u) \n", + "⎢ 2⋅(c - u) \n", "⎢ \n", - "⎣ ds_dx \n", + "⎣ ds_dx \n", "\n", - " ⎞⎤\n", - "o_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", - "─────────────────────────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - "⋅du_dx⋅ρ + dP_dx) ⎥\n", - "───────────────── ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - "⋅du_dx⋅ρ + dP_dx) ⎥\n", - "───────────────── ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎦" + " ⎞ ⎛ 2 ⎞⎤\n", + "dP_dy⋅v + dP_dz⋅w⎠ + (c - u)⋅⎝2⋅c ⋅drho_dx + c⋅du_dx⋅ρ - dP_dx⎠⎥\n", + "───────────────────────────────────────────────────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞ ⎥\n", + "⋅ρ⋅w + dP_dy⋅v + dP_dz⋅w⎠ + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "─────────────────────────────────────────────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞ ⎥\n", + "⋅ρ⋅w + dP_dy⋅v + dP_dz⋅w⎠ + (c - u)⋅(c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "─────────────────────────────────────────────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, "execution_count": 18, @@ -356,11 +750,19 @@ "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(-K*(P - P_t) - (beta - 1)*(P*dv_dy*gamma - v*(c*du_dy*rho - dP_dy)) + (c - u)*(2*std::pow(c, 2)*drho_dx + c*du_dx*rho - dP_dx))/(std::pow(c, 2)*(c - u));\n", - "dQ_dx[1] = (1.0/2.0)*(K*(P - P_t) + (beta - 1)*(P*dv_dy*gamma - v*(c*du_dy*rho - dP_dy)) + (c - u)*(c*du_dx*rho + dP_dx))/(c*rho*(c - u));\n", + "x0 = std::pow(c, 2);\n", + "x1 = c - u;\n", + "x2 = c*rho;\n", + "x3 = du_dx*x2;\n", + "x4 = rho*x0;\n", + "x5 = K*(P - P_t) + (beta - 1)*(dP_dy*v + dP_dz*w - du_dy*v*x2 - du_dz*w*x2 + dv_dy*x4 + dw_dz*x4);\n", + "x6 = (1.0/2.0)/x1;\n", + "x7 = dP_dx + x3;\n", + "dQ_dx[0] = x6*(x1*(-dP_dx + 2*drho_dx*x0 + x3) - x5)/x0;\n", + "dQ_dx[1] = x6*(x1*x7 + x5)/(c*rho);\n", "dQ_dx[2] = dv_dx;\n", "dQ_dx[3] = dw_dx;\n", - "dQ_dx[4] = (1.0/2.0)*(-K*(P - P_t) - (beta - 1)*(P*dv_dy*gamma - v*(c*du_dy*rho - dP_dy)) + (c - u)*(c*du_dx*rho + dP_dx))/(c - u);\n", + "dQ_dx[4] = x6*(x1*x7 - x5);\n", "dQ_dx[5] = ds_dx;\n" ] } @@ -375,10 +777,14 @@ "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", - "T_phi = v * (dp_dy - rho * c * du_dy) + gamma * p * dv_dy\n", + "T_phi = simplify(T_1[0] + T_2[0])\n", "L_outflow_x1_upper = Matrix([K*(p - p_t) - (1 - beta)*T_phi, L[1], L[2], L[3], L[4], L[5]])\n", "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", - "print(cxxcode(dQ_dx_outflow_x1_upper, assign_to='dQ_dx'))" + "\n", + "common_exprs, final_expr = cse(dQ_dx_outflow_x1_upper, list=False)\n", + "for var, val in common_exprs:\n", + " print(cxxcode(val, assign_to=var))\n", + "print(cxxcode(final_expr, assign_to='dQ_dx'))" ] }, { @@ -390,7 +796,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": {}, "outputs": [ { @@ -424,7 +830,7 @@ "⎣ Lₓ ⎦" ] }, - "execution_count": 25, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } @@ -458,7 +864,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -525,7 +931,7 @@ " ⎦" ] }, - "execution_count": 26, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -537,7 +943,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -583,7 +989,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": {}, "outputs": [ { @@ -617,7 +1023,7 @@ "⎣ Lₓ ⎦" ] }, - "execution_count": 29, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -629,7 +1035,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": {}, "outputs": [ { @@ -656,7 +1062,7 @@ "⎣ 0 0 0 0 0 0⎦" ] }, - "execution_count": 31, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -674,41 +1080,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{3}}\\\\\\frac{L_{x} c \\left(c du_{dx} \\rho - dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2} \\rho}\\\\0\\\\0\\\\\\frac{L_{x} c \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c^{2} \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c}\\\\0\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2}}\\\\\\frac{L_{x} \\left(c du_{dx} \\rho - dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c \\rho}\\\\0\\\\0\\\\\\frac{L_{x} \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x}}\\\\0\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 2 ⎛ 2 ⎞⎤\n", - "⎢Lₓ⋅c⋅(-c⋅du_dx⋅ρ + dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", - "⎢───────────────────────────────────────────────⎥\n", - "⎢ 3 ⎥\n", - "⎢ 2⋅Lₓ⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎛ 2 ⎞ ⎥\n", - "⎢Lₓ⋅c⋅(c⋅du_dx⋅ρ - dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠ ⎥\n", - "⎢────────────────────────────────────────────── ⎥\n", - "⎢ 2 ⎥\n", - "⎢ 2⋅Lₓ⋅c ⋅ρ ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎛ 2 ⎞⎥\n", - "⎢Lₓ⋅c⋅(-c⋅du_dx⋅ρ + dP_dx) + c ⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", - "⎢───────────────────────────────────────────────⎥\n", - "⎢ 2⋅Lₓ⋅c ⎥\n", - "⎢ ⎥\n", - "⎣ 0 ⎦" + "⎡ ⎛ 2 ⎞⎤\n", + "⎢Lₓ⋅(-c⋅du_dx⋅ρ + dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", + "⎢────────────────────────────────────────────⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅Lₓ⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢Lₓ⋅(c⋅du_dx⋅ρ - dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠ ⎥\n", + "⎢─────────────────────────────────────────── ⎥\n", + "⎢ 2⋅Lₓ⋅c⋅ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞⎥\n", + "⎢Lₓ⋅(-c⋅du_dx⋅ρ + dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", + "⎢────────────────────────────────────────────⎥\n", + "⎢ 2⋅Lₓ ⎥\n", + "⎢ ⎥\n", + "⎣ 0 ⎦" ] }, - "execution_count": 32, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -720,18 +1125,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(L_x*c*(-c*du_dx*rho + dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 3));\n", - "dQ_dx[1] = (1.0/2.0)*(L_x*c*(c*du_dx*rho - dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 2)*rho);\n", + "dQ_dx[0] = (1.0/2.0)*(L_x*(-c*du_dx*rho + dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 2));\n", + "dQ_dx[1] = (1.0/2.0)*(L_x*(c*du_dx*rho - dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c*rho);\n", "dQ_dx[2] = 0;\n", "dQ_dx[3] = 0;\n", - "dQ_dx[4] = (1.0/2.0)*(L_x*c*(-c*du_dx*rho + dP_dx) + std::pow(c, 2)*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c);\n", + "dQ_dx[4] = (1.0/2.0)*(L_x*(-c*du_dx*rho + dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/L_x;\n", "dQ_dx[5] = 0;\n" ] } diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp index b1a923534..46e6ab3f7 100644 --- a/src/NSCBC_outflow.hpp +++ b/src/NSCBC_outflow.hpp @@ -24,6 +24,7 @@ template AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray::nvar_> const &Q, quokka::valarray::nvar_> const &dQ_dx_data, quokka::valarray::nvar_> const &dQ_dy_data, + quokka::valarray::nvar_> const &dQ_dz_data, const amrex::Real P_t, const amrex::Real L_x) -> quokka::valarray::nvar_> { @@ -35,6 +36,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const amrex::Real w = Q[3]; const amrex::Real P = Q[4]; + // normal derivatives const amrex::Real drho_dx = dQ_dx_data[0]; const amrex::Real du_dx = dQ_dx_data[1]; const amrex::Real dv_dx = dQ_dx_data[2]; @@ -42,31 +44,39 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const amrex::Real dP_dx = dQ_dx_data[4]; const amrex::Real dEint_aux_dx = dQ_dx_data[5]; + // x2 transverse derivatives const amrex::Real du_dy = dQ_dy_data[1]; const amrex::Real dv_dy = dQ_dy_data[2]; const amrex::Real dP_dy = dQ_dy_data[4]; + // x3 transverse derivatives + const amrex::Real du_dz = dQ_dz_data[1]; + const amrex::Real dw_dz = dQ_dz_data[3]; + const amrex::Real dP_dz = dQ_dz_data[4]; + const amrex::Real c = quokka::EOS::ComputeSoundSpeed(rho, P); - const amrex::Real gamma = quokka::EOS_Traits::gamma; const amrex::Real M = std::sqrt(u * u + v * v + w * w) / c; - const amrex::Real K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posed Euler equations - - const amrex::Real beta = M; // TODO(bwibking): average over boundary + const amrex::Real beta = M; + const amrex::Real K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posedness + + // see SymPy notebook for derivation of dQ_dx + // (common subexpressions) + const amrex::Real x0 = std::pow(c, 2); + const amrex::Real x1 = c - u; + const amrex::Real x2 = c * rho; + const amrex::Real x3 = du_dx * x2; + const amrex::Real x4 = rho * x0; + const amrex::Real x5 = K * (P - P_t) + (beta - 1) * (dP_dy * v + dP_dz * w - du_dy * v * x2 - du_dz * w * x2 + dv_dy * x4 + dw_dz * x4); + const amrex::Real x6 = (1.0 / 2.0) / x1; + const amrex::Real x7 = dP_dx + x3; - // see SymPy notebook for derivation quokka::valarray::nvar_> dQ_dx{}; - dQ_dx[0] = (1.0 / 2.0) * - (-K * (P - P_t) - (beta - 1) * (P * dv_dy * gamma - v * (c * du_dy * rho - dP_dy)) + - (c - u) * (2 * std::pow(c, 2) * drho_dx + c * du_dx * rho - dP_dx)) / - (std::pow(c, 2) * (c - u)); - dQ_dx[1] = (1.0 / 2.0) * (K * (P - P_t) + (beta - 1) * (P * dv_dy * gamma - v * (c * du_dy * rho - dP_dy)) + (c - u) * (c * du_dx * rho + dP_dx)) / - (c * rho * (c - u)); + dQ_dx[0] = x6 * (x1 * (-dP_dx + 2 * drho_dx * x0 + x3) - x5) / x0; + dQ_dx[1] = x6 * (x1 * x7 + x5) / (c * rho); dQ_dx[2] = dv_dx; dQ_dx[3] = dw_dx; - dQ_dx[4] = - (1.0 / 2.0) * (-K * (P - P_t) - (beta - 1) * (P * dv_dy * gamma - v * (c * du_dy * rho - dP_dy)) + (c - u) * (c * du_dx * rho + dP_dx)) / (c - u); + dQ_dx[4] = x6 * (x1 * x7 - x5); dQ_dx[5] = dEint_aux_dx; - for (int i = 0; i < HydroSystem::nscalars_; ++i) { dQ_dx[6 + i] = dQ_dx_data[6 + i]; } @@ -85,7 +95,6 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowX1Upper(const amrex::IntVect const auto &domain_hi = box.hiVect3d(); const int ihi = domain_hi[0]; const Real dx = geom.CellSize(0); - const Real dy = geom.CellSize(1); const Real Lx = geom.prob_domain.length(0); constexpr int N = HydroSystem::nvar_; @@ -96,12 +105,31 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowX1Upper(const amrex::IntVect quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); // compute two-sided dQ/dy from the data - quokka::valarray const Q_jp1 = HydroSystem::ComputePrimVars(consVar, ihi, j + 1, k); - quokka::valarray const Q_jm1 = HydroSystem::ComputePrimVars(consVar, ihi, j - 1, k); - quokka::valarray const dQ_dy_data = (Q_jp1 - Q_jm1) / (2.0 * dy); + quokka::valarray Q_jp1{}; + quokka::valarray Q_jm1{}; + quokka::valarray dQ_dy_data{}; + + if constexpr (AMREX_SPACEDIM >= 2) { + const Real dy = geom.CellSize(1); + Q_jp1 = HydroSystem::ComputePrimVars(consVar, ihi, j + 1, k); + Q_jm1 = HydroSystem::ComputePrimVars(consVar, ihi, j - 1, k); + dQ_dy_data = (Q_jp1 - Q_jm1) / (2.0 * dy); + } + + // compute two-sided dQ/dz from the data + quokka::valarray Q_kp1{}; + quokka::valarray Q_km1{}; + quokka::valarray dQ_dz_data{}; + + if constexpr (AMREX_SPACEDIM == 3) { + const Real dz = geom.CellSize(2); + Q_kp1 = HydroSystem::ComputePrimVars(consVar, ihi, j, k + 1); + Q_km1 = HydroSystem::ComputePrimVars(consVar, ihi, j, k - 1); + dQ_dz_data = (Q_kp1 - Q_km1) / (2.0 * dz); + } // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = detail::dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, dQ_dy_data, P_outflow, Lx); + quokka::valarray const dQ_dx = detail::dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, dQ_dy_data, dQ_dz_data, P_outflow, Lx); // compute centered ghost values quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; From a63ab19dfdc918e3d175952398b87bd0bc7a755c Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 28 Aug 2023 15:27:42 -0400 Subject: [PATCH 54/64] add permutations --- src/NSCBC/channel.cpp | 2 +- src/NSCBC/vortex.cpp | 2 +- src/NSCBC_outflow.hpp | 255 ++++++++++++++++++++++++++++++++++-------- 3 files changed, 213 insertions(+), 46 deletions(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index ec7a5cfb6..aeed5d5a7 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -118,7 +118,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBounda if (i < ilo) { NSCBC::setInflowX1Lower(iv, consVar, geom, ::Tgas0, ::u_inflow, ::v_inflow, ::w_inflow, ::s_inflow); } else if (i > ihi) { - NSCBC::setOutflowX1Upper(iv, consVar, geom, P_outflow); + NSCBC::setOutflowBoundary(iv, consVar, geom, P_outflow); } } diff --git a/src/NSCBC/vortex.cpp b/src/NSCBC/vortex.cpp index 1f0db29d9..113860341 100644 --- a/src/NSCBC/vortex.cpp +++ b/src/NSCBC/vortex.cpp @@ -133,7 +133,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundar if (i < ilo) { NSCBC::setInflowX1Lower(iv, consVar, geom, ::T_ref, ::u_inflow, ::v_inflow, ::w_inflow, ::s_inflow); } else if (i > ihi) { - NSCBC::setOutflowX1Upper(iv, consVar, geom, ::P_ref); + NSCBC::setOutflowBoundary(iv, consVar, geom, ::P_ref); } } diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp index 46e6ab3f7..c8c4f589b 100644 --- a/src/NSCBC_outflow.hpp +++ b/src/NSCBC_outflow.hpp @@ -11,6 +11,7 @@ #include "AMReX_GpuQualifiers.H" #include "AMReX_REAL.H" +#include "ArrayView_3d.hpp" #include "EOS.hpp" #include "hydro_system.hpp" #include "physics_numVars.hpp" @@ -18,17 +19,17 @@ namespace NSCBC { +enum class BoundarySide { Lower, Upper }; namespace detail { -template -AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray::nvar_> const &Q, - quokka::valarray::nvar_> const &dQ_dx_data, - quokka::valarray::nvar_> const &dQ_dy_data, - quokka::valarray::nvar_> const &dQ_dz_data, - const amrex::Real P_t, const amrex::Real L_x) - -> quokka::valarray::nvar_> +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow(quokka::valarray::nvar_> const &Q, + quokka::valarray::nvar_> const &dQ_dx_data, + quokka::valarray::nvar_> const &dQ_dy_data, + quokka::valarray::nvar_> const &dQ_dz_data, const amrex::Real P_t, + const amrex::Real L_x) -> quokka::valarray::nvar_> { - // return dQ/dx corresponding to subsonic outflow on the x1 upper boundary + // return dQ/dx corresponding to subsonic outflow at the (SIDE) boundary const amrex::Real rho = Q[0]; const amrex::Real u = Q[1]; @@ -60,9 +61,14 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray const amrex::Real K = 0.25 * c * (1 - M * M) / L_x; // must be non-zero for well-posedness // see SymPy notebook for derivation of dQ_dx - // (common subexpressions) + + amrex::Real x1{}; // depends on SIDE + if (SIDE == BoundarySide::Upper) { + x1 = c - u; // wavespeed of reflected wave going back into the box + } else if (SIDE == BoundarySide::Lower) { + x1 = c + u; // wavespeed of reflected wave going back into the box + } const amrex::Real x0 = std::pow(c, 2); - const amrex::Real x1 = c - u; const amrex::Real x2 = c * rho; const amrex::Real x3 = du_dx * x2; const amrex::Real x4 = rho * x0; @@ -83,69 +89,230 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow_x1_upper(quokka::valarray return dQ_dx; } -} // namespace detail -template -AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowX1Upper(const amrex::IntVect &iv, amrex::Array4 const &consVar, amrex::GeometryData const &geom, - const amrex::Real P_outflow) +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_xdir_dQ_data(const amrex::IntVect &iv, amrex::Array4 const &consVar, + amrex::GeometryData const &geom) + -> std::tuple::nvar_>, quokka::valarray::nvar_>> { - // x1 upper boundary -- subsonic outflow auto [i, j, k] = iv.dim3(); amrex::Box const &box = geom.Domain(); - const auto &domain_hi = box.hiVect3d(); - const int ihi = domain_hi[0]; - const Real dx = geom.CellSize(0); - const Real Lx = geom.prob_domain.length(0); constexpr int N = HydroSystem::nvar_; + const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); + const int ibr = boundary_idx[0]; + const int im1 = (SIDE == BoundarySide::Lower) ? ibr + 1 : ibr - 1; + const int im2 = (SIDE == BoundarySide::Lower) ? ibr + 2 : ibr - 2; - // compute one-sided dQ/dx from the data - quokka::valarray const Q_i = HydroSystem::ComputePrimVars(consVar, ihi, j, k); - quokka::valarray const Q_im1 = HydroSystem::ComputePrimVars(consVar, ihi - 1, j, k); - quokka::valarray const Q_im2 = HydroSystem::ComputePrimVars(consVar, ihi - 2, j, k); - quokka::valarray const dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); - - // compute two-sided dQ/dy from the data - quokka::valarray Q_jp1{}; - quokka::valarray Q_jm1{}; quokka::valarray dQ_dy_data{}; + quokka::valarray dQ_dz_data{}; + // dQ/dy if constexpr (AMREX_SPACEDIM >= 2) { - const Real dy = geom.CellSize(1); - Q_jp1 = HydroSystem::ComputePrimVars(consVar, ihi, j + 1, k); - Q_jm1 = HydroSystem::ComputePrimVars(consVar, ihi, j - 1, k); - dQ_dy_data = (Q_jp1 - Q_jm1) / (2.0 * dy); + quokka::valarray const Qp = HydroSystem::ComputePrimVars(consVar, ibr, j + 1, k); + quokka::valarray const Qm = HydroSystem::ComputePrimVars(consVar, ibr, j - 1, k); + dQ_dy_data = (Qp - Qm) / (2.0 * geom.CellSize(1)); + } + // dQ/dz + if constexpr (AMREX_SPACEDIM == 3) { + quokka::valarray const Qp = HydroSystem::ComputePrimVars(consVar, ibr, j, k + 1); + quokka::valarray const Qm = HydroSystem::ComputePrimVars(consVar, ibr, j, k - 1); + dQ_dy_data = (Qp - Qm) / (2.0 * geom.CellSize(2)); } - // compute two-sided dQ/dz from the data - quokka::valarray Q_kp1{}; - quokka::valarray Q_km1{}; + return std::make_tuple(dQ_dy_data, dQ_dz_data); +} + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_ydir_dQ_data(const amrex::IntVect &iv, amrex::Array4 const &consVar, + amrex::GeometryData const &geom) + -> std::tuple::nvar_>, quokka::valarray::nvar_>> +{ + auto [i, j, k] = iv.dim3(); + amrex::Box const &box = geom.Domain(); + constexpr int N = HydroSystem::nvar_; + const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); + const int jbr = boundary_idx[1]; + const int jm1 = (SIDE == BoundarySide::Lower) ? jbr + 1 : jbr - 1; + const int jm2 = (SIDE == BoundarySide::Lower) ? jbr + 2 : jbr - 2; + quokka::valarray dQ_dz_data{}; + quokka::valarray dQ_dx_data{}; + // dQ/dz if constexpr (AMREX_SPACEDIM == 3) { - const Real dz = geom.CellSize(2); - Q_kp1 = HydroSystem::ComputePrimVars(consVar, ihi, j, k + 1); - Q_km1 = HydroSystem::ComputePrimVars(consVar, ihi, j, k - 1); - dQ_dz_data = (Q_kp1 - Q_km1) / (2.0 * dz); + quokka::valarray const Qp = HydroSystem::ComputePrimVars(consVar, i, jbr, k + 1); + quokka::valarray const Qm = HydroSystem::ComputePrimVars(consVar, i, jbr, k - 1); + dQ_dz_data = (Qp - Qm) / (2.0 * geom.CellSize(2)); + } + // dQ/dx + { + quokka::valarray const Qp = HydroSystem::ComputePrimVars(consVar, i + 1, jbr, k); + quokka::valarray const Qm = HydroSystem::ComputePrimVars(consVar, i - 1, jbr, k); + dQ_dx_data = (Qp - Qm) / (2.0 * geom.CellSize(0)); + } + return std::make_tuple(dQ_dz_data, dQ_dx_data); +} + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_zdir_dQ_data(const amrex::IntVect &iv, amrex::Array4 const &consVar, + amrex::GeometryData const &geom) + -> std::tuple::nvar_>, quokka::valarray::nvar_>> +{ + auto [i, j, k] = iv.dim3(); + amrex::Box const &box = geom.Domain(); + constexpr int N = HydroSystem::nvar_; + const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); + const int kbr = boundary_idx[1]; + const int km1 = (SIDE == BoundarySide::Lower) ? kbr + 1 : kbr - 1; + const int km2 = (SIDE == BoundarySide::Lower) ? kbr + 2 : kbr - 2; + + quokka::valarray dQ_dx_data{}; + quokka::valarray dQ_dy_data{}; + + // dQ/dx + { + quokka::valarray const Qp = HydroSystem::ComputePrimVars(consVar, i + 1, j, kbr); + quokka::valarray const Qm = HydroSystem::ComputePrimVars(consVar, i - 1, j, kbr); + dQ_dx_data = (Qp - Qm) / (2.0 * geom.CellSize(0)); + } + // dQ/dy + { + quokka::valarray const Qp = HydroSystem::ComputePrimVars(consVar, i, j + 1, kbr); + quokka::valarray const Qm = HydroSystem::ComputePrimVars(consVar, i, j - 1, kbr); + dQ_dy_data = (Qp - Qm) / (2.0 * geom.CellSize(1)); + } + return std::make_tuple(dQ_dx_data, dQ_dy_data); +} + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto permute_vel(quokka::valarray::nvar_> const &Q) + -> quokka::valarray::nvar_> +{ + // with normal direction DIR, permutes the velocity components so that + // u, v, w are the normal and transverse components, respectively. + const amrex::Real u = Q[1]; + const amrex::Real v = Q[2]; + const amrex::Real w = Q[3]; + + quokka::valarray::nvar_> newPrim{}; + if constexpr (DIR == FluxDir::X1) { + newPrim = {Q[0], u, v, w, Q[4], Q[5]}; + } else if constexpr (DIR == FluxDir::X2) { + newPrim = {Q[0], v, w, u, Q[4], Q[5]}; + } else if constexpr (DIR == FluxDir::X3) { + newPrim = {Q[0], w, u, v, Q[4], Q[5]}; + } + + // copy passive scalars + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + newPrim[6 + i] = Q[6 + i]; + } + return newPrim; +} + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto unpermute_vel(quokka::valarray::nvar_> const &Q) + -> quokka::valarray::nvar_> +{ + // with normal direction DIR, un-permutes the velocity components so that + // u, v, w are the normal and transverse components *prior to calling permute_vel*. + const amrex::Real v1 = Q[1]; + const amrex::Real v2 = Q[2]; + const amrex::Real v3 = Q[3]; + + quokka::valarray::nvar_> newPrim{}; + if constexpr (DIR == FluxDir::X1) { + newPrim = {Q[0], v1, v2, v3, Q[4], Q[5]}; + } else if constexpr (DIR == FluxDir::X2) { + newPrim = {Q[0], v3, v1, v2, Q[4], Q[5]}; + } else if constexpr (DIR == FluxDir::X3) { + newPrim = {Q[0], v2, v3, v1, Q[4], Q[5]}; + } + + // copy passive scalars + for (int i = 0; i < HydroSystem::nscalars_; ++i) { + newPrim[6 + i] = Q[6 + i]; } + return newPrim; +} +} // namespace detail + +template +AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowBoundary(const amrex::IntVect &iv, amrex::Array4 const &consVar, + amrex::GeometryData const &geom, const amrex::Real P_outflow) +{ + // subsonic outflow on the DIR SIDE boundary + + auto [i, j, k] = iv.dim3(); + std::array idx{i, j, k}; + amrex::Box const &box = geom.Domain(); + constexpr int N = HydroSystem::nvar_; + + const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); + const int ibr = boundary_idx[static_cast(DIR)]; + const int im1 = (SIDE == BoundarySide::Lower) ? ibr + 1 : ibr - 1; + const int im2 = (SIDE == BoundarySide::Lower) ? ibr + 2 : ibr - 2; + const Real dx = geom.CellSize(static_cast(DIR)); + + // compute one-sided dQ/dx_n from the data + quokka::valarray Q_i{}; + quokka::valarray Q_im1{}; + quokka::valarray Q_im2{}; + + if constexpr (DIR == FluxDir::X1) { + Q_i = HydroSystem::ComputePrimVars(consVar, ibr, j, k); + Q_im1 = HydroSystem::ComputePrimVars(consVar, im1, j, k); + Q_im2 = HydroSystem::ComputePrimVars(consVar, im2, j, k); + } else if constexpr (DIR == FluxDir::X2) { + Q_i = HydroSystem::ComputePrimVars(consVar, i, ibr, k); + Q_im1 = HydroSystem::ComputePrimVars(consVar, i, im1, k); + Q_im2 = HydroSystem::ComputePrimVars(consVar, i, im2, k); + } else if constexpr (DIR == FluxDir::X3) { + Q_i = HydroSystem::ComputePrimVars(consVar, i, j, ibr); + Q_im1 = HydroSystem::ComputePrimVars(consVar, i, j, im1); + Q_im2 = HydroSystem::ComputePrimVars(consVar, i, j, im2); + } + + quokka::valarray dQ_dx_data = (Q_im2 - 4.0 * Q_im1 + 3.0 * Q_i) / (2.0 * dx); + dQ_dx_data *= (SIDE == BoundarySide::Lower) ? -1.0 : 1.0; // compute dQ/dx with modified characteristics - quokka::valarray const dQ_dx = detail::dQ_dx_outflow_x1_upper(Q_i, dQ_dx_data, dQ_dy_data, dQ_dz_data, P_outflow, Lx); + quokka::valarray dQ_dt1_data{}; + quokka::valarray dQ_dt2_data{}; + if constexpr (DIR == FluxDir::X1) { + auto [dQ_dt1_data, dQ_dt2_data] = detail::transverse_xdir_dQ_data(iv, consVar, geom); + } else if constexpr (DIR == FluxDir::X2) { + auto [dQ_dt1_data, dQ_dt2_data] = detail::transverse_ydir_dQ_data(iv, consVar, geom); + } else if constexpr (DIR == FluxDir::X3) { + auto [dQ_dt1_data, dQ_dt2_data] = detail::transverse_zdir_dQ_data(iv, consVar, geom); + } + + const Real Lbox = geom.prob_domain.length(static_cast(DIR)); + quokka::valarray dQ_dx = detail::unpermute_vel(detail::dQ_dx_outflow( + detail::permute_vel(Q_i), detail::permute_vel(dQ_dx_data), detail::permute_vel(dQ_dt1_data), + detail::permute_vel(dQ_dt2_data), P_outflow, Lbox)); // compute centered ghost values + dQ_dx *= (SIDE == BoundarySide::Lower) ? -1.0 : 1.0; quokka::valarray const Q_ip1 = Q_im1 + 2.0 * dx * dQ_dx; quokka::valarray const Q_ip2 = -2.0 * Q_im1 - 3.0 * Q_i + 6.0 * Q_ip1 - 6.0 * dx * dQ_dx; quokka::valarray const Q_ip3 = 3.0 * Q_im1 + 10.0 * Q_i - 18.0 * Q_ip1 + 6.0 * Q_ip2 + 12.0 * dx * dQ_dx; quokka::valarray const Q_ip4 = -2.0 * Q_im1 - 13.0 * Q_i + 24.0 * Q_ip1 - 12.0 * Q_ip2 + 4.0 * Q_ip3 - 12.0 * dx * dQ_dx; // set cell values + const int ip1 = (SIDE == BoundarySide::Lower) ? ibr - 1 : ibr + 1; + const int ip2 = (SIDE == BoundarySide::Lower) ? ibr - 2 : ibr + 2; + const int ip3 = (SIDE == BoundarySide::Lower) ? ibr - 3 : ibr + 3; + const int ip4 = (SIDE == BoundarySide::Lower) ? ibr - 4 : ibr + 4; + quokka::valarray consCell{}; - if (i == ihi + 1) { + if (idx[static_cast(DIR)] == ip1) { consCell = HydroSystem::ComputeConsVars(Q_ip1); - } else if (i == ihi + 2) { + } else if (idx[static_cast(DIR)] == ip2) { consCell = HydroSystem::ComputeConsVars(Q_ip2); - } else if (i == ihi + 3) { + } else if (idx[static_cast(DIR)] == ip3) { consCell = HydroSystem::ComputeConsVars(Q_ip3); - } else if (i == ihi + 4) { + } else if (idx[static_cast(DIR)] == ip4) { consCell = HydroSystem::ComputeConsVars(Q_ip4); } From 2abfb4bf9c729de27a741fa2dda8f07e50b3fa3e Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 28 Aug 2023 16:39:47 -0400 Subject: [PATCH 55/64] fix dependent type shadow --- src/NSCBC/dQ_dx_inflow.ipynb | 597 ++++++++++++++++++ .../{dQ_dx.ipynb => dQ_dx_outflow.ipynb} | 503 +++++---------- src/NSCBC_outflow.hpp | 52 +- 3 files changed, 782 insertions(+), 370 deletions(-) create mode 100644 src/NSCBC/dQ_dx_inflow.ipynb rename src/NSCBC/{dQ_dx.ipynb => dQ_dx_outflow.ipynb} (65%) diff --git a/src/NSCBC/dQ_dx_inflow.ipynb b/src/NSCBC/dQ_dx_inflow.ipynb new file mode 100644 index 000000000..b59660f44 --- /dev/null +++ b/src/NSCBC/dQ_dx_inflow.ipynb @@ -0,0 +1,597 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from sympy import *\n", + "init_printing(use_unicode=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Primitive variable system" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# \\partial_t q + F \\partial_x q + G \\partial_y q + H \\partial_z q = 0\n", + "\n", + "rho = Symbol('rho', positive=True) # density\n", + "p = Symbol('P', positive=True) # pressure\n", + "u = Symbol('u') # normal velocity\n", + "v = Symbol('v') # transverse velocity\n", + "w = Symbol('w') # transverse velocity\n", + "s = Symbol('s') # passive scalar\n", + "c = Symbol('c') # sound speed\n", + "\n", + "F = Matrix([\n", + "[u, rho, 0, 0, 0, 0],\n", + "[0, u , 0, 0, 1/rho, 0],\n", + "[0, 0, u, 0, 0, 0],\n", + "[0, 0, 0, u, 0, 0],\n", + "[0, rho*c*c, 0, 0, u, 0],\n", + "[0, 0, 0, 0, 0, u]])" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOcAAACWCAYAAAAlip9EAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAQtElEQVR4Ae1d243dRhIdLebbkC1gAxhloJEjWCkD2Y7AVgYW9kv+E6wMvI5gbWUgbQSSlYEdwAJrCI5gz+GwLjic5r0k+1Es3tMAp8nuZlfVqa5+3WbNvZcvXz66uLj4DVcqvPnhhx++SmUoTQgIgTwEYFu/o4arVC3Iu3c5yHiNexYehj+GD7oXAkKgKAI/Jmp7irRnTB8a50+wVhljAi0lCYEaCMDe/jWuF2lMumOc43LZzyBkPcP/UNlDXD+qA8iGdXUFnvrwpE3AQJ/Lt19xXeP+E9NahBy5/1aLQTDFdex7xC9wccr8Atdb3Cfn2LX4UL03CHjqw4s26N7H9Suun4DCz7iatr1cuasYJ5j6DkAQmDc3TaPrudhb8ZlAKTREwFMfzrQ/gf5XuJ4D7n83hPyihNxVjBMgcIf3YwKM90h7AsbvJ/KUVA8BT3140q6H6Omas+WuZZxPwPufCf5tw4n5Cu0Q8NSHJ+12CN+llC335d0681Jmjopf5FHZ5tuQnRtg3Pxi4DT+A9LuzCCQRsWxZ2WZK1xcl1vHhcdyAfXOmaVU0Ycn7XIILq+plNzFjROimKLZ8KbCnAYz9e7m0qEMGthbXDSybp2NmGtrGiB/tzoEpNOAuR7nOugCMQ2Vm2ef87lC8NSHJ+0KUM6usojctaa1p6R4cKpAsHwaJk9THTbA8Pw1LqYfAvL5+9UzxJ1h9hkfENNYaaRewVMfnrS98Cbdk3LXGDlTa00DwXoUm/pZulsMo+Ao/h9cS0Zz7gB201XEHCE5cr7CdQhIT42E3M7nT0rDwHcZltC/eWPeX099eNKeh06dUkXkLm6caJTcvqbIqcZmaVXWV2twJr9473rNu/07HCHf9fVMVoN8joyU/5dRIaYzdMZ+c1vuL/nCxQoN+2HlllZFH560h0K2vi8ld61p7TsAYiPCEBsbOZkfPkAJbNy8bk1fJwTrttapuFH+N3j+A+lVDKSn5akPT9ojqJs+Zstdyzh5TOpxAgqOUB8TDTRRdPtJAznGBtcxj3wbFfnMe64vDwH5j/DAi4ZbM3jqw5N2TUxP1Z0tdxXjRKPjgd4/EXcHeCkF7jnCcAr4LZ93FCjrHeOCvNyV7dYeveycSdjMwfCgAp8jv8qUFnV3AfW76cOTtsnfx7YBc9DBKL/oYwm5L4tydLsyjpI86P4lYm4AMf4Hnqs2RNBoGiAPjYty0hjtkzt2RK+QZiOqjaD8qeX7nkF+CHDYWOrTakae+nCjDbzZATKYDnjWlksInvO+81VIV7Lcnyy57w0+tn7YM12ONdXUIQBcuaP7GDGVpSAEJhFAG+G5dH6+ea/KtHaS8vlmsNfexSbY+aqwveQyzsqYowfkFJfrzfeVSan6nSEg46yvUNu11shZH+tdUZBx1lcnfz55ihHUNofqUxSFXSBQc7d2FwDlCtEbpUbNXCDP8H2NnGeodIkcAwEZZww9icszRGAz09p+V/OfvQ6u+vhbrdXOsFVK5A6BzRgnuOEpm8N3jrjnD/f8CJknaRSEwNkhsKVp7XcwSP5Yb4HH4a6QxoPhCkLg7BDY0sjJUfPWVxtb1wY6DnYgDDw7vHmn2Z78etKmgkCfnTzP2YZxKr0Z4wR440PINFZ+57jJg/Lgi1NuHm5/g/gCMU8C/YaYv2nW/DaT5BYH8OTGrxdt0KVO6H2CXwfxMIjtZeC2fsiVe0vT2gNaEIq9HD832+RBcfAXymm2J7/OtOkFQk6lD5aVeQMw2btxuth0+rGQbX6/mRrReX72CWRgj72l4MmvJ21PHWTLvamRszdMfvPYHXfjc5/mCXKKNjeuOFUaB5vODje2xmU8nj359aTtgbXRzJb70mpqFcPYOCpyA4WB5007x8u9EfLnExqn7dBy3Tn2VockvwDe5oyKX/hxeJuyJ7+etG+j0PaplNzNjBMMc7pKR1hTjpe5YcGGz/gQ8N7ht89Dou+NGR47lqkwx4Cn3i2d7smvJ+3SOC6pr4jczYwTktEwU46XX1FqGGHKzyuzIoYHwZj25NeTtqeaTspN4/ys59DiOwzDcDgStHK8fIf+xhJSa01j0XpMm7Zbumfsya8n7aiY/90YnzVywjg5hbu2l1bEsxwvr6i3+SvEAhfppqaulmYbQ835GxP05NeT9hiHls+l5OZu7V894xYXlQOMssHymuN4uSjtipVlOwyuyFuqak9+PWmnsGiVtlbu/xqD1X9KYS/SE7PYaHcx8p/cSojxwGNg5n5kyDFnF1t0mu3JryftoW5a32fLXd04e0ROOl5ujVwOPXQobk6a1/Dtya8n7RFWtgFj+wKj7LKPJeSetebMZRuMznG8nEum9fscJSM5zfbk14022h5HMAabocmp9A0e+isEhMASBNCZyKn0EsBUVgh4INBqzekhm2gKgdAIyDhDq0/M7xkBGeeetSvZQiMg4wytPjG/ZwRknHvWrmQLjQCNk+dA+VnWsUPKoYUU80IgEAI89td9JknjvMLFj5ybnJwAHQUhIASmEeBhCdrjhaa10yApRwi4IiDjdIVfxIXANAJVz9biKFIop8vTMKVzIsoHnh9BGp43berd0BOrqLSrjZwAhL6A3iOmz6DXuKejrre45xo3fIgkH3i9j4sHvrmWoZPlpjrwxCoy7SrGCUBCOV1e2lNEkw/8hnauvFQ/Vt5TTyVoVzFOgJPtUNcA3mi8d/lKwu6JVWjatYyT28Gp303Nt459W1eyEbSsa+/ylcTSE6vQtIsbJ4Zz+gs6FcL+prp3+U4pbkm+J1Z7oF3cOKE8M7ykz6BeuXMMeEk7aFl27/KVxNITq/C0axjnHOWaP5c5ZSOW2bt8JXXiidWmadM4P+uRtjgX+NRa0+q03mxLTpeNt7nx3uWbi8Occp5YRaV9cCpN4/yrR9niOaBPlsFc36azqamrpdnG0GQ9W83Yu3wlcffEKjDt6n5r1zrULdk2ata1d/lKYueJVWjatdac2Q51S7aOCnXtXb6SkHliFZp2FePElCKU0+WlLTG4fLYJYuv/peIvKu+JVXTal4uQXlb4GsUjOV1eJt3NP3YKIx8aKkcRBv4wzxDGufINu6v/erbDLNr3Xr58+Qhi85D6Qygw7EbNatXpRSGwIQRgg3IqvSF9iBUhkESgypozSUmJQkAILEJAxrkILhUWAu0QkHG2w1qUhMAiBGSci+BSYSHQDgEZZzusRUkILEKAximn0osgU2EhUBUBHjmUU+mqEKtyIbAOAR4SkVPpddjpLSHQBgGtOdvgLCpCYDECNc/WXuAokpxKL1ZJvRe89QH6PCrKM75yaD1DzdVGTihCTqVnKKBVES99gK4cWq90rF7FOKEQOZVuZXUz6HjqA7Tl0LrXEbHA7Rtc3YbPKdVVMU4Q9XTme0rmEvnR5IvGbwkdsQ5PubNp1zJObgenHCzZJ2n2TWEpJbSuJ5p80fgtpU9PubNpFzdODN3mxOsYwE2+wj/GwNq8aPJF43etXsbvecpdinZx4wRIZnicX0+FOQY89a53ejT5ovFbSr+echehXcM454BrfmzmlI1YJpp80fgt1SY85T5Jm8b5WS+pxbmCp9aaVqf1KHIqbYjUj/eujykEPeXOoS2n0lMaPZWO9YRN11NTc0uzja9T1VXPj8ZvKUA85c6kLafSmY3A01nxGtaj8btGxtQ7nnJn06615vR05ptSUum0aPJF47eUvjzlzqZdxTgxrMupdKnmVaCeDenDNkFs76GAdNNVeMpdgvbltGjZOdeoIYzT5RXSRpPPjV80VI4iDPxhnkEOrW9wOPpXTqWPwqNMIdAWAXRkcirdFnJREwLLEaiy5lzOht4QAkJgjICMc4yInoXARhCQcW5EEWJDCIwRkHGOEdGzENgIAjLOjShCbAiBMQI0TjmVHqOiZyHghwCP/cmptB/+oiwEJhHgQQ05lZ6ERxlCYAMIaM25ASWIBSGQQqDm2doLHEXatVPpFKBbTvPUhydt6gT0HyHiGd8wDq2rjZwAY9dOpanwSMFTH160QTe0Q+sqxglQdu1UOpJRkldPfTjTDu3Quopxoj1kO9SNZgAb59dTH560PdWSLXct4+R2cMrJkfnWse/6PME7J9qe+vCk7anjbLkvS3OPaYw5uTpWdZMv4Y8xsCYPsnGDyzwH0tHXB6R9HNeFNCqGPSfLXOF6gTTrmPDYLoCumz48abdD+C6lUnIXN06waobHhjkV5jSYqXebpwNsGthbXDQy/iOaC8T8oZgG+JTPFpBOA+ZGRHfKAzENlZtjn1uZxrGnPjxpN4b5Frkictea1t7iNPFgvmQSWZtMomG+gaF1htlz+DViph8C8p/h4ZkZZp/xATGNlUa61eCpD0/anvo4KXeNkTO11jQQrEexqaGlbzaGUXGE5Mj5asgk0lMj4c8o82JYDvd8l8FrtuCpD0/aN6j7/C0id/GRE43WprOpxmhpLuuvlXriCPluIFeyGuRzZKR8v4wK2Ij5cZTe5HHAt2E/pGtpVfThSXsoZOv7UnIXN84eiGyHuq0BTdEDyGy8vG5NX1NlkdZtnQ8UY8W+wc0fSK9iAEbkROypD0/aJ2Cpmp0tdy3jzHaoWxW2mZUPDO1T6hXk26jIbN5zfXkIyH+EB140XM/gqQ9P2qExr2KcaJR7cipNWe4YF2Tkrmy3tsA9R9crXLamvujT2DCf495lSgvaXQB9N3140jb5+9g2YA46GuUXfSwh92VRjm5Xdo3H8E6lATKNi3LQGH/vRaQxvkKajag2gvKnlu/7Mg8Rf4VnV8PseWHkqQ832sCfHSSD6SiMQ2s5lb5RXNZfNADu6D5GzEaoIARWI4A2JKfSq9FLv8hemRsACkKgGAJV1pzFuAtQEXo6W2++D8CuWAyEgIwzX1mP+yo0cuZjqRoGCMg4B2CsvOXPJ08xgtrm0Mpq9JoQuI1Azd3a25R2+tQbpUbNnerXUyyNnJ7oi7YQOIKAjPMIOMoSAp4IyDg90RdtIXAEARnnEXCUJQQ8EZBxeqIv2kLgCAJVd2uxk8nzqAz8uJpnTXlG1fPTKfJSLESTz5Pfc6XNxgbZ+WUSz/gucmhdbeQEQ/Sb8x4xD4O/xj09BLzF/RXi8CGafJ78niNtyJzt0LqKcYKxXTuVjiafJ79nTDvboXUV48Sw2HkFSAyPPH/6BArjedTIIZp8nvyeK+3s9l3LOPmVRvch8ohDW28yP3KIJp8nv+dKO7t9FzfOmaNik6/Rs9FJVBBNPk9+z5V2otmsSipunODCDO/YQfDI09po8nnye660Vxnj+KUaxjmmkXp+kErcUVo0+Tz5PVfaJ5t7DeNMrTWNEetJwziVNsYHcTT5PPk9V9qD5rL+trhxYp1h09nU1NXSbGNoPedOb0aTz5Pfc6VdqmkWN86esWyHuqUErFRPNPk8+T1X2tlNr5Zx8qiSue8YMnmNh4+DHnWYF+k+mnye/J4r7ez2XMU4YXxuToyzEZlRQTT5PPk9V9qjZmSbXrbnMspOP16mk4ukcpQM71T6CBLR5PPk9yxpo2PirIGBBzEYFjm0llPpG9D0VwhsAgEYtJxKb0ITYkIIHEGgyprzCD1lCQEhMBMBGedMoFRMCLRGQMbZGnHREwIzEZBxzgRKxYRAawSGP6X8jp2iMf03SOPHsgpCQAgURgC2xf/3ejVVLY2T51yfTxQIewZ2Qh4lC4EtIWAO8JI8/R+r53RWtVJV8QAAAABJRU5ErkJggg==", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}0 & - c \\rho & 0 & 0 & 1 & 0\\\\- c^{2} & 0 & 0 & 0 & 1 & 0\\\\0 & 0 & 1 & 0 & 0 & 0\\\\0 & 0 & 0 & 1 & 0 & 0\\\\0 & c \\rho & 0 & 0 & 1 & 0\\\\0 & 0 & 0 & 0 & 0 & 1\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 0 -c⋅ρ 0 0 1 0⎤\n", + "⎢ ⎥\n", + "⎢ 2 ⎥\n", + "⎢-c 0 0 0 1 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 c⋅ρ 0 0 1 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 1⎦" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the eigenvector matrix S\n", + "c = Symbol('c')\n", + "rho = Symbol('rho')\n", + "lambda_list = [eval for (eval, n, es) in F.left_eigenvects()]\n", + "Sinv_list = [[ev for ev in es] for (v, n, es) in F.left_eigenvects()]\n", + "Sinv = Matrix([Sinv_list[1][0], Sinv_list[0][2], Sinv_list[0][0], Sinv_list[0][1], Sinv_list[2][0], Sinv_list[0][3]])\n", + "Sinv" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- c + u & 0 & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & 0 & 0\\\\0 & 0 & u & 0 & 0 & 0\\\\0 & 0 & 0 & u & 0 & 0\\\\0 & 0 & 0 & 0 & c + u & 0\\\\0 & 0 & 0 & 0 & 0 & u\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡-c + u 0 0 0 0 0⎤\n", + "⎢ ⎥\n", + "⎢ 0 u 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 u 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 u 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 c + u 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 u⎦" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute eigenvalue matrix \\lambda\n", + "lambda_waves = diag(lambda_list[1], lambda_list[0], lambda_list[0], lambda_list[0], lambda_list[2], lambda_list[0])\n", + "lambda_waves" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{1}{2 c^{2}} & - \\frac{1}{c^{2}} & 0 & 0 & \\frac{1}{2 c^{2}} & 0\\\\- \\frac{1}{2 c \\rho} & 0 & 0 & 0 & \\frac{1}{2 c \\rho} & 0\\\\0 & 0 & 1 & 0 & 0 & 0\\\\0 & 0 & 0 & 1 & 0 & 0\\\\\\frac{1}{2} & 0 & 0 & 0 & \\frac{1}{2} & 0\\\\0 & 0 & 0 & 0 & 0 & 1\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 1 -1 1 ⎤\n", + "⎢──── ─── 0 0 ──── 0⎥\n", + "⎢ 2 2 2 ⎥\n", + "⎢2⋅c c 2⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ -1 1 ⎥\n", + "⎢───── 0 0 0 ───── 0⎥\n", + "⎢2⋅c⋅ρ 2⋅c⋅ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 1 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 1 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1/2 0 0 0 1/2 0⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 1⎦" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute S\n", + "S = Sinv.inv()\n", + "S" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAOQAAACWCAYAAADOvSRHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2dXdLdNNLHD6lcU0yo4p7MDjJhBQM7GMgKCDvIVK7gLjWzA8gKwrADhhXwsQNm7qfqDU+xgbz/n45ayD6yLduyj58n3VU+kvXRav3VrS/bOu98+eWXj06n08+6SvTdV1999WkpwsMcAUdgPgKyp1+V62Epp+LeuZdF/FP+L3rX11l8x6vMRaadRAe/aVGHFjwODpOLNxOBCZ34h9j17ew7K+K+eeR+LUb/ye4HvUr3TJGkrUo/yOj6EQ9Vl7/pojOaTXcIh9l19wyjCAzqlXTmm35OhRH0N35yg+R+kpSZjO/LXaTEkwXsmEB1+LeuR7qe6roAakwUpW+KA3KovJe6mHl8q3t6UacJBKZwUzyDxye6Po6s/i33Jvrfk/tA10+6/q60Fh6jlznis1iv3snWkH8Wo9ERT/FU4Ae5f1km6jFzqT6sof8qt6pBtsRBvN9Ilk/lpmnMMVE7llRTuMX4X+Re6K7CvldtHuv6UP4qHaipvXhV6ZXSPRU/ZqidNWRNGcx/B9eVNQwOmoY6Ubda2gQHNUjei9fK8tanm8JN8cw+oFdn5+KX9mewwTBa0ly9OuWbOjWCfKbKzZra1TC9dppYJ+pGo9TQVjgwtfqP5GjWS9dU5g6kmcJtqqOzDcr3W2KxQK/qDVLMWTONTmlbVuYKvKjbZ1PlbowDisMax2keAlO4YbAntd0vA2xDvOKGRtCBbFXBVXplnO6bp8JF6EllUaWZzv1f5EdP/9MIEDFZG0fl2LTjz+L4s+47o7nu/6Xwz+WWRiDqRh07eXTfpyY4SAZ6ZbCiwcCL8plavdAVSGnW1MfYrHYlBwrP82hwQ242QK7SOdfgJvn6NGiw4gfmxFOnIYPt85tzX6tXgeccg2TRO7h+jECxOKZiYUNCLulpSOuB5N2UnqtMymc0Z8cyGZfCWB/wiGPoRQce2NIwU7QaB8lAOXQOf5E/KLZcsIPyTm9Nfc7cVv5KLjqN9+SGXV+5yM5mxZ9Wsp6dPZZdg1virTy2fjR8Q5zC6VioE7qy5SZarV4FueYYJL3165Cr/EOFebMn3x1kCph6/HK2NqER+B8jNzqAvqyEjfWApLe1RGRTdFbhIDnJj1L1RxkMk11ARqFTg/rAZhVJBpSVTowZhxGPCDDQj3XlnYfFb+KqrCrcCoVbJ/uReNC5GGEo3yvs7xawkVurV6H4OQb5QDmCsvQFV6UYCVHmjvEpfLQXVTwg/6ALt5bozUqGxWaIhZc6AhqmI1+vQAyiRo61ONiIk0bvKAfy5Z3Z2voEtsKE8ngWx2hs+IS4ih9mGX2FtU5rECuV07JdTcxa3Cy9uWF2JpmGZkaW7sJdiZ3xq9WrkH6OQVoBJRcD4GHoTSlyKCymv3guNJR+LNzKlotioxBJ4RWGEhE21qMPGpry1VINDiFNzlDyIRsypmlVg/pYEXSWz8RvljEqveH4rTGKLuHQIL8oe5N2PRcVfqtwy9KbF3kHZbVEA+4i7Hq8ZunVvV7msdvXikRxOiTwCeNKytRJsP8NPWH/0QFTr5NkHWsY6kAdp2gxDiNYoWzIV+owltbH6kHdS3wtfsil3DSFzhI9kR98w9o3C9/MuxA38HwUhVpSf7IuxS7HolavQp77ec4JPw1g05WUVJW+0cX9TQrMPIrbda2hopGxb3hMW0KjSB42d3g1rS8vPVmNki3GQfxZf0H9ctL6VnKhBBiCpZlVH+VDAZ7rYo2EHwN6pSuR0jyLN6wNmQpSZvBn5TKydBRZcSg4V+vRTyyryDCxxGO4kYY6QFWDRUPszqWef2v1KqS+l+ec8KPkHw2kYXpIj9ohVZDGrhl1OvlW3nQaLSrRY/E0I+UVwb4xUiRKZmm4H6LFOMRyUXKMLJDCMAaU3Iz1E4Xldcj9J8WRtlgfxWGA7IDyGhZtQlmkT4alcIyRzTfeRUZZSIsfnqQ96R4+yEh8oBjGZtQX8tfgFHOud1Qe7TUXNwqmMzopf6o/9yVSmibYFXjX6lXIOmeEpJelQS5IlaGR/sGlSHpmiAq+UBhg7klsQryMsvB8D4UGFORDGalHiehN2QaforU40HEhH7K8rwt+9PQmH+uWnObUB/xZy/eNODcgZjQWTxvZ6MHzWUtnIws7wfloOrShlsu7lb8aN8kMhnQo1sFQR3ZUxz6IaIVdv/61enXOx8vlut7oevjmzZvT2KU0v+p6NJbmNsZRd+pWK/tRcZBcv+n62Ooh/zNd39t931XcG10X7a6wr3X93E9/l+9V3ybY5RiBra5JvVKap7qU9U39q3PR7OlFakaRfi9x9HtGIepWS4fDQb0/ox2XjX7UhZGXkYHnhsQl0j2jRxotdZ+m0QqnV5+c5iVmt9wTsWmFXY7GXL2aZ5ASnHUJH1/mjZcLcOv8sS7UKT0mmarEEXGQTDeSmyuQ7jE4M6zPCFQY9fwtJDivr3LjRXlIg2LSvvaSBcF3mlTnJtjlIIknGM7SK/Lfz5lU+pnLs5ak970LxHpjyah/RByQiXUfGzuv8et6outXUzq57DCzLgxrx+jXbXoBgM0d6K0ZIc/VDZuSa7GLrIKzSK9mfaBspakRsf7FR18Yn2u7URnZccxHimqx7goOeYVVJ0bIx3LfNoPMYVjlF3Z0eNV6pfTpA+VFBrlKWs/sCDgCHQRyg7zXifEbR8ARuCoCbpBXhd8LdwS6CCzZ1Oly2OAuDuG8L7nLOkblsG56HqvC+hga+pD5HOu/by0C0hfeblqyETiJ2eFGSFWUV8n4VGgXY4wI8ZYMO2xc7FSyQ8lOpZMjUEIAfbE3nErxi8MOZZCqZBip5G7S+4yg9FRl8szOiAf/PEMKr15ZoLuOAAhIL9iV/5dce62wGTCHMkgqqYvnN3sTHYC93L132V7eLURAxsiLJLzDzSDSjA6zhlTFWLvx/Gv3Fw4iuDmoGGj+xX4ed+FXfkbSl7qow6xTx5WXBqUj4oH8a93nx2Uo6O2mKWwVzyiFztgMh6XOTUQNbB/oorNlOWLhMXq1w+BBu7PMaUKHMUjVhrdKql9fa1L7ApOoAGEdW4guBikPX0mw7uXU8Vlri6gkfHLFmtVH6R7CU9gqni84/ikX7PmO9KJDVxht8l+5TU8mF0/0lfUk7wo3MfYjTVl5W2GWMit9UxKojHCsHzGuWQArfd5DL5GLUfaq9V8idJ4HDHTRjk1pClvF21r/1UDBjGSMlk1lU7noCJ3xZ7qa0CFGyAzQq40QkgFjZFoTeth4f5Jb+1od+fpHh1Q1kspYa8xV5eyQCKXnak1T2E7hR9tCfH/amtBZpqxNZneHMEhVBkAXKbPyraZofPSiGKT1tqwjwxcQlQVQh6WPaqYUrlKEO5tsClvrRBmtShTiFTE0gpby1IbxQf4xRkgpr00D2IiYe1J4XuGPdMPwvylJXqajnCIAUd5PCqMRWb9Rl86zR8UVH78o3Ka2jJ7wwxAx5Be6AikN93xpwd/dsUYMI7DuKZevL/IeNSicwli7PtAFnuRnF684Qis8rwv48bB6aYeg7Mcg1WES24KkgwYrfuBIPJ3tkMEWWFYHwTN8byr+q3X4fnWx5YTPJQQVRZFe6kpKpjDm63wRUrMDhTG81rUJSQYamfUZsn5HIXIZEZENYxk9P5b0RkpL47IryjozGItcW/vlBvFE4ZTHB8KUxcfA4agT+TGmgJXCqDtKA7FBYDwpg3Qd/BRvdYFXKC+GYeSTfylIIUclyV+LbaqC8hh21gYhLmJCh4pubnkyuekt7bLa4DHId3VB5p7vJn4jED/GZEwJTDDLSVitgA+UtjgSGLOVLo3F5zDBGCMvphlpRKvhr/wYD4aCoeXy4k9HJiqOxrGzhagbLxnY4wx4pI5LfpQQ4lW9nCdhpO0TdemMhuSLeVHA4jRb8Rg3jwjoSGrbRcn3IclUhW1BGsNv9snkjTC5iTLRzkvpA8uIQS6l/DldSbkBqlbhaYy+QQe5YkP9oJuScoY0hZ90GJPyMzphIB1ZFF49Kmb8UWqmJ7lBEU1dc2NH1m+JENGDYyiBlDf5Y1DouBTeNxLy5TxPShPqIrd0WFMw/Miz5JB39oHJJUZRDjOEPElQSsX360gaOqzOaJ9nlL8W21628AzyNMG7n8fuW2BS1FsrYK6LQf4eM5lbxUMAhJ5BLg2DAiYlVRgGQFg+hdPtIMErNGY/RSyHU+OWEp3F7FPVBwoLvPI4yUc9qW+aMiksGJdcU1ozzjyr+UnTNzz4cb2yRNG9KJ9wlWN424ylly3cMnWrbY9S/hSm8koGhxyUwWyg1GGk/AOei7qJzwW2hbzg1+/MCsmKQS0wMb1dY5j/M+num2eFS6/X3yGlojTQUqBWiPNH1tigNGoylj9i5/lGeKFI1LWk7CVsUsGRZ8eYYyQKz5oz4RfTDtXFDCQZdkz/XHyYOpOPDaaOgSvNM4VBTKcZoWi34Fdcf/qsqG1opG5j2J6U71GUqIT9hbCxnNaYgC10c3bW/d5blz3kRqGS4kR+TMMCSALhaQQiRhUdGt8qVkywJFDlGkjmdtgo3kawTvjETV9R01pZ/NjEAg+ji9HPIqI7pHBsiNmmD/gx6lgdzM1ZkZ63VYJsct/TPTvGrDXhQ1ugvElxFY4xsq5mNKOXJy3+x7pM0eXdleZgi2DWfpMdruq2FSZgB60ZIc8c9NvCIDsgquI0Jo1qRjp0UngSQh6mWuTZglDIi7WL5GREqAZR6TEEFDoZnMIYUajvT7ogdmzNKEjHNaYsqeMic0Yoj41m+c4pdSFPIpUHf96fzTdzqNuaA5PTSJsK2tAj2Wdhm4nCqH9S/tTRZHF971aY0MbMZqjDamoxZUUROImbCvNMDoWsOSlcyRJhvGyWcDWpmHEWv/CoIcpnO58o/IsFZWHY1JXRZerUcRqKqfyYsiAHu7Z9AlMem3ysKxma/HldwNqml/0yGHnzToiRpJNGvMIIrHCI+DDtVbh1pCFix59qbCUjmzHgG0Zy3dMp8XhpbO26FSboegdb3S+m1QYpEDCgvPFNmFKYxXVc8bBNF0bJZpWzQsQ/KbWFLXHn1JU6qQx71FEsTmk6o50lUvigYilutC6Kx8i58pkL5aCwhJ/k0maB5Eep6eHTyG7+mGQXJ8pU0pmLMKW1NXOVbEq/JSboLB1EE7rXhEsbJt+KTVFB27B/O7hExe4bnI2QjBInpWFNOnpg8kK0KDeVvZBH82xbYSK+GDodGrrbhFaPkE2kODOhl+F54+gI0LC8u8yKUYWXF9jYYZ0Mpk90zTkwWcnnkcprPruZJ8Fo6i0woYNjY6xZJ3Soc1lVMdZTr+Tuuqkw2owe6QgMICA9ZU8ibeQNJJsMFh92ydnlfudIU1YE/1wXz4mcHIFDI5AZUb5WXy3zoQxSlWToZ/eTHVsnR+CQCEg/2eHl9czBzbelgmOQWDi7VtXP5JYWVpNPlWS6ylqHjQgnR+CICLAmv9j9XSEoa++wc8ymDtbOhgqBzRan4rWYZIz5M7LFfDyjI7AFAtLPWY9dKmRg8MEGvznUlLVCcE/iCNxpBNwg73TzeuVuGwJHeg5527BbLa+mPjxUfqmLZcOs81xXF+4MDomAG+QVm0UGyXuji85zvaLYXvSGCPiUdUNwa1jLKFnQQ0d+y+Usof9ujoAb5OYQTxbA+7v9D7wnM3mCu4mAG+T125UR0kfH67fDISTwNeSOzaDpKZs3vIXEyxh8z4ghsrHzQlcgpeELAt5t5HvLzvmtiuPdSV4ab/qub1Ymn4utOV9X2Z3WIOAj5Br0ZuSV0jMS8vUFBsXFa1f2imA+Qj6PcZyiYPHyBnqgX77aaE1WJh/6dsqULHQOHE1yiJdGWlf8aPzcIHdoESkzox5fsmCI+cvI+PPzXBktMUQorC3P3vTLy/d5/hSx1CN5+mX2X6FEDnaDnXZAgCnru7Ecc3co9q0rglGH40n6rwQyaubTz6mzbkeNUfwp55muOYchT5WJjGlKLb9TewQ+MJaMkL/HG3Mtzt12CPAhaz4tPcl4GDVZUzJNDKSwMC2Uy+FZxF8YsOJyAz5n/OOX9yFPSlM9oimtlYnhdcpUHPIR1pFd905tEfifsfMpqyGxkSulRqG5kuHFojDSk+JLyj70KISNnjHCkEv8xvJYHF8v9B+/wA8Zqw3cmLm7DAGmrE77INCfbqa1mRQexWctaWkYmTpGENOEEdDEVRiG/lwXu6/42fB5pSuR0jCFhcIJdXIpy06rs/KIvyhTYcgYDFx82Nzh9b4buU4bIeAj5EbAGtuowCg1Ch9IYRgFmyk/nUMujoHAGPP0+DmYKhmQ/Bggu7Yc/cDUljLgmUZIhWOMtYchJ97Kc1JeeD3WZR1Dzfm6ZHVagYCPkCvAm5GV6WDtea4YA7uxGBo7s2GqK3//63Q2cNYchmyGZtXgo1tkhC/PSDFQzhzlL/Iw7M7Iq3unDRBwg9wA1D5LKTTTvNIX5qWwkF15pj6CZQ2a52dTJo2OMBGPfFOI+MBT4X1jJO1sGSnDqS0CPmVti+cu3GQ8TFe58mkm671wGHKMT7Lonuln5zDkFOmeQyHgBnmo5qgTJo5mjGiBosHZCMnIeVLYVochnwv1300Q8CnrJrDuwpTpKmtNNnZe49fFLuumhyGLv9OGCLhBbgjulqxliKwXO2vGfnlKk69DR9P28/r9dRDwKet1cPdSHYEiAm6QRVg80BG4DgIYJDt1TG1Yhzg5Ao7A/giwnAjLCwzyoS5eyXqgy8kRcAT2R4Ad8vBapE9Z9wffS3QEBhFwgxyExiMcgf0R8Mce+2N+0uMI3px5qYvlgh+QfIU2OGqRbpBXaBkZJO+S+gHJV8D+6EX6lPVKLSSjZCEP+QP7Mw7+KwTcIK+nBkOnAlxPIi/56gi4QV6vCRghfXS8Hv6HLNnXkDs0i6anbN7w4S8vYfDxL4bIxs4LXYGUhs+phg5IJu0XShMeHsvlxAH4sQ5NX33ofhVlMviByauQXJ7ZR8jl2FXllJIzEvJFBl9mcC05IJlzczBqI4yQe47YaEl+YHJLNBfwcoNcAFptljjiLDkguf8aI0adTq0TX0ZYdmrzD5Q7YikNR2+80cXoOkkxXX5Ic1+GdCjXJDNPsBgBDPLdmNvcxcw84wUCTCuHDkjO148cv2jnrfKBcXiNCm7RUJjO5umJ+klxgwap+MBDaTDcGhqUIWamU/BzdWqQnJ/mA8uCQf4eb8y1OHfXI4BxdQxJBoJxMd3MR7ywDlQca0Pi+2fhcPxG37A4+nGM4NUpeyyx+JsMGF5HBsUhL2HV/MbK8rgLBNJByfcvojygCQJSYhSYKxleZGxHbJSUO0wLzThiesI6aRXPNLRjoLE81pprz2jlJAI/MFkgXIMYIZ22RaA/rUxrMRkR/yrF6GOEv5++FPZE+ZKRRmNk46jFGa2U1zF23adOQWU9jeUp2Kk1AvdaM3R+ZwSktDfyYTQoeCCFMY1kdBs7IJlRNZDSM318oCvnQVh/1GWtuuaMVlu/ik23Q5AMyMturhmpH5gMShuRT1k3AjayZfq35IBkNmQwaJ5Zfhh5WFjnT1wVBzENbnVGqx+YHCC9zo8b5Ia4x1EyNxQrrRQW4pQnPPy3hNEdS8+IypVPdZlihjNayR/lwIufEa9zRqvCUt6YtlReKSzw9J92CPiUtR2WV+EUDYjRNFA0OKa1TJdtA8nPaD3Dc/hfHyEP30RVAjJ6+RmtVVAdO5Eb5LHbp0o6jYqMhmnXtZRJafKp8GjaUn4P2wcBn7Lug7OX4ghUIeAGWQWTJ3IE9kHADXIfnL0UR6AKAQySLW/WF6+rcngiR8ARaI0Aa/qwxscgH+rioTNvhDg5Ao7A/gjwmAobXH6mjnbtMORbTS3q0ILHrQbRhb9AYI1OMELOJhX4TJl44+O2Ew/MqcsiukM4LKq/ZxpEYLFezX4OKSXkBen35XIUxa0m1YEXsh/p4guG/BvEyXopfVMckEOFvtTFzMMPT55sgXOCKdwUT4fLq4RMCyHWa/ZmE68cslTjZX9erLBw3S4n8VmsV+98+eWXKAKf7vAWf3qnsSSO4qnAD3L/Uoq/rWGqD/X/q9yqBtkSB/F+I1k+lZt/gXFbod1N7incYvwvci90V2F8PcMXLR/KX6UDNRUTryq9UjoON+PTuXfmTln5zCcsPmsEWppGgn0chVzKYm4+6kTdamkTHKh3FOBOvkmzVbtO4aZ4W169Gmhg2p/BBsNoSXP1avamzmeq3Kyp3cLaAQ7XLhTrRN1qy9wKB6ZW/a/1d8Fgp0K2atcp3KY6OpYJ0Ptnp83vAr2qN0gxZ800OqVtU42rcaFu4euIMQk2xgHFuZOj4ximDeKmcMNgT2o7+8i6X2SIV+DQCNpPP+e+Sq+M4X3zVLgIPaksqjTTOT6shW50cTraEBAhUasflUMPzLRjyUG/1I06Ts0AmuAgWemVwYoGAy/KZ2r1QleglfUxNqtdyYHC80UJ7YncbIBcpXOuwU3y9WnQYMUPzImnTlvoaa1eBZnnGCSL3sH1YwSKxTEVCxsScklPQ1oPJO+mxEG/lM9ozo5lMi6FYaicYTP0oS2HQ9EwU7QaB8lAOZzXysnjQbHlgh2Ud3pr6nPmtvJXctFpcJRleJNELrKzWfGnlaxnZ49l1+CWeCuPrR8N3xCncDoW6oSubLmJVqtXQa45BsnoM/Z6HRX+ThXNdweZAqYeP5S40U8Efs1Bv9TN1hJjUq7CQXKSH6XqjzIYJruAjEKnBvWBDXwwKLb+Mf5ZI4DSo6x0Ysw4jHhEgIGy8ZZ3Hha/iauyqnArFG6d7EfiARZGGAqnKnBkSZFi+kXYZQxr9SpkmWOQD5QjKEtWWPBKcEZClLljfAof7UVjPgMsZ0tZJ8WHXjmPkB+lLY1ybIaYwpU6AsrpyNfji0HQ6FO0FgcbcdLoHQtEvrwzW1sfqwdt8yzDxsJrXGYZfYW1TmsQK5VFma3a1eSsxc3SmxtmZwM6Y2mG3DXYGc9avQrp71uulS4GwMPQosEO8Vb6ksGdFE7PzNsO1S8fKG0oWy6KgLIkhVcYSkTYWI8+aGjKV0s1OIQ0OUPJh2zImKZVDepjRYDlWL0tXcfNcPy2E/GHoVnn14se7EhP4jm7XTPmVbhl6c2LPgzKaokG3EXY9XjN0qs5BsnQi+J0SCATxpWUqZNg/xtGz/6jA4BFIcYahjpQxylajMMIVigb8pUMZ1Z9YhnPxa7FgclpCp2B8kR+8A1r3yx8M2+sU0nHxnA7Kd+jKFQJ1wt5YzktsMt51+pVyHMvzznhpwFsupKSqhI38cbcFIdH8fRQexIy9g0v7YxKnqe6AKlP9GQ1StYCh345yBdklmylw5Or6hPrxYZLiwOTaTfWi4nEHwXnKi0ZUroNPXNwQwzTvcnBojF2OQS1ehXyzDFIlOKjvKTMz/TwopFUSeb9r7N0e3g7jRaV6LEKNqUeOuiXV6oszZici3GQLHRa9NapY1MYozdKbsr/icLyOuT+k+JIO1Qf8F59YLLKoMNCRpQpUAxjM4r/qazBKeZc76i8JbhRMKP5SflrRsgm2FFej2r1KmSbM2V9pRw0yAWpwjQSf39GpZgqQTTqC4UB5p7EJgSHEyMLz/dQaEBBvmdyqUeJ6E2La9pe4rU40HFVH56stHPqwxQu7xipU0cZhUFaWysu1VnhuZERDrETDGYQO608HsjThYidfqpxk4xsxtCh0HmddM8IyY7q2J5EK+woMqeEcR445L8/FNEPV2VYT5x08XXERaMoDMW5OkkOOoBcKU2mUliIU54wYsntKK9lzF2lWYXDXPlq0ysdHSBXPqIyFUYRCT9FXnjxo6xDByaHKbTSwGtMiWG1C0XZS214Eaa0NR1rklvpW2KX863WK8t0zzyVLqPOrMpW8u0nu1EA115EZ0LdamkvHGrlOUWFTZjpHoOjd6aTofcnTe2ByZaPbC1p73atkr0xdnmZc/XqNOvzK0qS8Az/TFHznjgX4lb5VQ96MTZBGBWq6Yg4SCYMiRGDjZ3XuqgbL0yn/wNRGqZzLCuY5VBnpvXQN4pjxHxP/t90bfn2CuUdilpgl1dI/Kr1SmnT51f3cyaVfhqcteQsBa7kfY1kKOiSUf9wOKhhGQ1Hp91Kk9e1lJYNI6gUd465g7+NsMuRWaRXc6esJwnOtIMR0hb7uRC3yh/rsGi0v0s49BqN3V52etP0txfvtxMIrNGr2VPWCVk82hFwBGYiIANOU9bZI+TMsjy5I+AIzEDADXIGWJ7UEdgaATfIrRF2/o7ADATcIGeA5Ukdga0RcIPcGmHn7wjMQGDJc8gZ7D3pGALaXeNtmpe6Huryw5HHwHpL4twgr9jQMkjeluFoDQ5HnvxE6IqietE7IeBT1p2AHipGxsjrbtBb9WbMucr+20fADbKPyP73vILYP+Fgfym8xEMg4AZ5/WZghPTR8frtcAgJfA25YzNoesrmDZ9u8aUMX1lgiGzsvNB1QUpPWvsagw+E+WC4+Tum4skXHksPmL6Q2wOWI+Aj5HLsZuWU0jMS8lkURsXFh7/2DebFCKl4NnlekS6m5QsbSy9vU+JAZuShzE4ZCrcDppt3BE1rcEeY+Qi5Q0NKqRmBMCgMMf+OFP/FyW5Kw0j6sdz8ZAY+di0eoaLwQEqPMfEVTvWhyMrDCP1jYHD+pI7vKHNijZvLkce5vzECbpCNAR1gh6Fw2nd+ng1JGTXzw5EJS6T0jFgYIQdX1Xx/yjd4cw9FbnUgc5LbPcsR8Cnrcuzm5OQIjc60VAbGqMlIePH8UXGMnEwhMdjwhb/COlNJhZeIE+w65ZQS5WHiG6aicikLmVKnoTDkI2wWT6V3WoiAj5ALgavNJqVGobn6hmfn3BSVXfmYojLFxVDwM/J1TvGLvJ8rbu2hyGIRjv7oP37BwE8qx6esALED+Qi5A3SoUk8AAAGcSURBVMixiHztSFBam0nh0+HI8nNcpR2leZK/OF1VOEbOJlGLQ5GRh9Gwb3jIGDoMlfc0lklap40QcIPcCFhjKyW+kR+lRuEDKYyRh82U0uHINk09J9ZvTB8OoUqB593Q1YciZ/w6HYbKRD7O1zEjHTpgOmPh3rUI+JR1LYJ1+TkQq/Zw5M+Vlh1WHjcwCkKcBpcfTkUYU174GmHInemv8qT1oOKIDzwUbkZmeXGZFiMja1WefWKgNQdMK5lTKwTcIFshOcJHSs4omRuPpb4Ii8ZSMhjLc1IaDJUrH9WYXi45FDnwnSNjyOA/myDgU9ZNYN2WaTQejDyQ7ple2ghpm0W1hyJHLu4cAQEfIY/QCstkYHRlF5aNndf4dT3RxaHIGCvTXL6xfCZ/2OGNft2GtLhOB0PADfJgDVIrjoyL9WJnzdjPqzT5unM0bT+v318HAZ+yXgd3L9URKCLgBlmExQMdgesgkE9ZWXv0pfhOYRc7gf1Efu8IOAJ1CMieeOnj4VBqDJKt83ytkafNt9XzcPc7Ao7AMgRG30n+f8YkUUIP0BVjAAAAAElFTkSuQmCC", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\\\left(c + u\\right) \\left(c du_{dx} \\rho + dP_{dx}\\right)\\\\ds_{dx} u\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ ⎥\n", + "⎢ ⎥\n", + "⎢ dv_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢ dw_dx⋅u ⎥\n", + "⎢ ⎥\n", + "⎢(c + u)⋅(c⋅du_dx⋅ρ + dP_dx)⎥\n", + "⎢ ⎥\n", + "⎣ ds_dx⋅u ⎦" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# compute the \\mathcal{L} matrix\n", + "\n", + "#drho_dx = Symbol(r'\\frac{d\\rho}{dx}')\n", + "#du_dx = Symbol(r'\\frac{du}{dx}')\n", + "#dv_dx = Symbol(r'\\frac{dv}{dx}')\n", + "#dw_dx = Symbol(r'\\frac{dw}{dx}')\n", + "#dp_dx = Symbol(r'\\frac{dP}{dx}')\n", + "#ds_dx = Symbol(r'\\frac{ds}{dx}')\n", + "\n", + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "ds_dx = Symbol('ds_dx')\n", + "\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "L" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### x1 lower inflow (with relaxation term)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ R⋅c⋅η₂⋅ρ⋅(t - tₜ) ⎥\n", + "⎢ ───────────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2⎞ ⎥\n", + "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", + "⎢ ───────────────────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₆⋅(s - sₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎣ Lₓ ⎦" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "eta_2 = Symbol('eta_2')\n", + "eta_3 = Symbol('eta_3')\n", + "eta_4 = Symbol('eta_4')\n", + "eta_5 = Symbol('eta_5')\n", + "eta_6 = Symbol('eta_6')\n", + "Lx = Symbol('L_x')\n", + "M = Symbol('M')\n", + "u_t = Symbol('u_t')\n", + "v = Symbol('v')\n", + "v_t = Symbol('v_t')\n", + "w = Symbol('w')\n", + "w_t = Symbol('w_t')\n", + "s = Symbol('s')\n", + "s_t = Symbol('s_t')\n", + "t = Symbol('t') # gas temperature\n", + "t_t = Symbol('t_t')\n", + "R = Symbol('R') # gas constant (kB/mu)\n", + "L_inflow_x1_lower = Matrix([L[0],\n", + " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", + " eta_3*(c/Lx)*(v-v_t),\n", + " eta_4*(c/Lx)*(w-w_t),\n", + " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t),\n", + " eta_6*(c/Lx)*(s-s_t)])\n", + "L_inflow_x1_lower" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAADNCAYAAACW7lugAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2dXa7cNtauy8a+bjhuoAeQAGcAiT2C7J5BEgPn3v5m4MBX6TsjPYO47w/gJDNIegR2MoAD5PvuG4jb6AEcn/fhJhVKoiRKpdol1X4XoKLEn8XFl39Liyzq3ocPHw4mI2AEjIARMAJ7RuBvf/vbx7r+22XYMwJl2a/K3vY1AkbACBiBu4KAJvhrlfWBro91faLrB/n9LHcXJFmfS1CUlNUUlTNhgrL1ha6/7wL4WxLySoB8qrx+GcjvR4V/ORBmbyNgBIyAEbgMBFBMPqIoclFY/q3rHs9bJ8n7hWT8s9y1J/dbx0Rl+FnXp7qe6Xq1dezXkk9l/U28UJJ7pLB79zNfKvm/Otd3WfhmbiU4GmexULclpPJHg5+kLcg6KaQjVCNQW+/VDO9AxC30gZp624KceXOokTmPf+T9Z1l6xtb32fNmb4URStULuV+fQMizYKKyhLk4lm2wWAo/+zw4KFwnQLJOzZffKklX//gxscmXfr4TsyqzmeJhJoQpmizM3shvbW1WbPukfJ7J979rZe1zWMeH8uoCM3AoksJuXVblSYXTKD7T/a9FwS7Ac6ic8qdtMmjh8kbCgMtg9lAX9LXiVLXzm+jtX6WdrPd2ivEn8QsDbYyVlO+n8kfuhvQ8Vi76wykG6ib/pTeS69b7QElWyTFab2NyKgyL85dyF7ebJNMcXoo7KnPiuYbbKRtjyF4s6chafKFWmVgteKGLeYp+X5yj5E962injBWN6GDfl5vW9GibiS5//Std/6T5XhuTVEDKRZ3F+UbpN9KtG2okbyTvalhXesx7JD67U3SG3qPBcRWLA2uUbXe91TwcuNoAqZjMiKR8q+K8x/xkp/4iqtMVG/UeMWXeYBmlMPVpD1h7TOo9QPuW/GyVlYZ0UyyletM0fdDF5MxAwQOEy8DLw/KTrWBqs9wWMv40yIicyvtPVW4pVGOVC9lK5rhW+ZrtWNseTZNpFfx2TM4Zhis8nrUXgLOS1ZlublFsy0o5oi3vZn/KVZO1NchRU/oyB9Bleph/r6pHi8ALASwxLLowTvXFTfqthIl4oTygZ9A2uIikeZaJsvTjR76h5sJjp6T0Xt+VFikosz1/l3nZjHtSeZ2Cc3lpnJClHVYOh/EwSvcYk/zVkLWc87osGetv1Mi7RdOiSOhkr51Db/F2iLMmrVYKJem/FrXh4Jn4MloloN2yoY0DrEoNtqW5Rbh51I2/geY0+cHR9JRxG6m1MTuqmN3klnjPd2bxGZJ6Z9XR05QUOKCm/6poy1U8zPHEMycgYMKVAYrF4ravXn5Q+KQu4xRcYxVkVE/EDW17sp+RWlBAHy0uXxtprN+5mnlXusflyVM6r0dDxQDpd0Sw1nqwdKuHhQyN6rHveKAPpHu2reY7eKAXFPOVP5TERvdf1QM+LrDxKN0cexArgy23W0/AUDcp6Ezzvd6h88qeTvdDFZiTun+iiYwZaUJ6UdLGbyUR9MLm+lN9Rg33Gs1jOjrDU4dOOH4+0nW49FaJVeQ3Ve1XiLBIyvc2ex2575Yr1i5LyeTehwnp9Qn68zTF4Y7VhsEQR4F8eKEfd/ibvYVL81PaG6nmwD5RkG85pOER81uivPTnFF1yoGyZDLMdg+Vru7Ha8Aq+12pqKcDjEsrTGSvnRHhiHn+teTmgbzRgqv1tpN8pnTn0OvZAgf07UWUnhDdYY5YkFtrd0Kv9RTPIMTnRPvVPGrsWo117JfyZ2JKmmFXkvasv3qyXNIkropJ2S6WISHwY6zKp0CDYG8XyQC38abEPyo6G9bzyyG4Uxef0kFz4M+kzcs0npq+XJmLMERmNqaEzWJtKMm6HyRXnpTKyr0pipD7AL9RLDq/BVmhYpLUsS8F5C/1QiBnXq46UunhdTLMdgOXPGiks7oR6btomfLgYjzLu9yVh+S8raq/dcjtp75f1KV96umRxZ3mlNiHpO5aIsz3QxoWCS5vkjXd34vT6hOOACgQVpUejJP+zpkUsec2iwniOvvFwNX4X1ZGsCZ9yID+WZ275b9TYkp/zTvh/KgKIdLA0zxGuirsCrJXPDeMGNZCliL3/2tN3LLpTXQPKrajfE0xXaUH6f+GRusd3EfObUJwo65SlSlOUXucF6EZ9DXN0zv4R/2OCh51b/iX6DmBB+C0TZWn0ylqHXr+S/pC9UFWFl3ova8lWVpP1IVDJvGTXmq37qP3we6paBMpjw5KYKgH/3LZMKe/dH0ps7pWHAZVBJExMy9d4uu+kGnufIk1ggc6sxxeeerCnBHHeifLzl0dla9aDn1OmWlCeJhymUxj+LlDcm47eZDMjGAMaV6ncWT0WeKmfOL7RNeTCZJ39k6G1QTYFyl5S1VO8Zy/m3khclk75Q2mBHuWjn4S1XLnWDwtHDVGFDfYL28L0u3o5pN7l1CX6hzcqfvHimXTNhYd1M/UuPYWCfque99NeinKGQNz/USavsWdjc2yIvYYsMKEIoqSWijolzFIn/ULuY4lvVbsSEZQpemuAHZqWXgsF2o/jkUzsfKGpoo2PjLO041R1jIvjTh2jbjEfcI0+Ko9tNEWXr1vtQe52L3ZyCzuItTMfa86K2fDVH2ixu0eQWG8AjuVUVr3hhgpXLcgWdKBHLBd01QxoXhewSnaPpEOJFHBrlQffw7FY08nV5MxDTQebIQxZQqaMUZRV/OgqT7hSxqSvIooiD5euG6TnvmIfEQ24Nvl2ZqOMuTt04pWcG23zA5a0HWULdyZ1VJzGDFgbya5UzxklOaJvKJ0zoyXPCXVLWXr0rzyX1G0RTWtopbYO3uFI7b/U54ugCS5SVrtm6hVfkF/qE4h70DC/SBdIzcsMv5Ut/mDpTY7Sexa/YB+Q/KJvynNU2FH+N/jok50H8aWc5LnoM+M2u5yFegeFNex60DCjOWm1tEPsoR9HJcJ5qN2A2dfbKWLsJ7U88aserhxI4tdmS7PSltGzCiy/zCsp5WPKJCZb0/ZBUvGe3g5hnrUP7pn3mVGyvkqW6L8yVew7vKCj9Zqg999pyXrih+6uhgAl/BMknoxT9hW5e8hDBYJLijex3XTQoGk4pHfwYpBLxjLkVM2AaYEuVRnwqLlQSDzmV8pIfS0Q0zjGqkSelZ4Lp5l+UNZZlKu/EN7nF8okX/t2w0Oli2EHu+8ikqjyKz5s2BF/e7Js6URidcrQ+FYd04JFbw1Aimzd3xenVv/wG6yTyrC2nsgpKTHfixr9F4lssq/wnyxkZ9epdaWmrc+v3oHTw4o06pI3P+Oftijp8GvNODgNvquPkh9vFKw/jnnrMMYJ3/nKRW3SQrZWH5IL/aD0rvNgH5D8om/jOahvilaiqfcfI3XobkpPotIWASyqzXDZDLqnnIV7PlQflxsLF8nfTV+SXqCvzYaEMg9injCbcqXaDXORBPKwVeftNYVPtBhHm1Cfxa4iJk3/KdNs6z3lfqOEV4ojXknZQzV8RH+p630kw1l6JOondEXLX8J5qz7223Clf8fF+0XfEU4Wkw0H5wHaQ/xfyY708AYvlAm32tS4aCPcpTLc9Co1a8QCDxs4z94HkT6OgkF3q+StujdWiy6f7PCpPFhmZWtrjiKxZsurbYvmUB1g2eOqZegEv6oU3py6Nlkfpmbg/kYtlCWvEQ7khTWRUU5+hvpQuyCUXbPDrTrCR5bQTeVWVM+b3QFxbbbObi+KNlbWmnLDs1Xs3n5rnKDMKISZzFHPqkYHzXUof45TKhQwhnuJcx3gkK7YZAhIvucRJhILUWM8Ultc7famxWMYEk/Uc+SNflwZl60ac+TzavjNerXobkZMkvGSxpg7xEpbjEjxn/BR5Kf+0lIcVtaSkkEVL5hl5dqMuxl6yIQPLJYPtRuHvdNEO6X8oXellQI+BJttNiii3pj7Jj37RoyhvPi4jNwoUZUi8w1ym57xMPV5n9KBslLGhKCt1MUapfOAND54D9mOJKsNGeUu+qfa8qC1fVQoXokkItKUnMQ0di1uAoAFQ6eGNUO5BYcnkBkBhEJTfkObKRMYbJQ0LIOiwNPJuA0JLRxkKYCkcYhAlbao85HlJwBFUKw9ZUObem6D8SrISfy6NlS+FsdGUBg2+1M9vwuO93EQ15aEMYUJSWurybUqMK7+a+gQLPrtAOyF/BuehpQwFVdNkOWOe5A/RNrHI5RjchNz8DpZVaWrKCZehes/zqbmn7mizuA1JjtCm5IJlKtcLPefleqmwf8Q4B7lJQUt4lfoEft1lMfpoyE9uQ+KHAkXf6vbD2nou9YEx2Zq8Z948jXJOjR+wLdVbSU7iUn7aEmMRm8OH2hNxp6jISzyp+ym+JZmn8iuFH4N9TbvBKpTKQj/iGP7Un5Cntt3U1ifzQGrj8A8kGegztGeW7bCA0S8Yz9g7F5TBGAd5iMNm+qG5SVHWI+WDvMhGn2Mu40Xgd7ndPinvYFHJ5zr8oKH2SlgtdsSdS5O8VY6p9gzmvbFmUpBvvvnmU10fdH3Ml5TXusTvObzk/qTr03j/7Bj+4nOt69sjefx0TPo8rWR5oKvIbw1Z87xOfS95f6M85CP3eby+SPnyHMMG61NxftHVpElpp1ylKWI4lW5puPIbLKvCaso5WO9LZTpXOpWX/v/vbv7y+1ZX0x7ycPlX1bPi7aK/riFnjs+ce+X9ha7vSCO3Nz7Kb5NtTXL12o38mnYU5W6eY/mq2k0tfsqDNvpDbfy9xVPZvqOMXbnld3S/6vJc61myDbZnhc1qy4r/TJdE+7DsZNpJ7ecmAuei8CaCNeVJvG+9pVfyaaKJB5oxprueFt1Emr4paajTqcox0IaL2uFKspZzPY0vbxS8sbOEB2ENeRjubn5q6hNLTHqrz5JO3q5ZJ5OZKcJYWWvKOVjvNZlvLA5vdq1+qTaAdYe30n/r/oPcbhuvqueV+sCabaNYbyvJKZgWUbBWSQbGylLfKcq8KKd1E/Xajdjzz7q05MNS2eedLKvaTSfN2ONrBcLzUgmMmyXZVMgzt9ckxpA71p4Xt+V70lioaAYm9iesOSgMFeRof8lJgXMT+NE85zKQDAwsmOBKg0vDbguyNsKc8EblRHlknwWmvYslla+q3vcCgMrDkgRnTeQm+kHxFW92PSvNLvrrFuTMgZc8m21rku3k7SbHYuhecrDc96Xc7vLkUJJd+Ks89DP+ZMALY5EUdvZ+VRSs4ClZZ7flmIY55R7mxpMs/axlShriI7mDWXoo/NT+c/KfE/fUcpv/ccubrstl+J0bt9r8a+PdRj/akiy3Ud4leQgjlgfC0tmS9FtNQ5ko25R8inPWeXBKvhS+RE7Kr0ssPhx2aVEpKGz2MgJGwAgYgTuIgN64WR5h0/MuVgSmqkjlmG21nOK5x3DhgBUmWFTu77EAltkIGAEjYASMQESAfzOxFHUpRFm6+8IupWyLymFFZRFsTmQEjIARMAJbQEBv3vwlGosKG8B3TbEMF2MdWqsyrmoZCUB2/5uMgBEwAkbACGwSAc1TbDDdO3Guy97LUCW/yjn1yYXAZ46iUsWwSjpHMgJGwAgYASNgBIxABQLVikoFL0cxAkbgAhHQW8+1isWJk2zy4++Sva8py282iS9n9nBy6Nk2QSrv57pKp4LOLo8TGAEjcBoErKicBldzNQKLEdDEiVLwIjJAOYA4TIu1+Ib0jALBpjsmfI4Gf3OiSbfma8rKvp4kZzpX4WxKCtKCly7+WeDNi/XV55hG4FYR8GbaW4XbmRmBKgTCt0c0efKdHf7R8E5X61tAcFEYhw3y0Ty+V8KhV6eyDIx+TRlZ5pDkRBHjQ6WjhyWO8VTaNf/lgSJ2CXsbxiBzmBHYLQJWVHZbdRb8ghF4pokTa0kiJlE+YFY6LpyTgBdP+CmDMVf55lYPZEF5OobgcayikSxNx8gR0qp84HctFwXKZASMwMYQ8NLPxirE4hgBIcAyROv7OyOopOWfkSj1QZqsUSJ+18UyE9/Vaqw0uke5KH1N+aAw5ECR4ltJjSKje6wVzbPCIZSC4lKL/Afzv0la9ys+c+SBaVBW5LKEZjICRmBDCNiisqHKsChGAAQ0yb7Sle9HYVLnu1Kt75noOVlYVrGoiB/fTeH7IignKEppn8xBfigQQUnRfeu8Cj1jifhULun4KF2wTMhFPhSGhuSHJSQvWx42mH8TqeIm5l8lT8aOJbSL/k5VVlbfGoFdIWBFZVfVZWHvGgJxsmezbL5PJMGAEsD+lHxpJoXNcsUDa0n+kU14hq/fKmzqa8oPFRflCjnhkRQR5OtahlBU2HPTorH8WxHrHubIkzgiM7KZjIAR2BgCVxuTx+IYASMQEdDkzcSJJeOzbPLP8SnuT1FcLBqP5M6xtHylNM0STcwvWHB0X1KSGjkUHhQluU/kme89eazn7mfqkS0pMg0P3YzlD8+uEkH5urxZZkJhmiNPkqGnPKUAu0bACJwXASsq58XfuRuBIgKabJmYWWoJyxHx+SA3t55gsSjt9WDJ5iWMFZ/ll0e6OP8k7T1B8emmQ4HIeetxNiFPrqjw/BIZdKVlK/Igry4N5l+Q9SA/lqimlmpq5ElygPex5U+87BoBI7AiAvdX5GVWRsAIrICAJmAmTSZ8zvdgkkfZ+FpX89Yf/eTV/seP/Fl+4R9CyWqB5eGV/F7r4i/B3Kcw3TaEIkG+DSku1py5FCZ7pUVJSMoH94Hk38snBvX8F+Yf2TXOqDxNrJuys0fGZASMwMYQuNqYPBbHCBiBmzNTmORbZ6do4g5WELlsZmWZBeIDZrjEx3KCUtNYGhSGYgKhLISlEvmh9HSJZR8sOElZgV+wynQjjjw/jTyY8FEQ+AcNB7uhhOTEPhaUqdyCsUb+eR7c18pDXDDrWpnwNxkBI3BmBKyonLkCnL0R6CKgCfyjrl/+rHD+XdP8bTgP694rbjoinok4KCjye6YrKTAhiZ5RGo6aqMUDxYQrUX6f/HCx1JBXozCtkT+Mc6qVR/FQyg5RhpyF742AEdgAAl762UAlWAQjcEIEONcEqwbWlCfx/u0J85tkLRnY5MsZLcl6M5mmECG3xhSCZ3klxWlWIkc2AkbgdhCwReV2cHYuRuAsCEgZaP7JcxYBBjKVXCxZ8akANtu+H4g26E36wcAZAeKDEse/hdZUfGZI4KhGwAhMIWCLyhRCDjcCRuAkCEg5aJZ+TpJBHdPvJcecv3HXcXUsI2AEVkPAispqUJqRETACcxGQkjDbmjI3j7H4p8hfPI9Z0hoT99bCLqEMtwaWMzo5Aiz9vNP1f3T9v5Pn5gyMgBEwAisgoImUfzGxCRalgDNiWL45u2VEMvCPLJaRVltKOlNZ+VcWn0Oo2rSt8pqMwNoI/F8xRDc5YFHhuOn/He/lmIyAETACm0cAxeTHOJGyhNQ9pfbWC8DErkz/jFwrZ37rZVUZgtInlz08JiNwDgT+lzJFNwmKyjkEcJ4bQoABVtdZzdXKnzfRSdqCrJNC3uEItfW4AkT5sf603XMvIWHdeaHyn2LfzVnKqrJgTWHTM2UbJcU5+xgyKmAWKFmrxposiW/PjID/9XPmCpiTvToY5m7+7cCbG29tb+R3lGlW6Xlj4gCu1UzV4jebKIcuTmId/DeHwo6SVen5GyqDFEfIdw8hmy3zVhMMlVP+tB8mUlzOUWFyZxLCqgpx4NtR7UDpJ+vxJqvjfjtyUq/n/ncTMuSfD2gVUPJyEB+fNqDvgnOx38ofHrRz6of+8KuuvE5WK6v4Uvdf6UIZyZUheTWEPOR5sn7Z5HRLNyrrrbTRWyrOnciGpR/TThBQB8Mcy+fo+WLul3S4Y0RXegYqjlVfvLavtIOD8wLZMHEzKPZoDVnFNMgqXherpETgiuVUuannH3ShmDI5MWHiMskzGa61fDJYj8pjVZLslJVyLG7DKwn0lWRAuSiSwmhz4MsLxuNSJMVBgURp/Fn31Eurnep5tbKKF4oTChFjAFeRFI8yUbZinOh/1BhSzPj0nrfWRk9flMvPwYrK/uqYE0bXGpRH3wIroVltyUiDHuW6HhgU15CVt9m1sKuE5yzRxso51H74YOEqdTlRj6sBonxoEygpWB3OZs5X3uCdWz2GyojV4rUulIQWiUdSGHB7CqPCVy2r+IEZLzo1chMHy0uJ1uiXJb4n9VPZx8aak+Zt5vMRuJqfxCnOjABvXYNm2JmyoRQUecmfASh9bZdTRBdZb5QOeRmYOSG1Mc/rnjea5jmTOwwgeu5uSJwtq/gz6L/QxbdnuH+ii4kikMLnypaSLnYzmcCWN+uX8mu9Oc9lnvEslrPDjzI/7fjxSDvoYl6IVu01VI/VDFJEla/XFuXHd5BoV3wigKhMpk0blR/WAhQD4hGGEsa/g/g3S6ndKahMip/a0VCdDSl/JYbUdUkhDBYZ5YXFq7XPRX6jZS1lsrIfdUkZSxajXr+UvCfrVyvzXq2Nroy32XUQuN959uOGEVAnTW9idLCjSLwYLN+XmCiMCe8nuQz8b3Ux2c8mpWeA5+u/8GGzHc8HuZSDwaxELG0xKDak+LNljXkxwLPOzwALZuQbsIvhc2VT8iA/J6rCewn9U4leKz2YvNTF82KK5RgsZ85YccGROmjaD366mBxZbuhN4PJbWtZePeay1N4r/2JblD/7jO5lF0pIIPmFdqYHysVyCYr2K11hf45ccDjIbY7xz+8J69BUnT1SfOQcpJjnL3KDBSM+h/i6py+Af+jfcluKq54HyzqY4boBlC1glrOVXL1+Kb8lfT5nO3h/At6rtNFBgR2wGgL3V+NkRreBAAMa+1PCYHdkhgwy77o8xJuBnT0MaTIjr8+78SqfHyoeE0Qwjct9H9NRDhSgEhGnOygukZW3cAb/FlZ6TpPAEtmSvJjmh+RPcXqu8mZ54m0mA7IxWaaJtZemwmOqnDmL0H7k8QxZojxMjk91X7SsKWxRWZWuVI/yrifJtLQtUrff66JstIHcUgTWqd2znPGbwj/IRalJ/rq9IYXV1FnOMyXtukEZiZ60QWQ7iD9paQO0hTwOwVshcOn2SWQr9Uuwn9vn4VVDs3gLU5Rw2tAQHd1Ghxjbf10ErtZlZ24nRqBoYo6D3SO5SbmoEYMBko7aJQbv5s1aPInDwHrQPZ2+O2CRb3dNnWUdBqugJMhlySUfMFjy6KaRV6DeZCHf2bIqTascem5NAgtlCwLqh3oYkj/FKbkoA7lCwJv4QbKEepDL5IXiMUVstEwK2Gg5O4xC+1FarDm1tLSsrXpco2zi0bTFMeETNnKRHQUkUJQBRT/gjafu792EDv6O1llMxQTa8BzghFUkLZ2g5NIHUKDCkk9Mswhr8V3SbmKWVU5QqAsxH8ivVW7JUt3n58o9h3eUlT4/ZulqtdFC+ey1EQSsqGykIirFoOPlE11K9kI3L3mInZ8JEFP477oYSBgku+nGBp80CSrpH1TgQX4sETHAjhFy54oKz+zNYOklKEFZYhShbv6zZBVPBlCunE+YBGLYQW4aYKtkU3z2PEDwxULUlEdhTBSjmCsO6ShbbolBIWze9hUHLKawVJQbijxry0kiytra/3DDqf0rvsWyyn+ynBmnVj3OLVvk0y1bxr7qljrJy0v5W8p8xJB4vb/ox7DROquSoh+JyZN/ynTlqaqfLruF2HbZjD0PKWJD/RJelKXpI/G51eePkLuGN5Ywxjwsaiw7N/1MfolabTR52t0eAve3J5IlKiGgjsYkAXUHWiZNTJzvQ6gmTN3z5vZaF4Mh9yksRgkKDZMiHbVLPX/xqHnL7/LpPgelQbwYZNIExH2XkKn1FqQ0PZliop4/suqivE2Z9Qx25AV2WCC6NCqb0jNxfyIXKxHWiIdycyWoBvNQVqULcsmlnPg91bWIIq+qcsb8HiijVvvpZqx4Y2WtKWdi2avHFDDDLdZvTfpUXrnwSBSU1fQg952ua8UBEyazpKClKLV1Bh+wLVKUJW/TyIRylJZ8DooT+rfcXN4ivzN4UjbK2KIoK/U8RKP9aihRpf8ob8kWrIZysT6WlBSyWaONVorraMcgcKXEf4oMknsMP6c9AQLqaLwdsHwC0fFwGTwY7BjgmrdwhSXzMoNsWJ6QX/5WKe+GeItEycknXd7y+ctnGoDIJ1hrmlTzb5iM4clgTV4MHEwKpUGZsnStP/IKb7xzZE3lYKMpgywYgCF7Et7LTVQjG/LA76C04P2W+0Tyq8GccnHkO3VJ/li8sHTlsshrNk2WM+ZJ/hDthzfboXwHy6o0NeW8yeWmTZbqMYXXuKlsS9oiabpLXPSJXCbethMOlO3fulIZdRv6VU2d0aaTjKRrSPzTmz1LTvwlGKWI9sNepTCBxjjUD3FQtIf6a8P32BvlgbxgASb0K15GfpfbxUze4WyXfIzAL1FpDCGspl8lHnPdSd4qxwMxTXU7xB/M8/YwFM/+50HgLynbK938Jz4kN4XZ3QgCcfAoDSA9CRWXTZLEpROGAU/Pz3TlA3BKx+BER20GRsVjQFq184onA3IYlOVC+f2Nj34Vj8EFtzQozpJVPJgQRq0HMa8a2ZALZQcKCqD48wYeyiG3BnOUShSEYtkD5wU/4jdZTsWhPVS1H8UbLGtlOQ+KN1aP1aUUn8VtUWlbuOgZBRNFIG9b/yO/jzKB3mf33NbWGQr3407a8Kj8etjLj3zon4FKcVLYqdyIQ9PvJ/Lhb96llwqS9folnuJf06+IOpsqedNP38Jc8Xvjn/xWaaOzhXeCOQj8K0W+n27sXgwCnFeCtQJrypN4Hzpst4QKYzDH/Fx8G+zGH3jOB/6BKNXeadDrJVhJ1h7fSg8GdL7j8kWMjzXkYZa2BnMmyknFKeN5rtuxstaUE7kH6/FchVK+zcSVycC/ndKSD/u8uv9uq62z10pL3EuloJyXCnfmflkSKfkFxUryMRaW+t0W22iS3W4HgXvffPMNHQzzOGvwa046naz8uFUEVO902kHjDCEAACAASURBVLHlgJOLHgeU/G/RxTy3IGtRsBFPyYwiyHkuzVv0SPRdB9XW420XUnKxsZNzTEqWxZ44ijerzhSfZc0v5Q5ZHnp57MEj4sCGeZTzQVL42ceQQeE6AZIV5WVyrOkk8+MtIxDriXHz3tUt5+3sNoiAGgL7R4Ip9IzifS8Zuqb3njgbkbUn15iHZOYF4OKVlIhBVT2O4XWKMNXBrOXMBXWW3tBn5XOKsq7MEwsbZRulnfXLTbbRUYDveKAtKne8Abj4RsAIrIOAJmuWW9msfBGWaZVjllVpHRTNxQjcIKD2h+UrWFTuGxQjYASMgBFYBQH+pZSfHbIK0zMyoSyXZiE6I5zOeikCVlSWIud0RsAIGIEMAb0BsnSJRYW/JO+aYhkuxjq068qw8AfvUdl4I9CAwXdITEbACOwIAfXbyX0dOygOZ7rsQMx1RFRZpz6nsE5G5jIbASsqsyG73QTuPLeLt3MzAkbACBiBbSHgpZ9t1YelMQIXiYAUbs4rYXPm2Uj5735J5mzgOWMjcEYEbFE5I/jO2gjUIqBJlr+PcygZlCZ8Dixr/aVbz9cKZwMkh9NxOugb+dWeSqvo65PyT+dWnPXfMOCgi38ReIPo+tVsjkbgZAjYonIyaM3YCKyKQPgGjCZZzrzh3yXvdHFQY4sUximcb3RxXDwHkJ1bSUHB4uOYpdNBW7IPPSjtmv+k+UH8LmH/yBBc9jcCF4cAigpvObxhMPCZjIAR2CYCfK8Ea0kiJls+Jlc6up3D5RYrBimDlVzkPFbRSBako0USXuByLRcFymQEjMB2EaCvBusnSz8MAgwkeLbMyHo2GQEjsA0E6LDFbzYVxEvLP4Wg+V6a1FE2ftfF+MC3oRorTZzwWZIinA/z8SmG/Bh5lILiUov8B/mKTzWJD+VFYeNbRFibAuke60nznPzlBmVFLktjJiNgBLaJAP0a3eQVFhWTETACG0dAE+4rXfmLBJM/3yvJlYKDnpOFhcn4aBI/vmHDt15QTlCUUEpy+qceXsfwl7rnOZD8eAnKZY4h4Yu2U3ybuGM3yuOBwj+N+bNhl+eDXHBgoCsRS2N35ZMGpfLbzwjsCgErKruqLgtrBJpJmM2ynxXwYHJmf8rRG1fFg7eZ/ONt8Gy+MKxw/kXzVm5SlgjH4hKUBd2jqPSWlKf4Ks0ceqjIKHHggaxJMQKHIQsUcZDNZASMwA4QuNqBjBbRCBiBiIAmYiZYlkw+yyblHJ/i/hTFRXl4JHeOpeUrpWmWTmJ+SSkhT6w6+bLOIzxjPG7JMykOPCca5Ku0KEddJQK5+Y5OTizroKAEhUzuEwWSNhHLUN00KaynPKUAu0bACGwPASsq26sTS2QEighoMmYC518/YdkiPh/k5tYTLAm58pB4sWTD0gzxWRZBqfhEV9p7guLTTYeikfPW4w0pLmHIk1stUGryfR/BwnKTovU7xrcrA/Ky9DS1VEO5c0WFZ/bLsCyUK1cIgtzFchFoMgJGYFsI3N+WOJbGCBiBEgKabJlcmYg5B4TJF2Xja12NdSD6yStsFsUNJH+WRfiHULJuYKF4Jb/XuvjrMPcpTLcNMcGTb0OKizUHQhE46Dmkk0s8/J7iD8mvl/4m5NDzV9zEN0ZZ5ATlQ7yQIylDQc4ON2Rlj4zJCBiBHSBwtQMZLaIRMAI3Z6Yw+bbOTtGkHCwQctkvwvIHxMfkcImP5QSlprFIKAzFBGISD8sj8kPp6RIWEiw4SVmBX7DKyIXfjwoj3/e6sM6UlqPYN4KSlFswxviKzSJCQUJWFBDywrLDQXMoRV1C9p7lphvJz0bACGwDASsq26gHS2EERhHQBPzRWASF86+c5m/DE3Gfx/hM2EFB0fMzXUmBCcn1zIQ/NKGjALG0ki/1hHSdHywl8GgUoQm+neR1j1GOXJb8vmGieChbhyhD4+8bI2AEtovA/e2KZsmMgBE4EQKcN4K1AWvKk3j/dmZeWGkmN+aKN3H4J1CyyszMJkTPrTFL0udpkuKU+/neCBiBDSNgi8qGK8eiGYFTICClgaWXxRSVjp/lsuQzSYrHUhSfAMACU5UmZ0r6/HnpvfignPFvoTUVn6XiOJ0RMAKVCFhRqQTK0YyAEbhBIE70LBtVk9KwfyQsu1QnWj/i95JhtqK0vhjmaASMwBwEWPr5U0yQ3DnpHdcIGIE7hIAmek5/XbSMc1tKgvJhg2+Pbiv/Xsb2MAJGYAkCf0mJUFT+Ex+Sm8LsGgEjYAQaBDTRs3Syyqm3DdMT3EjOv+vKz1Q5QS5maQSMwIkR+Ffij6JiMgJGwAiMIqCJn2UbzlyZ3EA7yuj2AtmLssbZLLcnsXMyAkagiIAVlSIs9jQCRqCDAJP+bqwUUaG6jgpWpyh+NAJGYE8IeDPtnmrLshqBEQSiBSEdic9fglkCYbmGjxdyUBz/dmF/CYezcQjbnH//MOn3/n0jv2vx4q/K/OU58JMbLBlym7NTFF5NK/LE+oN8xTNVqgVyRCNgBM6KgC0qZ4XfmRuBdRDQ5M6JrHwTh0PfOBPlhe7Tv2x+0DPWEJQXPuSHAoHigdIySTFe798y8oc/x/mTJ5tsU35v9FzFu5v5yjyRY9a/k7ry+NkIGIHzI2CLyvnrwBIYgaMQ0OSOEsJR9Wn/CJaTz3U91PW9LqwqnHuSWxZQKt7pOsgfiwgnzUJYX/ieUH70PEpHiEuEjOCP4sO3hMg/KDNyOVr/cRZvzm0VT/FHJv7y3LPyZJkhzyKFKePhWyNgBM6MgBWVM1eAszcCKyDwlXg0yziavJmgG0VDz1gVsKoE0jOKCf/eCYqF7lmqYdL/VRdKxz90obAkeqCbFDf5HRQ3HJwm94k8GyVIz/BP3xDivmZTK4fCoexM8owCsKQz9WHBknIVk9sxAkZgLwhYUdlLTVlOIzCMAIpEmOAHomAtyfeLMMkn6wtJvpSCgOKC9QGlo7tpFt7kMUTwaxQl3bOsxHLQQS4K05LllzGenJOCJQUrEUtOjZIkv5wozxgueVzfGwEjsFEE7m9ULotlBIxAPQIoA0zKDWnyThta8WdvSmNh0TOKQ7B4kEBhSUlBOcAKwR6XhmLaFv8m8OaGNFzwIl6eF95LaJCn8khKEFaYISWFPJFlyuqyRDanMQJG4BYRuLrFvJyVETACp0EAawZLN0mZwPrxMmaFX5jY4zMOCkmzt4N0urA8sN8kTO5yP9KVL/ewLJPiwSMneD1ReNjnIrf1FeY84oz7QZ7iT/ly2YbYopA15RyKZH8jYAS2jYAVlW3Xj6UzApMIaOJGyShOyApjiadZ5tFz2p8SlkTipI/V4V7MCCWgRFhoyCNfQgrxunmUEs/1m+CJohWsPor3TFdPMZJfKIdcL/3MBd/xjcDGELi/MXksjhEwAqdFoJnkyUYTOZYJllCY8Nn78UIXJ9C2LBZ6RtlhCSlZbfR4NgpLS5Il/JtpQIqkWA0E29sIGIG9IIBFJb2NhTXmvQhuOY2AEViEAIe9Nf8AgoMm/J5FosRZ8VBovtX1UldLkSnFP5Wf8k5jVjELhaPAcIS+rSlFhOxpBHaBAC9HwVKMRYU3JHb5P9RlMgJG4IIR0OSNslGlmJRgUNre0k8p3pn9vpeczXLXmWVx9kbACCxDAOtv+AciFhWTETACO0VAE/KHc4iufM+RbXWeJfnkl/bhVPNxRCNgBM6PgBWV89eBJTACixHw5LsYOic0AkZgJwh4M+1OKspiGgEjYASMgBG4iwjYonIXa91lNgIzEJDV5lrR2dTG8focsPZGft2zWeRtMgJGwAisj4AVlfUxNUcjcFEISCnhqHrOX7mWmx+Vf1HldGGMgBHYJgJe+tlmvVgqI7A1BDjl1f+k2VqtWB4jcAcQsKJyByrZRTQCKyDA8k/zfaAl/GSNwSLzXFf3HJfW8xLeTmMEjMDlImBF5XLr1iUzAqsgIMWCZR9osUVFPDjS/lO57G3hi8c8H+SGJSXuTUbACBiBEgJWVEqo2M8IGIEcAawpfGH5mJNeOVCSjx6yIZcPHKaTbeHd+lqznk1GwAgYgQYBKyoNFL4xAkZgAIHi/hQpG3z7B0VjkhQvKSdPFDmcNhkTPZZ71JLSZOaOYASMwK4RuJL0f4olSO6uC2ThjYARWB0BlJHS15n5gOFLcpMiwhLOI118S+h3XVhMPpN/Nx28ckWFZ74dxLJQ+Nignk1GwAgYgb8kCLCo/Cc+JDeF2TUCRuCOIxAVEFBo7U+RP0s4H8tNSziPdM83hF7r4uvL3Kcw3bYoLCEpDkrKA108c28yAkbACCQE/pVurtKNXSNgBIxAjoAUied6ZqkG4mOGuCgWWE6woLAkFCgqJtyjcISlHPmVPmD4VOFfK+w3uSgoHCDH145tTREIJiNgBPoIWFHpY2IfI2AEhICUCf6hU3UCreLyt2PiorwEBUXPz3S1vtSsZxQTrkT5ffKzawSMgBFoELCi0kDhGyNgBI5A4DGKidJjTXmie6wub4/g56RGwAgYgYCAFRU3BCNgBAYRkMLBXpRf5Y7+NVnhmzxaX3IlS89gGR1gBIzAthHw35O3XT+WzgicDQFN8lhIjj0/5Wzyk7HK8Hdd+b+MziqPMzcCRmA+AlZU5mPmFEbg4hHQ5M6mWf690/q3z04L/oPK8e1OZbfYRuDOI2BF5c43AQNgBIoIMLFfhCUiKlvXUfkqFtaeRsAIbBcB71HZbt1YMiMwikC0EqTD1TgllmUOlms+0/WLLvaVfKyLQ9g482TOPhIm9u5hbQf5XYsXf01m82zgJxfry7dy+Qsz9/+ji8PeRve1KE6RlO4UeWAZgq//ZVRE3Z5GYLsI2KKy3bqxZEZgEAFN5pxD8pNc/hLMv2te6B4lAeJrxFhDUF74vg5/F0bxQGmZpBjvfTei/OHf+7Cg/L7SFXgrDumSgqTbeXTCPN5Ikubcl3lSObYRMALnRMCKyjnRd95GYAECmsxRQvh2Tto/gmLwua6Hur7XhcXjZ4Xn1gOUjHe6WqQ4KDuE5YTS0YsrP/iXPiyIApB/r4fTaRdZU5bmoTJgMRpbqkKBqlLUFM9kBIzAhhDw0s+GKsOiGIFKBLBgNMs4mqCZhJuTXfWM4oBVJZCeUVz49w7xGtIzy0SlyRvFpRWXRIoflA+5nFabK0EsqbSUhCwueddsZGXZCOVrdh7iDyEDVqYhKileQ3HtbwSMwIYQQFFhYGAt2h15QxVjUYzACAIoEmMWCw5by4+vZxJP1pfAVgoB56Pgl8cLYfqBN3kMEcpHUEzEh3gsMeX8GyVH/ihQS5Zc5uTBUf+MYViRvtCVK1HyDoRCNoZZjGbHCBiBjSDAmBL2yd3XDR2YQeehLpMRMALbR4DJv2UJ0eQcrBZy8UdxIE6i1tKMwlACsLAUJ+6YtsU/MYouikh6sUEpakhpsdLkSksTNvOmOg/lGY75l4tVpqSkkDXlGbO4zBTP0Y2AETgxAo2lFouKyQgYgX0hwLIPH/ZLygRWjZexCPiFiTs+49Dhw5uJ0hA3femYsCFiGYZ9HyVlBisMm3fZoIpCgYKAohQ+NDiQRsGzqDoP5UeZkGOMUNYCBmORHGYEjMD2ELCisr06sURGYBSBqAgUJ12FYc1oLBp67lpPsJxicWG5BEKxQen4TleulKB4kEdvaUjxWnkozuo0Mw8UsbcIoXTPdHU/hIgiQ1hePrxMRsAI7ACB+zuQ0SIaASOwHIFmEocFk7UuLC6tybzLXnFQRlBoktWmG2VLz2GZS7IOLTslpWtLMlsWI2AEKhGwRaUSKEczAjtFgMPemn8ApTJoUmepBIWlu0yUohwUJyzpyH0Z4zdhW7qRbFhKhixMKC8coW9rypYqzbIYgRkIWFGZAZajGoG9IaAJujiB15ZD6dkLE5ZOatNsLN73kn9q/8rGRLY4RsAI5AhYUcnR8L0R2DgCmnQ/nENE5XuObFfJsyS7/O6twtxMjIARODkCVlRODrEzMALrIeAJdj0szckIGIF9IODNtPuoJ0tpBIyAETACRuBOImCLyp2sdhfaCNQjICvOtWKz14XTbDlQ7Y38BjfhKtxkBIyAEVgNASsqq0FpRkbgMhGQUsLR9JzHci23+cbQZZbWpTICRmBrCLD086coVHK3JqPlMQJG4PwIcLJrc5Dc+cWxBEbACFw4An9J5UNR+U98SG4Ks2sEjIARSAiw/PNTeljiyhqDRea5rta5Lt3nJbydxggYgYtD4F+pRCgqJiNgBIzAIAJSJFj2gRZbVMSDs1g+lcveFr5wHM5mibxRgkxGwAgYgSICVlSKsNjTCBiBDAEUicGvLWfxxm4fKvCVFBM25HKMfzqEDd7hOz1jiR1mBIzA3UXAisrdrXuX3AjUIlDcn4JVRFeVNUTxknLyRJl+l2X8WPdHLSllvHxrBIzABSJwdYFlcpGMgBFYFwGUkdJR/C/k/5KspIiwPPRIF98W+l0XFpPP5N9NB69cUeGZbwmxLBQ+LqhnkxEwAkagQcAWlQYK3xgBI9BFICogeLf2p8ifJZyP5aYlnEe654vMr3X9Nd6nMHm1KHwgUHFQUh7o4pl7kxEwAkagh8BVz8ceRsAIGAEhIEXiuRyWaiC+pIyLYoHlBAsKS0KBFIaSAqFwhKUc+X0dfNo/T/XIhw5/k4uCwgFyfOHY1hSBYDICRqCPgBWVPib2MQJGQAhImeAfOlUn0CoufzsmLspLUFD0/ExXUmDkHXiimHAlyu+Tn10jYASMQIOAFZUGCt8YASNwBAKPUUyUHmvKE91jdXl7BD8nNQJGwAgEBKyouCEYASNwNAJSTHy0fgWKwol9PWGPTkX0TUa5hDJsElgLNYiAFZVBaBxgBIzA3hDQJHotmdlH87Eu/oH0g/xaG4HldxaSHOz5QUlZTVE5U3lRtji0r2pZ8CxgO9OLQsD/+rmo6nRhjMCdRwDF5Mc4ibJXZhNntDCxS5Y/I9vKNXTr5VUZguInl6U+kxE4OQIoKmj3nHXw7uS5OYOzIcBAqYu3zLOSZOCtcpS2IuuokA6chUBNvc9iOBz5syyI9j70F+ks2mlvVXYsPC/klv4FdWzmZymvyoI1hX+CUbZBUvgmxp1BAbMAyTo5NmXRfXt6BFCIwzlMLP3QmTmACc+zd2rJcOdJHQbzNRXEWxhvYG/kt9jMqrS8+XAy6GomZ/FbRJRD13e6ugeBBX7yP4usyvdbCcBAxSFlF/lX2aEyyp/2xiSKy790GAeYgDj2HuLvxEe1HaUfrfebbI7/7chJnW5h7wxy5IfcNQWVvPzNm4Pz6OvgXOzn8ic9fYP6of+ENio3r5fVyiu+1P9XulBGcmVIXg0hE3luqi830s28UTlvpY3OFOsuR2c8oo29wqJi2hgC6jAojW908X2VL+lAS0VUWgYcDuAK5toj+NBg1iLM1QxwLVpL1hbT+odQPsmwCyVFci6pj2IZxYu2wReNUWaZmJgwcZnkmQjXWj4p1rv4r06SnbJSjqPa/UqCfSU5Wn/TTnzlT3sDX15I+JxAjxSHARul8WfdUy+9Niq/1corXihPKEWMHVxFUjzKRNl6caLf0eNOMePTet5aGz1tMS6LuxWV7dZn8fsqC8QdfJubyQvL2yqkQYzJ47owwK0l6xI5eaPdwqRWK/uS+hgr41B74zj8JXn1yjFS7724x3goH9oRSsqvus5qzlf+YJ5bPUpFw2LxWhcKQouUPikLuEWFUXFWLa/4gRsvR1NyIytxsLx06Zx9uStL9bPKPTQ2VfNwxPURuFqfpTmuhABvUUWT6kz+KASDfBTGgJK+zcJH5hZZb5QOeRloOU+jMbfrnjeU5jmTPQwIes43F47KmqWtvlXexfLJn4H/hS5OSOX+ia7XugIpfG55UtJFbiYPdcGb9Uv59d6c5zDPeBbL2OFFeTk1tku0nbyOuuFzn0v1PpdHiK/y9epWfr8okHbIAXTEYyJttWn5Yy1AOSAu4Shi/EOIf7OU2qqCyqT4qR0N1duQAthlSF2XFMJgjVE+WLx6e1zkP1nebkYrP1OflLFrMer1Zcl6sj61Mu/V2ujKWN9ZdvfvbMk3XHB1uvRmRYdZTOLDwPd+iIHCmcB+kstA/lYXE/dsUnoGaz4qBx82z/F8kEs5GJxKxNIWA1wgxR2VNcWb44pnsXzyRz4GeNb6GWDBGVkD3jF8bnmU/Cj6p1K/Vt5g+FIXz4tpqow5Y8UFezBp2ht+upgcWW6YNXnnvAv3rXovhFd5SaahumWP0b3sQgFpSP6hbcqDsrFcgnL+SlfYoyMXLA5y8e/dE9ahqXp7pPjIWqSYxy9yg/Ui5Ulk3dN3wD+MB3J7iqv8RstbzHRdT8oWcEpsJRPP79MzrvzA/SR96gS8V2mjefl9fxwC949L7tQnQoABiv0pYfA6Ig8GjHel9OLNIM2ehDQ5kdfnpbgVfg8Vh8E+mLnlpkGKcqAAlYg4+QA3KGsp8ZTfRPl4E2cCaOGr5zQRLClPEEk8vtWFElRNis/yxNssf+RiomRwX0pTZcz5hvYmj2fIEuVhcnyq+6I1Tv6zyxkz7NZ7LkfVvfI+pu1St9/rony0gdxaBN6pv7Cc8ZvCP8hFqUn+ur0hhdXUW84zJc3doIxED9ofch3Em3S0AdpCHofgLRG45P0Y2Up9GdznjhHwqqFZvIUpSjhtaIiObqNDjO2/DIGrZcmc6sQIFM3FcfB6JDcpF1NiMNjR6UrEQNy8KYsn8RgoD7qnE3cHH/LtrpGzrMPgEyZ8uSyf5AMASxjdNPIK1B34B2UVXwZvJt4pYqNhUj4GyycmrTA9tyaCxGNmeZJslJeyzCGUgVwh4C38oPxD3cmdVR8x49EyxjjJCe1N+WDNqaUl5YR3q96V59p1Oyq/8kttlTKjgASKcvByEDDHU/f3bkIHf0frLaZiEm14FjhhEUnLJij19BmUp7DkE+Mj61A/ilHKjngvwbfMrOwLnt32znOrzJIj4T45RsyVeQ7vWAT6+6CVS2GtNhrT2DkjAlZUzgj+SNZ0pHziSlFf6OYlD7EzM6Fh2mZ9nIGBQS9PVxpEFC0Qg0kYPOJz43R4BH/5sUTEgDlGyJ0rKjyz1wKTb1CCssQoQnn+g7LGtFN5Z6zDbbF84oV/NyxMBDHsIPd9ZDanPCn/WZNKzBMscssTCmTzpq84eZ2GfOQ3WB+RZ20Z4Uc5e/sfQkbDP7PKmbFp1btkpV2sUrdZHjW39J28zGDQegGIOBKv99f+GDZabzVCdOIwefJPma4sS+onsF6Ib0es0ceSIjbYl8WJsoyOEUfIXMP7ufKnP2FNY5m66WfyS9Rqo8nT7vkQuDpf1s65hIA6Dm9AUHfQ/EJ+mCzTJIqFA2tGeGOSywDXsjromd37dLoSMUG0OiTpdeWDdyndlF9QPsSHQSNNlmxeLCkqzVuN4o/JOpVnKXywfMorYXjQPfghK+XGCsGyQE6T5REPygdRXuqpGYgjfya7IYWSvJEjyCSXOsFv6OwKoo8SvBI/Iup+sIwKIz/kbrU30nVJcY8pZ2JHfk29J8+Z7mDd1vBJZZabt0mUpcbCovt3uq4Vh1NuWQ4D02T5IJvaeoMP+PZI/LpYIA8vI2nJ56A4YTyQm8va43VGD8pGGRtCVl2UbYgm+9RQwgr/Ud6Si7NSsLz2lP+Md7desiDfngOBq3Nk6jzLCKjzoO0/iaF0Jm4ZCJjoGLCaN0+FpUGTATOYheVXUjJ4G0TBCR1YcRPx1s5fONOAQj4vU+BC92nkyUREfrytlJQUeYeydAeLIVmJP5fGypfC2EvCIAtu4M6ehPdyE02WR/Ep3ydyA/ZyOYE0x3pKoaROw2Qol7xRaLCM5XLIazZNllF50N5Sm6K9Yf0q5iv/Y8uZCkB+3XpPYbVuKtvStku67jIX/SiXizfuhAV97d+6Up/TbcCtpt5oC0lO0gUS7/RmjwLExI6iiFWNvUrhLT/GAS/irPESEfKe+lFeyAsWYMLYwQvQ73K7mMk7nO+St3f8oKG+/FRhjDs1Y0RgNONnkrfyfSB+qV6HWK/RRod4238BAlcL0jjJiRCIA0FpMOjlqLi85RGXTpUmyWfyywdT0jHIMOiEOHhAisfgkg/Mwf+YH/FkgA2DbOST3zesFY/BIsnQ+OumKGseofZ+rHwKY1KosSDUlAcMmTgpD8rkW+4TyS/Vx5BCiRKKglDEKvGZ64rfZBkVh/ZT1d4U79hyHpTfUL3PKp74HNV2lb6FjZ6pN5SBfML9H/l9lAnWndxq6w1LyOOMT7hVXj3s5Uce9OdApTgp7JRuxKE1Xozkh+WvZO0p9mXxrulTI9kNB1Xyph+GPqr4vfFSfqu00WEpHbIEgftK9KeYMLlL+DjN7SPAeSW85WJNeRLvW5MkIsmfQRlTcu+tjvAZlA/iM5IVo6ZBrBW4oqwtvid+YGB7F/MIyojK8UXKU/e8OUNMQEE5kh/1lohJMvgnj0p3zfqoyfLYcpJHsd5rMj9xnGbyyvLhH0/sYaCuWI7p/iOutt5eKy1xL5UaBTwvoHBba9zJ2a5xH5SqWK+lfrfVNrpG2ffG4y9J4HvffPMNnQgTOObr2x78khx2T4yA6pYOOGjaP3H2Dfs4QGAWLg0SId5WZG2EHrmRrCglvDFz9gLKIEs3nIsRLCly2feQ/iHzZ91j8sa8n9bxOculeYtW2CZJMi4uJwVSeib80Xo/V8ElG3uKmjqbkkPxqefqelN86pxPYYRJcor/XsIjDmzqps0XSWGbGHeKwnU8Jetm22hH1DvxGOuDfnbvgKKi64Oujz98+HDwdbkYqI4fnLt+a2WojXfu8jj/uv5yl+tTZX+m67tLayuUibJNlUtxzj7uTMlI+F7krCnLJcShbelSUT4cbFG5E7qpC2kEjMA5EdBbIVY1NixfhNVa5ZhlVTon9s57nwiojWHhChaV+/ssgqU2AkbACOwKPlkRYwAACylJREFUATZcN39b35XkZWEpy6qb8cvZ2NcIHA5WVNwKjIARMAInRkBvh/yjB4tK2lx94hxPxz6W4WKsQ6dDypzXQuBqLUbmYwSMgBEwAsMIaIJn2af27+DDjM4conLsvgxnhtDZz0TAispMwE4VXZ2fj5+ZjIARMAJGYEMIaGye+ubThqS9TFGsqGykXt0ZNlIRFsMIGAEjYAQ2hYD3qGyqOiyMEdgnAlK0ORyNf4KcjZT/7vd/nA08Z2wENoyALSobrhyLZgRqEdAkzcmxnKAKJYWB01XZxNmQnq/1wL81OMCN48zfyO+oPQdKnw7KOutfbymHLv7O6H+jqGJNRuBSELBF5VJq0uW46wiEj9ZpkuaDb/wVlmP9OXG6RQrjRGBO0eXbNpyWeqySgoLEl7sHTxpuCVB4UNo1/7b7g/hxGqrJCBiBC0HAisqFVKSLcecR4ANrWEsSMVnz5dvSd2aa7w6lyEe45HOsopEsQEeIcZNU5UVhupaLAmUyAkbgAhDw0s8FVKKLYASEAMsdvY9SDiCTln8Ggmd5oxQUl1rkjxLzuy6Wn/gw5iLrjdIhLwoXH+LEWhRI91hPmufkLzcoK3JZ2jIZASOwcwRsUdl5BVp8IwACmrBf6cr3o6A88BHA1ofw9JwsLIuXahLi4oUlJM8zBR0Uxof4+GAdygkKVNo/08SpuVF6LCOfRj5s2OX5IJdy5BYkvBOxtLX5Dz0mYe0aASMwjoAVlXF8HGoEdodAnMTZLPtZQXgmd/anrLHxFUWFvTAtEm+WgvIvJZPX561I9Q8PFRUljPLAMylGlGPIgkQcZDMZASNwAQhcXUAZXAQjYAQiAprImaBZcvksm9RzfIr7UxQXS8UjuXMsLaRJikOex1d6aJZkohzBsqN7lJiuEkG+fLQvJ5Z1UFCCQiX3iQLzvTCP9dxNk9L3lKcUYNcIGIH9IWBFZX91ZomNQBEBTeYoAPzrJyx7xOeD3Nx6giWitKeEpZmXMFZ8llUe6fpEV9pjguLTTQdflJUu4Zfn2YQXeJAfS0RTSzXInSsqPL9UOpaFWstb8geHYv7yNxkBI7AzBO7vTF6LawSMQAEBTdZMzkzknCPC5I2y8bWuxroQ/eQVNpviBpI/yyr8QyhZR7BwvJLfa1389Zj7FKbbG5I/CgL5dqnnr7hYeY6loHyIF0pKUoa47xIysUfGZASMwAUgcHUBZXARjIARuDkzhcm7dXaKJvVgBZHLqa0sn0B8+RaX+FhOUGoai4bCUEwglICwvCI/lJ4SsW8EJSe3YLDsg2UnKTHkE6w1JQaVfk8jTxQQ8uIfPRw017WmyCuUpWv9wd9kBIzADhGworLDSrPIRqCLgJSCj7p++bPC+fdN1d+DFfd5jI/yEhQUPT/TlRSYnDWWEpSCRpFRPBSJVRUF8UQx4UqU3ye/g+KhFOHmilMT7hsjYAT2h8D9/YlsiY2AETgxApxXgrUCa8qTeP+2lKfC2HzLGSnJelKKNuW3plKRFKepPB1uBIzAThCwRWUnFWUxjcBtISClo/nHTk2eis9SEkf4s7n1fU2aPA7p8+el9+KDcsW/hdZUfJaK43RGwAishIAtKisBaTZG4K4gIEWAg9daFhQ9N0s/Z8The+XNfhuTETACF4SAFZULqkwXxQicGgEpJFgtigfGKWy2NWVNeclfV/iC8pp8zcsIGIHzImBF5bz4O3cjsBsEpASwUfWoLyXfUmH9BeVbAtrZGIHbQMCKym2g7DyMwGUgwEbV/NC1TZZKClX4KGFUrDYpo4UyAkagHgFvpq3HyjGNwOYR0OSMMpFOk+XfOCyFsFzDd384Y4WNpuwv4dRZzj+Zs3H2WvGLG1/lT77pkLV3ei7+fVhxqulInkFZUWZHy1EtsCMaASNwEgRsUTkJrGZqBG4fAU3svS8Wyy+cKyJpftCFNQTlhW/osPkVxQOlZZJivOIeFIXB97Vczlnhb8xPJhlORFiBp7+gPIGxg43AXhCwRWUvNWU5jcAIAnFiL32x+KGS8W8YrCo/K15uYUCJyY/Y5yh9PvYXLCNR8dBjIBSaJm70Sw5h/4gyfC93jpUm8ei6ozyVB+Gcflu08CgMpYo4JiNgBHaOgBWVnVegxTcCEYHBLxYTrgmdU2axqgTSM3/j5V8ywUoiF0XmE7lM/igwxM1PosUvxJXbJawz/9SFZYXzVPiAYTjLRC75sCw0RZzFkp9/MsgzMrqWm5aaSryHlKpSXPsZASOwYQSsqGy4ciyaEZiBAIpEPtF3k/JNHyb/REz07ONIhDKBgoE/lpnm2z8xArzJo0WKh9WC+B/Fe06zxTITjuuXH9/i6fKS1zBV8OS7RVhSsBBxpktuJUqMg1zpwa4RMAL7ReD+fkW35EbACGQIoBC0ljo0gQdLRpz42ZtCnEQoD+mDgyggXHx1GeUFt/Xvnpi2xV/xIHigBB0UB2UGpSFXgAiaS6M8lU9SgrDClJQU8kPWMYvLXJkc3wgYgTMhYIvKmYB3tkZgZQTYFzL0xWIm7TC5Z3liOWnt70iTPq4u9pywjJNbaUpfSkYZQgli6Qh6o/tcIbrxnfc7ylP8UareT7BEEWuVbyK+g42AEdgoAlZUNloxFssIzEEgKhTFiVlhWDgaK4ee0/6UoITomb0qv+pC4cgVgHcdGVAgyKNZQlL8fB9LJ/qyxwqeKFlv4a64va86yw9FhrBcycLLZASMwA4RuL9DmS2yETACxyHQTPQZGywyWFCe62LZ50u5udJy0DPKDspMaQkoY3Xy22CxkRzhn0yF3JJCVQiylxEwAntDwBaVvdWY5TUCxyPAYW/NP4Bgp0kf60PRIkN4IsU76kvJic8x7pisCkN58ReUjwHYaY3AxhCworKxCrE4RuDUCKBsHJOH0qe/MB/D5lRpOcelZQk6VUbmawSMwO0g4KWf28HZuRiBi0Jgq8rAVuW6qMp3YYzALSNgi8otA+7sjMDaCGhy/rA2z0vjJ4zuXVqZXB4jcFcQsKJyV2ra5bxYBDwJX2zVumBGwAgIASsqbgZGwAiMIiBF6FoR2NfCibMcsMZZKd1zWeRtMgJGwAisj4AVlfUxNUcjcFEISCnhqHrOXrmWu8YHBy8KHxfGCBiB0yLgzbSnxdfcjcClIMBJr82hcZdSKJfDCBiB7SNgRWX7dWQJjcAWEGD5J3wbaKkwssZgkeFAue4ZLq3npfydzggYgctEwIrKZdarS2UEVkNAigXLPtBii4p4cKw9HztkbwtfPE7H3IclJZibjIARMAIlBKyolFCxnxEwAjkCWFP4HtAx3855KB6vxIMNuXzcMB3KBu/w3R65JiNgBIxADwErKj1I7GEEjEAHgeL+FKwiulA0JknxknLyRJH5llCix7o5akkpMbJrBIzAZSJgReUy69WlMgJrIjC0P+WFMplrDYFX+KhgFJDn9K+i6GXHCBgBI/AHAld/3B5+01tP9hhuf5Sf/47YRcXPRuCOIKD+X9yfIn+WcD6WG5ZwYrxH8uODh7/rwv8z+Ze+KxSWkBSGksJeFZ75mGCuwOjRZASMwF1AQGPBbyrnx0NlRVEZ+2rqMWvSQ3na3wgYgR0goMHjucRkqQbiq8m4KBYoJCgwLAkleqRw9qDg/63cv+r6NgVm7lPd81FDBibGFw6Qs5IiEExG4A4jUBorGjjuffjgz4Q0aPjGCBiBoxCQAoJyc5Drk2uPQtKJjYARSAh4j0pCwq4RMAKLEUgKihg0G2/lh6XEZASMgBE4CgFbVI6Cz4mNgBEAASklHNrGv3dYGvqzLpZ23srf+04EhMkIGIHlCPx/Os2ziVFQJvIAAAAASUVORK5CYII=", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - 2 R c \\eta_{2} \\rho \\left(c + u\\right) \\left(t - t_{t}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x} u}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ 2 ⎛\n", + "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - 2⋅R⋅c⋅η₂⋅ρ⋅(c + u)⋅(t - tₜ) - c ⋅η₅⋅ρ⋅u⋅⎝\n", + "⎢─────────────────────────────────────────────────────────────────────────────\n", + "⎢ 2 \n", + "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", + "⎢ \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ────────────────────────────────────────────────────────── \n", + "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", + "⎢ \n", + "⎢ c⋅η₃⋅(v - vₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", + "⎢ \n", + "⎢ c⋅η₄⋅(w - wₜ) \n", + "⎢ ───────────── \n", + "⎢ Lₓ⋅u \n", + "⎢ \n", + "⎢ 2 ⎛ 2 ⎞ \n", + "⎢ Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", + "⎢ ─────────────────────────────────────────────────────────── \n", + "⎢ 2⋅Lₓ⋅(c + u) \n", + "⎢ \n", + "⎢ c⋅η₆⋅(s - sₜ) \n", + "⎢ ───────────── \n", + "⎣ Lₓ⋅u \n", + "\n", + " 2 ⎞ ⎤\n", + "M - 1⎠⋅(u - uₜ)⎥\n", + "────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", + "dQ_dx_inflow_x1_lower" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-c*du_dx*rho + dP_dx) - 2*R*c*eta_2*rho*(c + u)*(t - t_t) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*std::pow(c, 2)*u*(c + u));\n", + "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", + "dQ_dx[2] = c*eta_3*(v - v_t)/(L_x*u);\n", + "dQ_dx[3] = c*eta_4*(w - w_t)/(L_x*u);\n", + "dQ_dx[4] = (1.0/2.0)*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n", + "dQ_dx[5] = c*eta_6*(s - s_t)/(L_x*u);\n" + ] + } + ], + "source": [ + "drho_dx = Symbol('drho_dx')\n", + "du_dx = Symbol('du_dx')\n", + "dv_dx = Symbol('dv_dx')\n", + "dw_dx = Symbol('dw_dx')\n", + "dp_dx = Symbol('dP_dx')\n", + "ds_dx = Symbol('ds_dx')\n", + "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", + "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", + "\n", + "L_inflow_x1_lower = Matrix([L[0],\n", + " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", + " eta_3*(c/Lx)*(v-v_t),\n", + " eta_4*(c/Lx)*(w-w_t),\n", + " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t),\n", + " eta_6*(c/Lx)*(s-s_t)])\n", + "\n", + "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", + "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### x1 lower inflow (with relaxation term; zero normal velocity)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡c⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", + "⎢ ⎥\n", + "⎢ R⋅c⋅η₂⋅ρ⋅(t - tₜ) ⎥\n", + "⎢ ───────────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ 2 ⎛ 2⎞ ⎥\n", + "⎢-c ⋅η₅⋅ρ⋅uₜ⋅⎝1 - M ⎠ ⎥\n", + "⎢─────────────────────⎥\n", + "⎢ Lₓ ⎥\n", + "⎢ ⎥\n", + "⎢ c⋅η₆⋅(s - sₜ) ⎥\n", + "⎢ ───────────── ⎥\n", + "⎣ Lₓ ⎦" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "L_inflow_x1_lower_zerou = L_inflow_x1_lower.subs(u, 0)\n", + "L_inflow_x1_lower_zerou" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMwAAACXCAYAAABZa7TGAAAACXBIWXMAAA7EAAAOxAGVKw4bAAANIUlEQVR4Ae1d0Y3cRhbcPey3INwCF8AoA+05Au1lYDuDszKw4C/pz7AzsFM4ZeC7COTbDKQADpCwcAK6VwOWwF03OZzhaxaHXQRGj9M9w6pXj2+7m+Q8XX7+/Pliye3NmzdPA+/beL2M/ZslsY1lBeYqcBUn7fM4yH8HDvQ2+r8Z6Du6ucO67b6IxPFmBValQJyj74PQrkQq+i6veh0/xz4+3N8+9N/M3Q/AuzjGXdiv5x7L37cClRT4qXDcf0Tb/pztJ8wvcSKnJkgB2E1WYNUKRA78+phgtKFpnzB/edzp91bACgwr0B9hhj+1sZ74i8Fh92O49ixePy01uraKzVNI6T84zMVvboQJwXCB413YV/HCuu1VvH6L/eJCL/rStlaxKaDSf3DIwG8qYUKw70K3p2Hf9oJ4H/t4/wvbathWsaml0n9wyMJvKmFCN1wix5W6x9u7aLgNUWte6m4Vm1or/QeHFPxFEyZOyF28sH74IV77/Xj/PbxZaLsNnE8FLF4dRH+trVVs6qn0HxxS8K/ozRI2kgMnJtYMi2+BPWX0+GsNYq1iU0ul/+CQib/oCEMBRZbJgDXL0DYlqYa+O9beKjY1UfoPDmn4LSUMgzdmr8c6K/e1ik1Zlf6DwyT8SVOybkj7Txz0mL/A38T3viywY//gU57xmUuqV8GW1i6E4V8g3JepsbWKTS2V/oNDGv7UhME05oben2IrJ8NBSoF/Hy98rpT0bOPi/+DxjvlAq9jUSOk/OGTitzYl+3fot2Mge5YjDPprba1iU0+l/+CQgt9awvwrhPs7I9izGD3xFDVG0lpbq9jUU+k/OKTgN5UwkRB4EvVT2C8/L4h9TMfwg7Z/xqva1io2BVX6Dw5Z+JPWMHR6IxajCR62/CosFvmwL+L9XdjaW6vY1FXpPzjMxr98/fr18zgQHkh8FidNlUUvmD7eAgt3/HHCYhqE57vwIKQ3K7A6BeLcxDOI+L3YpWRKFsD4ZSeeEEaS/B4vPCrjzQqsXoHFEyaSBE8FfwjLK1IY1V6sXikTtAKhgGINgwU2nhzdb5E4mJItsX7oEG2swOkKLD7CBFVclVpsrXS6NP6mFfizAoqEwWiy61OJUYY/Ge43e98KrE4BxZQM0zH8PJhJgxHnx9UpY0JWoKDA4gkTiYLp2MsCFzdZgdUroJiSrV4UE7QCQwo4YYaUcbsVKCiQPiXrLeBxF3/Rml8F/4pNSo6tYjMQSv/BYS5+6ggTZPCIjaTmFwNyyCo5torNmCj9B4cM/LSECTKyml8MyCGr5NgqNmOi9B8csvDTEiY44XJx6Y79u2i/DcK4fKzelBxbxWbMlf6DQwp+ZsLcBqlPVKdneVcf/epNybFVbMZc6T84pOCnJMzE0YM/A6aAi1olx1axGWCl/+CQiZ+SMMGJyYAHKYc29ZRMybFVbJ4LSv/BIQ0/K2EozJi9HutcSZ+SY6vYDL3Sf3CYhI+EedIxpu3eHmVKaxcegNmN+zLKTcmxVWzGW+k/OMzF/xsdSRlhYo7IqVhp2sU2Lv6JvahVcmwVmwFW+g8OmfhImD86x2i7t0eblLpPR6Me9wUlx1axGSGl/+AwB/9/dCJlhOkOllL3icQqWSXHVrEZSqX/4JCCn5YwMezJan4xIoeskmOr2IyJ0n9wyMK/okNJ9iaOo6r5NdUFJcdWsRkbpf/gMBtfVpeMCtpagbUrEKOTti7Z2gUyPyswpEDaGmYIwO1WYEsKOGG2FE37Ul0BJ0x1iQ2wJQWcMFuKpn2proATprrEBtiSAkgY1gkbe0BtSz7bFytwrAJ4rGZfSw8Js4sXKurzqeLY9WYFrEBPAfxaEzly4SlZTxXvWoFDCjhhDinkfivQUyD7WTI85MZK/C7k1xOau0p9lNhr8B8c5mqQOsIEGRfy45lRsEp9lNiUQs0hAz8tYYKMC/nxzChYpT5KbEqh5pCFn5YwIUxKoTQKXMkqObaKzVAq/QeHFPzMhEkplEZ1K1klx1axGUql/+CQgp+SMDHcsdAFxSlZ6X0eJcdWsXkSKP0Hh0z8lIQJTkwGVo+hVn07Jan6n8/eV3JsFZsxVPoPDmn4WQlDYcbs9VjnSvqUHFvFZuiV/oPDJHwkzJOOMW339igz9hwas9uF/MqS1tZnDbFRc5iL/6CQ3x9dHGnLYR1pjTkip2KlaRfbXMjv4oJa9NVkWxV91hAbNYcE/Cp1yeYUSuufQDX3lRxbxWY8lf6DQwp+5hompVAa1a1klRxbxWYolf6DQwp+WsLEsOdCfjw1ClapjxKbUqg5ZOFf0aEkexPHcSG/YTGV+iixqYiaw2x8F/JjKG2twIACMTq5kN+ANm62AqMKpK1hRlHcaQU2ooATZiOBtBvLKOCEWUZno2xEASfMRgJpN5ZRwAmzjM5G2YgCSBgX8ttIMO1GNQXwWI0L+VWT1wfemgL4taYL+W0tqvanvgJew9TX2AgbUiD7WbKLeIzAhfxGThClPkpsSqLmMBc/dYQJMi7kxzOjYJX6KLEphZpDBn5awgQZF/LjmVGwSn2U2JRCzSELPy1hQpiUQmkUuJJVcmwVm6FU+g8OKfiZCZNSKI3qVrJKjq1iM5RK/8EhBT8lYWK4YyEHilOyrI5S6qvepuTYKjaDqvQfHDLxUxImODEZ7ilSwU5JqsLX0pqUHFvFZvCU/oNDGn5WwlCYMXs91rmSPiXHVrEZeqX/4DAJHwnzpGNM2709yswtlHYU2IkfVnJsFZuhUvoPDnPxXciPkewsp4ubK6YX83dOk+lj33W2VfGbQGoOCfgu5MdgdpZzXDyVWmtLKSR3IjklNimrOaTgZ65hUgqlUd1KVsmxVWyGUuk/OKTgpyVMDHsu5MdTo2CV+iixKYWaQxb+FR1KsjdxHBfyGxZTqY8Sm4qoOczGdyE/htLWCgwoEKOTC/kNaONmKzCqQNoaZhTFnVZgIwo4YTYSSLuxjAJOmGV0NspGFHDCbCSQdmMZBZwwy+hslI0ogPswLuS3kWCegxtxiRbPr30br5exj/si57DhsRoX8juHSG2JYyTI8/BnX/shLB/8PAcX8WvNfSG/7Dv95+C8OYoUiIS5C+i7sF+LKMyG9RpmtoQ+QEsKpI8w8dfDhfxGziClPkrsEUkW7ZqrQeoIE2RcyG8k/Ep9lNgjkizalaFBWsIEGRfyGwm/Uh8l9ogki3ZlaZCWMOF9SqG0yioqObaKXTmkkw+fon9mwuDSW6nYAH8vjn71puTYKrY65sRP0f+KR5tjY7ibck2dv5ufA3Xyd5UcW8V+HKzQYRdtuAGIk3cX73GB6GPYn8NW2zL1T0mY8JTJcD/i9ZSkGvn67C4lx1axHwQtTlzMNl49aFzmTZr+mVOyQ65fH/rACvqVHFvFXkHY9xQm6Z81wpTWLhSC2f2RDSKr5Ngq9pdQx+jy+cubgZ34zOVA19zmNP1TEiYcvY8XnCpNu9jGxf9c50/6vpJjq9j9QIUGtZKhD1Pcz9Q/c0qWUiit6HFeo5Jjq9h50Zt3pBT9MxMmpVDaPE0OflvJsVXsg0FZ6AMp+qclTAx7LuQ3EnmlPkrsEUkW7crSIGUN0/P8JvZdyK8nyKNdpT5K7EcyyN7O1sCF/GSxaxc4/trvb1iGArhv9zTeV71xOVfp4OdCfnNF9PdPUyBOvvfxzd+6JPk99n847Uiab6WtYTT0jXpOCkSS4Ge+H8LiihU23Gp4sd87k3+y1zBn4rZpihRA8Qs8NbzfInEwJbvr3p6F8QhzFmHaDEncxJbewJ6rpBNmroL+/jEKYDTZ9b8Qowx/0t5vXu2+p2SrDc0miWE69iqShEmDEefHc/LUCXNO0TpzrpEomI7tC+Kdqyuekp1r5MxbooATRiK7Qc9VASfMuUbOvCUKpK9helc98IOxZ/HCs2WrupSo5NgqNs9upf/gMBc/dYQJMi7kxzOjYJX6KLEphZpDBn5awgQZF/LjmVGwSn2U2JRCzSELPy1hQpiUQmkUuJJVcmwVm6FU+g8OKfiZCXMbpErFBrh+Qb96U3JsFZsxV/oPDin4KQkTwx3u2B7aWD3m0Oeq9Cs5torNQCr9B4dM/JSECU5MBjx9OrRNSaqh72a0Kzm2is24Kf0HhzT8rIShMGP2eqxzJX1Kjq1iM/RK/8FhEn5WwpTWLhSC2e1CflTkoa2tzxpio+aQhp+SMDFH5FSsNO1iGxf/D0+Xhd4pObaKzdAq/QeHTPyUhOmESSmURpErWSXHVrEZSqX/4JCCn5kwKYXSqG4lq+TYKjZDqfQfHFLw0xImhj0X8uOpUbBKfZTYlELNIQv/ig4l2Zs4jgv5DYup1EeJTUXUHGbju5AfQ2lrBQYUiNHJhfwGtHGzFRhVIG0NM4riTiuwEQWcMBsJpN1YRgEnzDI6G2UjCjhhNhJIu7GMAv3Lyu/jasBj1LfRhh/eeLMCTSgQ5zv+d4HdkLNImLHiatLnv4ZIu90KVFRgtHTt/wEhzpjRY2O8XgAAAABJRU5ErkJggg==", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}- \\frac{1}{c} & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & \\frac{1}{c} & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡-1 ⎤\n", + "⎢─── 0 0 0 0 0⎥\n", + "⎢ c ⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 0 0 0 0 0 0⎥\n", + "⎢ ⎥\n", + "⎢ 1 ⎥\n", + "⎢ 0 0 0 0 ─ 0⎥\n", + "⎢ c ⎥\n", + "⎢ ⎥\n", + "⎣ 0 0 0 0 0 0⎦" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def pinv(x): # Moore-Penrose pseudoinverse of a diagonal matrix\n", + " if x != 0:\n", + " return x**-1\n", + " else:\n", + " return 0\n", + "ll = [pinv(l.subs(u,0)) for l in lambda_list]\n", + "linv_zerou = diag(ll[1], ll[0], ll[0], ll[0], ll[2], ll[0])\n", + "linv_zerou" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/latex": [ + "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2}}\\\\\\frac{L_{x} \\left(c du_{dx} \\rho - dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c \\rho}\\\\0\\\\0\\\\\\frac{L_{x} \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x}}\\\\0\\end{matrix}\\right]$" + ], + "text/plain": [ + "⎡ ⎛ 2 ⎞⎤\n", + "⎢Lₓ⋅(-c⋅du_dx⋅ρ + dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", + "⎢────────────────────────────────────────────⎥\n", + "⎢ 2 ⎥\n", + "⎢ 2⋅Lₓ⋅c ⎥\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞ ⎥\n", + "⎢Lₓ⋅(c⋅du_dx⋅ρ - dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠ ⎥\n", + "⎢─────────────────────────────────────────── ⎥\n", + "⎢ 2⋅Lₓ⋅c⋅ρ ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ 0 ⎥\n", + "⎢ ⎥\n", + "⎢ ⎛ 2 ⎞⎥\n", + "⎢Lₓ⋅(-c⋅du_dx⋅ρ + dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", + "⎢────────────────────────────────────────────⎥\n", + "⎢ 2⋅Lₓ ⎥\n", + "⎢ ⎥\n", + "⎣ 0 ⎦" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dQ_dx_inflow_x1_lower_zerou = simplify(S * linv_zerou * L_inflow_x1_lower_zerou)\n", + "dQ_dx_inflow_x1_lower_zerou" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "dQ_dx[0] = (1.0/2.0)*(L_x*(-c*du_dx*rho + dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 2));\n", + "dQ_dx[1] = (1.0/2.0)*(L_x*(c*du_dx*rho - dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c*rho);\n", + "dQ_dx[2] = 0;\n", + "dQ_dx[3] = 0;\n", + "dQ_dx[4] = (1.0/2.0)*(L_x*(-c*du_dx*rho + dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/L_x;\n", + "dQ_dx[5] = 0;\n" + ] + } + ], + "source": [ + "print(cxxcode(dQ_dx_inflow_x1_lower_zerou, assign_to='dQ_dx'))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + }, + "orig_nbformat": 4 + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/src/NSCBC/dQ_dx.ipynb b/src/NSCBC/dQ_dx_outflow.ipynb similarity index 65% rename from src/NSCBC/dQ_dx.ipynb rename to src/NSCBC/dQ_dx_outflow.ipynb index c8d6646e9..b007c4601 100644 --- a/src/NSCBC/dQ_dx.ipynb +++ b/src/NSCBC/dQ_dx_outflow.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Navier-Stokes Characteristic Boundary Conditions (NSCBC)" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -14,7 +21,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Conserved variable system" + "### Conserved variables\n", + "We start with the Euler equations in conservation-law form, with the vector of conserved variables $U$ and primitive variables $q$. Then we compute the $P$ matrix ($P_{ij} = \\partial U_i / \\partial q_j$) and the $Q_x$, $Q_y$, and $Q_z$ matrices ($Q_{k,ij} = \\partial F_{k,i} / \\partial q_j$, where $F_k$ is the flux vector in the $k$ direction) (Sutherland and Kennedy, 2002)." ] }, { @@ -107,7 +115,7 @@ "metadata": {}, "outputs": [], "source": [ - "# compute the Q_n matrix from Sutherland and Kennedy (2003)\n", + "# compute the Q_n matrix\n", "F_n = Matrix([rho*u, # flux vector in normal direction\n", " rho*u**2 + p,\n", " rho*v*u,\n", @@ -123,7 +131,7 @@ "metadata": {}, "outputs": [], "source": [ - "# compute the Q_t1 matrix from Sutherland and Kennedy (2003)\n", + "# compute the Q_t1 matrix\n", "F_t1 = Matrix([rho*v,\n", " rho*u*v,\n", " rho*v**2 + p,\n", @@ -139,7 +147,7 @@ "metadata": {}, "outputs": [], "source": [ - "# compute the Q_t2 matrix from Sutherland and Kennedy (2003)\n", + "# compute the Q_t2 matrix\n", "F_t2 = Matrix([rho*w,\n", " rho*u*w,\n", " rho*v*w,\n", @@ -153,7 +161,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Primitive variable system" + "### Primitive variables\n", + "Now we compute the coefficient matrices $A_x$, $A_y$, and $A_z$ for the primitive equations ($A = P^{-1} Q$):" ] }, { @@ -278,52 +287,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "## Primitive variable eigensystem" + "### Characteristic variables\n", + "We compute the eigenvalues $\\lambda$ and eigenvectors $S$ of the $A_x$ matrix.\n", + "\n", + "Then we compute the vector $\\mathcal{L} = \\lambda S^{-1} \\frac{dq}{dx}$ and the transverse vectors $\\mathcal{T}_y = S^{-1} A_y \\frac{dq}{dy}$ and $\\mathcal{T}_z = S^{-1} A_z \\frac{dq}{dz}$." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}u & \\rho & 0 & 0 & 0 & 0\\\\0 & u & 0 & 0 & \\frac{1}{\\rho} & 0\\\\0 & 0 & u & 0 & 0 & 0\\\\0 & 0 & 0 & u & 0 & 0\\\\0 & c^{2} \\rho & 0 & 0 & u & 0\\\\0 & 0 & 0 & 0 & 0 & u\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡u ρ 0 0 0 0⎤\n", - "⎢ ⎥\n", - "⎢ 1 ⎥\n", - "⎢0 u 0 0 ─ 0⎥\n", - "⎢ ρ ⎥\n", - "⎢ ⎥\n", - "⎢0 0 u 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢0 0 0 u 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎥\n", - "⎢0 c ⋅ρ 0 0 u 0⎥\n", - "⎢ ⎥\n", - "⎣0 0 0 0 0 u⎦" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# \\partial_t q + F \\partial_x q + G \\partial_y q + H \\partial_z q = 0\n", - "F = A_n\n", - "F" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, "outputs": [ { "data": { @@ -346,7 +319,7 @@ "⎣ 0 0 0 0 0 1⎦" ] }, - "execution_count": 11, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -355,15 +328,15 @@ "# compute the eigenvector matrix S\n", "c = Symbol('c')\n", "rho = Symbol('rho')\n", - "lambda_list = [eval for (eval, n, es) in F.left_eigenvects()]\n", - "Sinv_list = [[ev for ev in es] for (v, n, es) in F.left_eigenvects()]\n", + "lambda_list = [eval for (eval, n, es) in A_n.left_eigenvects()]\n", + "Sinv_list = [[ev for ev in es] for (v, n, es) in A_n.left_eigenvects()]\n", "Sinv = Matrix([Sinv_list[1][0], Sinv_list[0][2], Sinv_list[0][0], Sinv_list[0][1], Sinv_list[2][0], Sinv_list[0][3]])\n", "Sinv" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -386,7 +359,7 @@ "⎣ 0 0 0 0 0 u⎦" ] }, - "execution_count": 12, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -399,7 +372,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -427,7 +400,7 @@ "⎣ 0 0 0 0 0 1⎦" ] }, - "execution_count": 13, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -440,7 +413,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -464,13 +437,13 @@ "⎣ ds_dx⋅u ⎦" ] }, - "execution_count": 14, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# compute the \\mathcal{L} matrix\n", + "# compute the \\mathcal{L} vector\n", "\n", "#drho_dx = Symbol(r'\\frac{d\\rho}{dx}')\n", "#du_dx = Symbol(r'\\frac{du}{dx}')\n", @@ -493,7 +466,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -521,7 +494,7 @@ "⎣ ds_dy⋅v ⎦" ] }, - "execution_count": 15, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -550,7 +523,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -578,7 +551,7 @@ "⎣ ds_dz⋅w ⎦" ] }, - "execution_count": 16, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -609,12 +582,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### x1 Upper Outflow (with relaxation term)" + "### x1 Upper Outflow\n", + "We replace the $\\mathcal{L}_0$ component with a relaxation term for a specified pressure at the outflow boundary to obtain $\\mathcal{\\tilde L}$, and then compute ${d\\tilde Q}/{dx} = S \\lambda^{-1} \\mathcal{\\tilde L}$." ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -653,7 +627,7 @@ " ⎦" ] }, - "execution_count": 17, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -676,7 +650,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 17, "metadata": {}, "outputs": [ { @@ -731,7 +705,7 @@ " ⎦" ] }, - "execution_count": 18, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -743,7 +717,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -781,181 +755,172 @@ "L_outflow_x1_upper = Matrix([K*(p - p_t) - (1 - beta)*T_phi, L[1], L[2], L[3], L[4], L[5]])\n", "dQ_dx_outflow_x1_upper = simplify(S * Inverse(lambda_waves) * L_outflow_x1_upper)\n", "\n", - "common_exprs, final_expr = cse(dQ_dx_outflow_x1_upper, list=False)\n", - "for var, val in common_exprs:\n", + "common_exprs_upper, final_expr_upper = cse(dQ_dx_outflow_x1_upper, list=False)\n", + "for var, val in common_exprs_upper:\n", " print(cxxcode(val, assign_to=var))\n", - "print(cxxcode(final_expr, assign_to='dQ_dx'))" + "print(cxxcode(final_expr_upper, assign_to='dQ_dx'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### x1 lower inflow (with relaxation term)" + "### x1 Lower Outflow\n", + "We replace the $\\mathcal{L}_4$ component with a relaxation term for a specified pressure at the outflow boundary to obtain $\\mathcal{\\tilde L}$, and then compute ${d\\tilde Q}/{dx} = S \\lambda^{-1} \\mathcal{\\tilde L}$." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\\\frac{c^{2} \\eta_{5} \\rho \\left(1 - M^{2}\\right) \\left(u - u_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\left(c - u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\u \\left(- c^{2} drho_{dx} + dP_{dx}\\right)\\\\dv_{dx} u\\\\dw_{dx} u\\\\K \\left(P - P_{t}\\right) - \\left(1 - \\beta\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho + c du_{dy} \\rho v + c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right)\\\\ds_{dx} u\\end{matrix}\\right]$" ], "text/plain": [ - "⎡(c - u)⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", - "⎢ ⎥\n", - "⎢ R⋅c⋅η₂⋅ρ⋅(t - tₜ) ⎥\n", - "⎢ ───────────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎛ 2⎞ ⎥\n", - "⎢ c ⋅η₅⋅ρ⋅⎝1 - M ⎠⋅(u - uₜ) ⎥\n", - "⎢ ───────────────────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₆⋅(s - sₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎣ Lₓ ⎦" + "⎡ (c - u)⋅(c⋅du_dx⋅ρ - dP_dx) \n", + "⎢ \n", + "⎢ ⎛ 2 ⎞ \n", + "⎢ u⋅⎝- c ⋅drho_dx + dP_dx⎠ \n", + "⎢ \n", + "⎢ dv_dx⋅u \n", + "⎢ \n", + "⎢ dw_dx⋅u \n", + "⎢ \n", + "⎢ ⎛ 2 2 \n", + "⎢K⋅(P - Pₜ) - (1 - β)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ + c⋅du_dy⋅ρ⋅v + c⋅du_dz⋅ρ⋅w + d\n", + "⎢ \n", + "⎣ ds_dx⋅u \n", + "\n", + " ⎤\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞⎥\n", + "P_dy⋅v + dP_dz⋅w⎠⎥\n", + " ⎥\n", + " ⎦" ] }, - "execution_count": 20, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "eta_2 = Symbol('eta_2')\n", - "eta_3 = Symbol('eta_3')\n", - "eta_4 = Symbol('eta_4')\n", - "eta_5 = Symbol('eta_5')\n", - "eta_6 = Symbol('eta_6')\n", - "Lx = Symbol('L_x')\n", - "M = Symbol('M')\n", - "u_t = Symbol('u_t')\n", + "K = Symbol('K')\n", + "p = Symbol('P')\n", + "p_t = Symbol('P_t')\n", + "beta = Symbol('beta')\n", "v = Symbol('v')\n", - "v_t = Symbol('v_t')\n", - "w = Symbol('w')\n", - "w_t = Symbol('w_t')\n", - "s = Symbol('s')\n", - "s_t = Symbol('s_t')\n", - "t = Symbol('t') # gas temperature\n", - "t_t = Symbol('t_t')\n", - "R = Symbol('R') # gas constant (kB/mu)\n", - "L_inflow_x1_lower = Matrix([L[0],\n", - " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", - " eta_3*(c/Lx)*(v-v_t),\n", - " eta_4*(c/Lx)*(w-w_t),\n", - " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t),\n", - " eta_6*(c/Lx)*(s-s_t)])\n", - "L_inflow_x1_lower" + "dp_dy = Symbol('dP_dy')\n", + "du_dy = Symbol('du_dy')\n", + "gamma = Symbol('gamma')\n", + "dv_dy = Symbol('dv_dy')\n", + "\n", + "T_phi = simplify(T_1[4] + T_2[4])\n", + "L_outflow_x1_lower = Matrix([L[0], L[1], L[2], L[3], K*(p - p_t) - (1 - beta)*T_phi, L[5]])\n", + "L_outflow_x1_lower" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAioAAADNCAYAAACW7lugAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2dXa7cNtauy8a+bjhuoAeQAGcAiT2C7J5BEgPn3v5m4MBX6TsjPYO47w/gJDNIegR2MoAD5PvuG4jb6AEcn/fhJhVKoiRKpdol1X4XoKLEn8XFl39Liyzq3ocPHw4mI2AEjIARMAJ7RuBvf/vbx7r+22XYMwJl2a/K3vY1AkbACBiBu4KAJvhrlfWBro91faLrB/n9LHcXJFmfS1CUlNUUlTNhgrL1ha6/7wL4WxLySoB8qrx+GcjvR4V/ORBmbyNgBIyAEbgMBFBMPqIoclFY/q3rHs9bJ8n7hWT8s9y1J/dbx0Rl+FnXp7qe6Xq1dezXkk9l/U28UJJ7pLB79zNfKvm/Otd3WfhmbiU4GmexULclpPJHg5+kLcg6KaQjVCNQW+/VDO9AxC30gZp624KceXOokTmPf+T9Z1l6xtb32fNmb4URStULuV+fQMizYKKyhLk4lm2wWAo/+zw4KFwnQLJOzZffKklX//gxscmXfr4TsyqzmeJhJoQpmizM3shvbW1WbPukfJ7J979rZe1zWMeH8uoCM3AoksJuXVblSYXTKD7T/a9FwS7Ac6ic8qdtMmjh8kbCgMtg9lAX9LXiVLXzm+jtX6WdrPd2ivEn8QsDbYyVlO+n8kfuhvQ8Vi76wykG6ib/pTeS69b7QElWyTFab2NyKgyL85dyF7ebJNMcXoo7KnPiuYbbKRtjyF4s6chafKFWmVgteKGLeYp+X5yj5E962injBWN6GDfl5vW9GibiS5//Std/6T5XhuTVEDKRZ3F+UbpN9KtG2okbyTvalhXesx7JD67U3SG3qPBcRWLA2uUbXe91TwcuNoAqZjMiKR8q+K8x/xkp/4iqtMVG/UeMWXeYBmlMPVpD1h7TOo9QPuW/GyVlYZ0UyyletM0fdDF5MxAwQOEy8DLw/KTrWBqs9wWMv40yIicyvtPVW4pVGOVC9lK5rhW+ZrtWNseTZNpFfx2TM4Zhis8nrUXgLOS1ZlublFsy0o5oi3vZn/KVZO1NchRU/oyB9Bleph/r6pHi8ALASwxLLowTvXFTfqthIl4oTygZ9A2uIikeZaJsvTjR76h5sJjp6T0Xt+VFikosz1/l3nZjHtSeZ2Cc3lpnJClHVYOh/EwSvcYk/zVkLWc87osGetv1Mi7RdOiSOhkr51Db/F2iLMmrVYKJem/FrXh4Jn4MloloN2yoY0DrEoNtqW5Rbh51I2/geY0+cHR9JRxG6m1MTuqmN3klnjPd2bxGZJ6Z9XR05QUOKCm/6poy1U8zPHEMycgYMKVAYrF4ravXn5Q+KQu4xRcYxVkVE/EDW17sp+RWlBAHy0uXxtprN+5mnlXusflyVM6r0dDxQDpd0Sw1nqwdKuHhQyN6rHveKAPpHu2reY7eKAXFPOVP5TERvdf1QM+LrDxKN0cexArgy23W0/AUDcp6Ezzvd6h88qeTvdDFZiTun+iiYwZaUJ6UdLGbyUR9MLm+lN9Rg33Gs1jOjrDU4dOOH4+0nW49FaJVeQ3Ve1XiLBIyvc2ex2575Yr1i5LyeTehwnp9Qn68zTF4Y7VhsEQR4F8eKEfd/ibvYVL81PaG6nmwD5RkG85pOER81uivPTnFF1yoGyZDLMdg+Vru7Ha8Aq+12pqKcDjEsrTGSvnRHhiHn+teTmgbzRgqv1tpN8pnTn0OvZAgf07UWUnhDdYY5YkFtrd0Kv9RTPIMTnRPvVPGrsWo117JfyZ2JKmmFXkvasv3qyXNIkropJ2S6WISHwY6zKp0CDYG8XyQC38abEPyo6G9bzyyG4Uxef0kFz4M+kzcs0npq+XJmLMERmNqaEzWJtKMm6HyRXnpTKyr0pipD7AL9RLDq/BVmhYpLUsS8F5C/1QiBnXq46UunhdTLMdgOXPGiks7oR6btomfLgYjzLu9yVh+S8raq/dcjtp75f1KV96umRxZ3mlNiHpO5aIsz3QxoWCS5vkjXd34vT6hOOACgQVpUejJP+zpkUsec2iwniOvvFwNX4X1ZGsCZ9yID+WZ275b9TYkp/zTvh/KgKIdLA0zxGuirsCrJXPDeMGNZCliL3/2tN3LLpTXQPKrajfE0xXaUH6f+GRusd3EfObUJwo65SlSlOUXucF6EZ9DXN0zv4R/2OCh51b/iX6DmBB+C0TZWn0ylqHXr+S/pC9UFWFl3ova8lWVpP1IVDJvGTXmq37qP3we6paBMpjw5KYKgH/3LZMKe/dH0ps7pWHAZVBJExMy9d4uu+kGnufIk1ggc6sxxeeerCnBHHeifLzl0dla9aDn1OmWlCeJhymUxj+LlDcm47eZDMjGAMaV6ncWT0WeKmfOL7RNeTCZJ39k6G1QTYFyl5S1VO8Zy/m3khclk75Q2mBHuWjn4S1XLnWDwtHDVGFDfYL28L0u3o5pN7l1CX6hzcqfvHimXTNhYd1M/UuPYWCfque99NeinKGQNz/USavsWdjc2yIvYYsMKEIoqSWijolzFIn/ULuY4lvVbsSEZQpemuAHZqWXgsF2o/jkUzsfKGpoo2PjLO041R1jIvjTh2jbjEfcI0+Ko9tNEWXr1vtQe52L3ZyCzuItTMfa86K2fDVH2ixu0eQWG8AjuVUVr3hhgpXLcgWdKBHLBd01QxoXhewSnaPpEOJFHBrlQffw7FY08nV5MxDTQebIQxZQqaMUZRV/OgqT7hSxqSvIooiD5euG6TnvmIfEQ24Nvl2ZqOMuTt04pWcG23zA5a0HWULdyZ1VJzGDFgbya5UzxklOaJvKJ0zoyXPCXVLWXr0rzyX1G0RTWtopbYO3uFI7b/U54ugCS5SVrtm6hVfkF/qE4h70DC/SBdIzcsMv5Ut/mDpTY7Sexa/YB+Q/KJvynNU2FH+N/jok50H8aWc5LnoM+M2u5yFegeFNex60DCjOWm1tEPsoR9HJcJ5qN2A2dfbKWLsJ7U88aserhxI4tdmS7PSltGzCiy/zCsp5WPKJCZb0/ZBUvGe3g5hnrUP7pn3mVGyvkqW6L8yVew7vKCj9Zqg999pyXrih+6uhgAl/BMknoxT9hW5e8hDBYJLijex3XTQoGk4pHfwYpBLxjLkVM2AaYEuVRnwqLlQSDzmV8pIfS0Q0zjGqkSelZ4Lp5l+UNZZlKu/EN7nF8okX/t2w0Oli2EHu+8ikqjyKz5s2BF/e7Js6URidcrQ+FYd04JFbw1Aimzd3xenVv/wG6yTyrC2nsgpKTHfixr9F4lssq/wnyxkZ9epdaWmrc+v3oHTw4o06pI3P+Oftijp8GvNODgNvquPkh9vFKw/jnnrMMYJ3/nKRW3SQrZWH5IL/aD0rvNgH5D8om/jOahvilaiqfcfI3XobkpPotIWASyqzXDZDLqnnIV7PlQflxsLF8nfTV+SXqCvzYaEMg9injCbcqXaDXORBPKwVeftNYVPtBhHm1Cfxa4iJk3/KdNs6z3lfqOEV4ojXknZQzV8RH+p630kw1l6JOondEXLX8J5qz7223Clf8fF+0XfEU4Wkw0H5wHaQ/xfyY708AYvlAm32tS4aCPcpTLc9Co1a8QCDxs4z94HkT6OgkF3q+StujdWiy6f7PCpPFhmZWtrjiKxZsurbYvmUB1g2eOqZegEv6oU3py6Nlkfpmbg/kYtlCWvEQ7khTWRUU5+hvpQuyCUXbPDrTrCR5bQTeVWVM+b3QFxbbbObi+KNlbWmnLDs1Xs3n5rnKDMKISZzFHPqkYHzXUof45TKhQwhnuJcx3gkK7YZAhIvucRJhILUWM8Ultc7famxWMYEk/Uc+SNflwZl60ac+TzavjNerXobkZMkvGSxpg7xEpbjEjxn/BR5Kf+0lIcVtaSkkEVL5hl5dqMuxl6yIQPLJYPtRuHvdNEO6X8oXellQI+BJttNiii3pj7Jj37RoyhvPi4jNwoUZUi8w1ym57xMPV5n9KBslLGhKCt1MUapfOAND54D9mOJKsNGeUu+qfa8qC1fVQoXokkItKUnMQ0di1uAoAFQ6eGNUO5BYcnkBkBhEJTfkObKRMYbJQ0LIOiwNPJuA0JLRxkKYCkcYhAlbao85HlJwBFUKw9ZUObem6D8SrISfy6NlS+FsdGUBg2+1M9vwuO93EQ15aEMYUJSWurybUqMK7+a+gQLPrtAOyF/BuehpQwFVdNkOWOe5A/RNrHI5RjchNz8DpZVaWrKCZehes/zqbmn7mizuA1JjtCm5IJlKtcLPefleqmwf8Q4B7lJQUt4lfoEft1lMfpoyE9uQ+KHAkXf6vbD2nou9YEx2Zq8Z948jXJOjR+wLdVbSU7iUn7aEmMRm8OH2hNxp6jISzyp+ym+JZmn8iuFH4N9TbvBKpTKQj/iGP7Un5Cntt3U1ifzQGrj8A8kGegztGeW7bCA0S8Yz9g7F5TBGAd5iMNm+qG5SVHWI+WDvMhGn2Mu40Xgd7ndPinvYFHJ5zr8oKH2SlgtdsSdS5O8VY6p9gzmvbFmUpBvvvnmU10fdH3Ml5TXusTvObzk/qTr03j/7Bj+4nOt69sjefx0TPo8rWR5oKvIbw1Z87xOfS95f6M85CP3eby+SPnyHMMG61NxftHVpElpp1ylKWI4lW5puPIbLKvCaso5WO9LZTpXOpWX/v/vbv7y+1ZX0x7ycPlX1bPi7aK/riFnjs+ce+X9ha7vSCO3Nz7Kb5NtTXL12o38mnYU5W6eY/mq2k0tfsqDNvpDbfy9xVPZvqOMXbnld3S/6vJc61myDbZnhc1qy4r/TJdE+7DsZNpJ7ecmAuei8CaCNeVJvG+9pVfyaaKJB5oxprueFt1Emr4paajTqcox0IaL2uFKspZzPY0vbxS8sbOEB2ENeRjubn5q6hNLTHqrz5JO3q5ZJ5OZKcJYWWvKOVjvNZlvLA5vdq1+qTaAdYe30n/r/oPcbhuvqueV+sCabaNYbyvJKZgWUbBWSQbGylLfKcq8KKd1E/Xajdjzz7q05MNS2eedLKvaTSfN2ONrBcLzUgmMmyXZVMgzt9ckxpA71p4Xt+V70lioaAYm9iesOSgMFeRof8lJgXMT+NE85zKQDAwsmOBKg0vDbguyNsKc8EblRHlknwWmvYslla+q3vcCgMrDkgRnTeQm+kHxFW92PSvNLvrrFuTMgZc8m21rku3k7SbHYuhecrDc96Xc7vLkUJJd+Ks89DP+ZMALY5EUdvZ+VRSs4ClZZ7flmIY55R7mxpMs/axlShriI7mDWXoo/NT+c/KfE/fUcpv/ccubrstl+J0bt9r8a+PdRj/akiy3Ud4leQgjlgfC0tmS9FtNQ5ko25R8inPWeXBKvhS+RE7Kr0ssPhx2aVEpKGz2MgJGwAgYgTuIgN64WR5h0/MuVgSmqkjlmG21nOK5x3DhgBUmWFTu77EAltkIGAEjYASMQESAfzOxFHUpRFm6+8IupWyLymFFZRFsTmQEjIARMAJbQEBv3vwlGosKG8B3TbEMF2MdWqsyrmoZCUB2/5uMgBEwAkbACGwSAc1TbDDdO3Guy97LUCW/yjn1yYXAZ46iUsWwSjpHMgJGwAgYASNgBIxABQLVikoFL0cxAkbgAhHQW8+1isWJk2zy4++Sva8py282iS9n9nBy6Nk2QSrv57pKp4LOLo8TGAEjcBoErKicBldzNQKLEdDEiVLwIjJAOYA4TIu1+Ib0jALBpjsmfI4Gf3OiSbfma8rKvp4kZzpX4WxKCtKCly7+WeDNi/XV55hG4FYR8GbaW4XbmRmBKgTCt0c0efKdHf7R8E5X61tAcFEYhw3y0Ty+V8KhV6eyDIx+TRlZ5pDkRBHjQ6WjhyWO8VTaNf/lgSJ2CXsbxiBzmBHYLQJWVHZbdRb8ghF4pokTa0kiJlE+YFY6LpyTgBdP+CmDMVf55lYPZEF5OobgcayikSxNx8gR0qp84HctFwXKZASMwMYQ8NLPxirE4hgBIcAyROv7OyOopOWfkSj1QZqsUSJ+18UyE9/Vaqw0uke5KH1N+aAw5ECR4ltJjSKje6wVzbPCIZSC4lKL/Afzv0la9ys+c+SBaVBW5LKEZjICRmBDCNiisqHKsChGAAQ0yb7Sle9HYVLnu1Kt75noOVlYVrGoiB/fTeH7IignKEppn8xBfigQQUnRfeu8Cj1jifhULun4KF2wTMhFPhSGhuSHJSQvWx42mH8TqeIm5l8lT8aOJbSL/k5VVlbfGoFdIWBFZVfVZWHvGgJxsmezbL5PJMGAEsD+lHxpJoXNcsUDa0n+kU14hq/fKmzqa8oPFRflCjnhkRQR5OtahlBU2HPTorH8WxHrHubIkzgiM7KZjIAR2BgCVxuTx+IYASMQEdDkzcSJJeOzbPLP8SnuT1FcLBqP5M6xtHylNM0STcwvWHB0X1KSGjkUHhQluU/kme89eazn7mfqkS0pMg0P3YzlD8+uEkH5urxZZkJhmiNPkqGnPKUAu0bACJwXASsq58XfuRuBIgKabJmYWWoJyxHx+SA3t55gsSjt9WDJ5iWMFZ/ll0e6OP8k7T1B8emmQ4HIeetxNiFPrqjw/BIZdKVlK/Igry4N5l+Q9SA/lqimlmpq5ElygPex5U+87BoBI7AiAvdX5GVWRsAIrICAJmAmTSZ8zvdgkkfZ+FpX89Yf/eTV/seP/Fl+4R9CyWqB5eGV/F7r4i/B3Kcw3TaEIkG+DSku1py5FCZ7pUVJSMoH94Hk38snBvX8F+Yf2TXOqDxNrJuys0fGZASMwMYQuNqYPBbHCBiBmzNTmORbZ6do4g5WELlsZmWZBeIDZrjEx3KCUtNYGhSGYgKhLISlEvmh9HSJZR8sOElZgV+wynQjjjw/jTyY8FEQ+AcNB7uhhOTEPhaUqdyCsUb+eR7c18pDXDDrWpnwNxkBI3BmBKyonLkCnL0R6CKgCfyjrl/+rHD+XdP8bTgP694rbjoinok4KCjye6YrKTAhiZ5RGo6aqMUDxYQrUX6f/HCx1JBXozCtkT+Mc6qVR/FQyg5RhpyF742AEdgAAl762UAlWAQjcEIEONcEqwbWlCfx/u0J85tkLRnY5MsZLcl6M5mmECG3xhSCZ3klxWlWIkc2AkbgdhCwReV2cHYuRuAsCEgZaP7JcxYBBjKVXCxZ8akANtu+H4g26E36wcAZAeKDEse/hdZUfGZI4KhGwAhMIWCLyhRCDjcCRuAkCEg5aJZ+TpJBHdPvJcecv3HXcXUsI2AEVkPAispqUJqRETACcxGQkjDbmjI3j7H4p8hfPI9Z0hoT99bCLqEMtwaWMzo5Aiz9vNP1f3T9v5Pn5gyMgBEwAisgoImUfzGxCRalgDNiWL45u2VEMvCPLJaRVltKOlNZ+VcWn0Oo2rSt8pqMwNoI/F8xRDc5YFHhuOn/He/lmIyAETACm0cAxeTHOJGyhNQ9pfbWC8DErkz/jFwrZ37rZVUZgtInlz08JiNwDgT+lzJFNwmKyjkEcJ4bQoABVtdZzdXKnzfRSdqCrJNC3uEItfW4AkT5sf603XMvIWHdeaHyn2LfzVnKqrJgTWHTM2UbJcU5+xgyKmAWKFmrxposiW/PjID/9XPmCpiTvToY5m7+7cCbG29tb+R3lGlW6Xlj4gCu1UzV4jebKIcuTmId/DeHwo6SVen5GyqDFEfIdw8hmy3zVhMMlVP+tB8mUlzOUWFyZxLCqgpx4NtR7UDpJ+vxJqvjfjtyUq/n/ncTMuSfD2gVUPJyEB+fNqDvgnOx38ofHrRz6of+8KuuvE5WK6v4Uvdf6UIZyZUheTWEPOR5sn7Z5HRLNyrrrbTRWyrOnciGpR/TThBQB8Mcy+fo+WLul3S4Y0RXegYqjlVfvLavtIOD8wLZMHEzKPZoDVnFNMgqXherpETgiuVUuannH3ShmDI5MWHiMskzGa61fDJYj8pjVZLslJVyLG7DKwn0lWRAuSiSwmhz4MsLxuNSJMVBgURp/Fn31Eurnep5tbKKF4oTChFjAFeRFI8yUbZinOh/1BhSzPj0nrfWRk9flMvPwYrK/uqYE0bXGpRH3wIroVltyUiDHuW6HhgU15CVt9m1sKuE5yzRxso51H74YOEqdTlRj6sBonxoEygpWB3OZs5X3uCdWz2GyojV4rUulIQWiUdSGHB7CqPCVy2r+IEZLzo1chMHy0uJ1uiXJb4n9VPZx8aak+Zt5vMRuJqfxCnOjABvXYNm2JmyoRQUecmfASh9bZdTRBdZb5QOeRmYOSG1Mc/rnjea5jmTOwwgeu5uSJwtq/gz6L/QxbdnuH+ii4kikMLnypaSLnYzmcCWN+uX8mu9Oc9lnvEslrPDjzI/7fjxSDvoYl6IVu01VI/VDFJEla/XFuXHd5BoV3wigKhMpk0blR/WAhQD4hGGEsa/g/g3S6ndKahMip/a0VCdDSl/JYbUdUkhDBYZ5YXFq7XPRX6jZS1lsrIfdUkZSxajXr+UvCfrVyvzXq2Nroy32XUQuN959uOGEVAnTW9idLCjSLwYLN+XmCiMCe8nuQz8b3Ux2c8mpWeA5+u/8GGzHc8HuZSDwaxELG0xKDak+LNljXkxwLPOzwALZuQbsIvhc2VT8iA/J6rCewn9U4leKz2YvNTF82KK5RgsZ85YccGROmjaD366mBxZbuhN4PJbWtZePeay1N4r/2JblD/7jO5lF0pIIPmFdqYHysVyCYr2K11hf45ccDjIbY7xz+8J69BUnT1SfOQcpJjnL3KDBSM+h/i6py+Af+jfcluKq54HyzqY4boBlC1glrOVXL1+Kb8lfT5nO3h/At6rtNFBgR2wGgL3V+NkRreBAAMa+1PCYHdkhgwy77o8xJuBnT0MaTIjr8+78SqfHyoeE0Qwjct9H9NRDhSgEhGnOygukZW3cAb/FlZ6TpPAEtmSvJjmh+RPcXqu8mZ54m0mA7IxWaaJtZemwmOqnDmL0H7k8QxZojxMjk91X7SsKWxRWZWuVI/yrifJtLQtUrff66JstIHcUgTWqd2znPGbwj/IRalJ/rq9IYXV1FnOMyXtukEZiZ60QWQ7iD9paQO0hTwOwVshcOn2SWQr9Uuwn9vn4VVDs3gLU5Rw2tAQHd1Ghxjbf10ErtZlZ24nRqBoYo6D3SO5SbmoEYMBko7aJQbv5s1aPInDwHrQPZ2+O2CRb3dNnWUdBqugJMhlySUfMFjy6KaRV6DeZCHf2bIqTascem5NAgtlCwLqh3oYkj/FKbkoA7lCwJv4QbKEepDL5IXiMUVstEwK2Gg5O4xC+1FarDm1tLSsrXpco2zi0bTFMeETNnKRHQUkUJQBRT/gjafu792EDv6O1llMxQTa8BzghFUkLZ2g5NIHUKDCkk9Mswhr8V3SbmKWVU5QqAsxH8ivVW7JUt3n58o9h3eUlT4/ZulqtdFC+ey1EQSsqGykIirFoOPlE11K9kI3L3mInZ8JEFP477oYSBgku+nGBp80CSrpH1TgQX4sETHAjhFy54oKz+zNYOklKEFZYhShbv6zZBVPBlCunE+YBGLYQW4aYKtkU3z2PEDwxULUlEdhTBSjmCsO6ShbbolBIWze9hUHLKawVJQbijxry0kiytra/3DDqf0rvsWyyn+ynBmnVj3OLVvk0y1bxr7qljrJy0v5W8p8xJB4vb/ox7DROquSoh+JyZN/ynTlqaqfLruF2HbZjD0PKWJD/RJelKXpI/G51eePkLuGN5Ywxjwsaiw7N/1MfolabTR52t0eAve3J5IlKiGgjsYkAXUHWiZNTJzvQ6gmTN3z5vZaF4Mh9yksRgkKDZMiHbVLPX/xqHnL7/LpPgelQbwYZNIExH2XkKn1FqQ0PZliop4/suqivE2Z9Qx25AV2WCC6NCqb0jNxfyIXKxHWiIdycyWoBvNQVqULcsmlnPg91bWIIq+qcsb8HiijVvvpZqx4Y2WtKWdi2avHFDDDLdZvTfpUXrnwSBSU1fQg952ua8UBEyazpKClKLV1Bh+wLVKUJW/TyIRylJZ8DooT+rfcXN4ivzN4UjbK2KIoK/U8RKP9aihRpf8ob8kWrIZysT6WlBSyWaONVorraMcgcKXEf4oMknsMP6c9AQLqaLwdsHwC0fFwGTwY7BjgmrdwhSXzMoNsWJ6QX/5WKe+GeItEycknXd7y+ctnGoDIJ1hrmlTzb5iM4clgTV4MHEwKpUGZsnStP/IKb7xzZE3lYKMpgywYgCF7Et7LTVQjG/LA76C04P2W+0Tyq8GccnHkO3VJ/li8sHTlsshrNk2WM+ZJ/hDthzfboXwHy6o0NeW8yeWmTZbqMYXXuKlsS9oiabpLXPSJXCbethMOlO3fulIZdRv6VU2d0aaTjKRrSPzTmz1LTvwlGKWI9sNepTCBxjjUD3FQtIf6a8P32BvlgbxgASb0K15GfpfbxUze4WyXfIzAL1FpDCGspl8lHnPdSd4qxwMxTXU7xB/M8/YwFM/+50HgLynbK938Jz4kN4XZ3QgCcfAoDSA9CRWXTZLEpROGAU/Pz3TlA3BKx+BER20GRsVjQFq184onA3IYlOVC+f2Nj34Vj8EFtzQozpJVPJgQRq0HMa8a2ZALZQcKCqD48wYeyiG3BnOUShSEYtkD5wU/4jdZTsWhPVS1H8UbLGtlOQ+KN1aP1aUUn8VtUWlbuOgZBRNFIG9b/yO/jzKB3mf33NbWGQr3407a8Kj8etjLj3zon4FKcVLYqdyIQ9PvJ/Lhb96llwqS9folnuJf06+IOpsqedNP38Jc8Xvjn/xWaaOzhXeCOQj8K0W+n27sXgwCnFeCtQJrypN4Hzpst4QKYzDH/Fx8G+zGH3jOB/6BKNXeadDrJVhJ1h7fSg8GdL7j8kWMjzXkYZa2BnMmyknFKeN5rtuxstaUE7kH6/FchVK+zcSVycC/ndKSD/u8uv9uq62z10pL3EuloJyXCnfmflkSKfkFxUryMRaW+t0W22iS3W4HgXvffPMNHQzzOGvwa046naz8uFUEVO902kHjDCEAACAASURBVLHlgJOLHgeU/G/RxTy3IGtRsBFPyYwiyHkuzVv0SPRdB9XW420XUnKxsZNzTEqWxZ44ijerzhSfZc0v5Q5ZHnp57MEj4sCGeZTzQVL42ceQQeE6AZIV5WVyrOkk8+MtIxDriXHz3tUt5+3sNoiAGgL7R4Ip9IzifS8Zuqb3njgbkbUn15iHZOYF4OKVlIhBVT2O4XWKMNXBrOXMBXWW3tBn5XOKsq7MEwsbZRulnfXLTbbRUYDveKAtKne8Abj4RsAIrIOAJmuWW9msfBGWaZVjllVpHRTNxQjcIKD2h+UrWFTuGxQjYASMgBFYBQH+pZSfHbIK0zMyoSyXZiE6I5zOeikCVlSWIud0RsAIGIEMAb0BsnSJRYW/JO+aYhkuxjq068qw8AfvUdl4I9CAwXdITEbACOwIAfXbyX0dOygOZ7rsQMx1RFRZpz6nsE5G5jIbASsqsyG73QTuPLeLt3MzAkbACBiBbSHgpZ9t1YelMQIXiYAUbs4rYXPm2Uj5735J5mzgOWMjcEYEbFE5I/jO2gjUIqBJlr+PcygZlCZ8Dixr/aVbz9cKZwMkh9NxOugb+dWeSqvo65PyT+dWnPXfMOCgi38ReIPo+tVsjkbgZAjYonIyaM3YCKyKQPgGjCZZzrzh3yXvdHFQY4sUximcb3RxXDwHkJ1bSUHB4uOYpdNBW7IPPSjtmv+k+UH8LmH/yBBc9jcCF4cAigpvObxhMPCZjIAR2CYCfK8Ea0kiJls+Jlc6up3D5RYrBimDlVzkPFbRSBako0USXuByLRcFymQEjMB2EaCvBusnSz8MAgwkeLbMyHo2GQEjsA0E6LDFbzYVxEvLP4Wg+V6a1FE2ftfF+MC3oRorTZzwWZIinA/z8SmG/Bh5lILiUov8B/mKTzWJD+VFYeNbRFibAuke60nznPzlBmVFLktjJiNgBLaJAP0a3eQVFhWTETACG0dAE+4rXfmLBJM/3yvJlYKDnpOFhcn4aBI/vmHDt15QTlCUUEpy+qceXsfwl7rnOZD8eAnKZY4h4Yu2U3ybuGM3yuOBwj+N+bNhl+eDXHBgoCsRS2N35ZMGpfLbzwjsCgErKruqLgtrBJpJmM2ynxXwYHJmf8rRG1fFg7eZ/ONt8Gy+MKxw/kXzVm5SlgjH4hKUBd2jqPSWlKf4Ks0ceqjIKHHggaxJMQKHIQsUcZDNZASMwA4QuNqBjBbRCBiBiIAmYiZYlkw+yyblHJ/i/hTFRXl4JHeOpeUrpWmWTmJ+SSkhT6w6+bLOIzxjPG7JMykOPCca5Ku0KEddJQK5+Y5OTizroKAEhUzuEwWSNhHLUN00KaynPKUAu0bACGwPASsq26sTS2QEighoMmYC518/YdkiPh/k5tYTLAm58pB4sWTD0gzxWRZBqfhEV9p7guLTTYeikfPW4w0pLmHIk1stUGryfR/BwnKTovU7xrcrA/Ky9DS1VEO5c0WFZ/bLsCyUK1cIgtzFchFoMgJGYFsI3N+WOJbGCBiBEgKabJlcmYg5B4TJF2Xja12NdSD6yStsFsUNJH+WRfiHULJuYKF4Jb/XuvjrMPcpTLcNMcGTb0OKizUHQhE46Dmkk0s8/J7iD8mvl/4m5NDzV9zEN0ZZ5ATlQ7yQIylDQc4ON2Rlj4zJCBiBHSBwtQMZLaIRMAI3Z6Yw+bbOTtGkHCwQctkvwvIHxMfkcImP5QSlprFIKAzFBGISD8sj8kPp6RIWEiw4SVmBX7DKyIXfjwoj3/e6sM6UlqPYN4KSlFswxviKzSJCQUJWFBDywrLDQXMoRV1C9p7lphvJz0bACGwDASsq26gHS2EERhHQBPzRWASF86+c5m/DE3Gfx/hM2EFB0fMzXUmBCcn1zIQ/NKGjALG0ki/1hHSdHywl8GgUoQm+neR1j1GOXJb8vmGieChbhyhD4+8bI2AEtovA/e2KZsmMgBE4EQKcN4K1AWvKk3j/dmZeWGkmN+aKN3H4J1CyyszMJkTPrTFL0udpkuKU+/neCBiBDSNgi8qGK8eiGYFTICClgaWXxRSVjp/lsuQzSYrHUhSfAMACU5UmZ0r6/HnpvfignPFvoTUVn6XiOJ0RMAKVCFhRqQTK0YyAEbhBIE70LBtVk9KwfyQsu1QnWj/i95JhtqK0vhjmaASMwBwEWPr5U0yQ3DnpHdcIGIE7hIAmek5/XbSMc1tKgvJhg2+Pbiv/Xsb2MAJGYAkCf0mJUFT+Ex+Sm8LsGgEjYAQaBDTRs3Syyqm3DdMT3EjOv+vKz1Q5QS5maQSMwIkR+Ffij6JiMgJGwAiMIqCJn2UbzlyZ3EA7yuj2AtmLssbZLLcnsXMyAkagiIAVlSIs9jQCRqCDAJP+bqwUUaG6jgpWpyh+NAJGYE8IeDPtnmrLshqBEQSiBSEdic9fglkCYbmGjxdyUBz/dmF/CYezcQjbnH//MOn3/n0jv2vx4q/K/OU58JMbLBlym7NTFF5NK/LE+oN8xTNVqgVyRCNgBM6KgC0qZ4XfmRuBdRDQ5M6JrHwTh0PfOBPlhe7Tv2x+0DPWEJQXPuSHAoHigdIySTFe798y8oc/x/mTJ5tsU35v9FzFu5v5yjyRY9a/k7ry+NkIGIHzI2CLyvnrwBIYgaMQ0OSOEsJR9Wn/CJaTz3U91PW9LqwqnHuSWxZQKt7pOsgfiwgnzUJYX/ieUH70PEpHiEuEjOCP4sO3hMg/KDNyOVr/cRZvzm0VT/FHJv7y3LPyZJkhzyKFKePhWyNgBM6MgBWVM1eAszcCKyDwlXg0yziavJmgG0VDz1gVsKoE0jOKCf/eCYqF7lmqYdL/VRdKxz90obAkeqCbFDf5HRQ3HJwm94k8GyVIz/BP3xDivmZTK4fCoexM8owCsKQz9WHBknIVk9sxAkZgLwhYUdlLTVlOIzCMAIpEmOAHomAtyfeLMMkn6wtJvpSCgOKC9QGlo7tpFt7kMUTwaxQl3bOsxHLQQS4K05LllzGenJOCJQUrEUtOjZIkv5wozxgueVzfGwEjsFEE7m9ULotlBIxAPQIoA0zKDWnyThta8WdvSmNh0TOKQ7B4kEBhSUlBOcAKwR6XhmLaFv8m8OaGNFzwIl6eF95LaJCn8khKEFaYISWFPJFlyuqyRDanMQJG4BYRuLrFvJyVETACp0EAawZLN0mZwPrxMmaFX5jY4zMOCkmzt4N0urA8sN8kTO5yP9KVL/ewLJPiwSMneD1ReNjnIrf1FeY84oz7QZ7iT/ly2YbYopA15RyKZH8jYAS2jYAVlW3Xj6UzApMIaOJGyShOyApjiadZ5tFz2p8SlkTipI/V4V7MCCWgRFhoyCNfQgrxunmUEs/1m+CJohWsPor3TFdPMZJfKIdcL/3MBd/xjcDGELi/MXksjhEwAqdFoJnkyUYTOZYJllCY8Nn78UIXJ9C2LBZ6RtlhCSlZbfR4NgpLS5Il/JtpQIqkWA0E29sIGIG9IIBFJb2NhTXmvQhuOY2AEViEAIe9Nf8AgoMm/J5FosRZ8VBovtX1UldLkSnFP5Wf8k5jVjELhaPAcIS+rSlFhOxpBHaBAC9HwVKMRYU3JHb5P9RlMgJG4IIR0OSNslGlmJRgUNre0k8p3pn9vpeczXLXmWVx9kbACCxDAOtv+AciFhWTETACO0VAE/KHc4iufM+RbXWeJfnkl/bhVPNxRCNgBM6PgBWV89eBJTACixHw5LsYOic0AkZgJwh4M+1OKspiGgEjYASMgBG4iwjYonIXa91lNgIzEJDV5lrR2dTG8focsPZGft2zWeRtMgJGwAisj4AVlfUxNUcjcFEISCnhqHrOX7mWmx+Vf1HldGGMgBHYJgJe+tlmvVgqI7A1BDjl1f+k2VqtWB4jcAcQsKJyByrZRTQCKyDA8k/zfaAl/GSNwSLzXFf3HJfW8xLeTmMEjMDlImBF5XLr1iUzAqsgIMWCZR9osUVFPDjS/lO57G3hi8c8H+SGJSXuTUbACBiBEgJWVEqo2M8IGIEcAawpfGH5mJNeOVCSjx6yIZcPHKaTbeHd+lqznk1GwAgYgQYBKyoNFL4xAkZgAIHi/hQpG3z7B0VjkhQvKSdPFDmcNhkTPZZ71JLSZOaOYASMwK4RuJL0f4olSO6uC2ThjYARWB0BlJHS15n5gOFLcpMiwhLOI118S+h3XVhMPpN/Nx28ckWFZ74dxLJQ+Nignk1GwAgYgb8kCLCo/Cc+JDeF2TUCRuCOIxAVEFBo7U+RP0s4H8tNSziPdM83hF7r4uvL3Kcw3bYoLCEpDkrKA108c28yAkbACCQE/pVurtKNXSNgBIxAjoAUied6ZqkG4mOGuCgWWE6woLAkFCgqJtyjcISlHPmVPmD4VOFfK+w3uSgoHCDH145tTREIJiNgBPoIWFHpY2IfI2AEhICUCf6hU3UCreLyt2PiorwEBUXPz3S1vtSsZxQTrkT5ffKzawSMgBFoELCi0kDhGyNgBI5A4DGKidJjTXmie6wub4/g56RGwAgYgYCAFRU3BCNgBAYRkMLBXpRf5Y7+NVnhmzxaX3IlS89gGR1gBIzAthHw35O3XT+WzgicDQFN8lhIjj0/5Wzyk7HK8Hdd+b+MziqPMzcCRmA+AlZU5mPmFEbg4hHQ5M6mWf690/q3z04L/oPK8e1OZbfYRuDOI2BF5c43AQNgBIoIMLFfhCUiKlvXUfkqFtaeRsAIbBcB71HZbt1YMiMwikC0EqTD1TgllmUOlms+0/WLLvaVfKyLQ9g482TOPhIm9u5hbQf5XYsXf01m82zgJxfry7dy+Qsz9/+ji8PeRve1KE6RlO4UeWAZgq//ZVRE3Z5GYLsI2KKy3bqxZEZgEAFN5pxD8pNc/hLMv2te6B4lAeJrxFhDUF74vg5/F0bxQGmZpBjvfTei/OHf+7Cg/L7SFXgrDumSgqTbeXTCPN5Ikubcl3lSObYRMALnRMCKyjnRd95GYAECmsxRQvh2Tto/gmLwua6Hur7XhcXjZ4Xn1gOUjHe6WqQ4KDuE5YTS0YsrP/iXPiyIApB/r4fTaRdZU5bmoTJgMRpbqkKBqlLUFM9kBIzAhhDw0s+GKsOiGIFKBLBgNMs4mqCZhJuTXfWM4oBVJZCeUVz49w7xGtIzy0SlyRvFpRWXRIoflA+5nFabK0EsqbSUhCwueddsZGXZCOVrdh7iDyEDVqYhKileQ3HtbwSMwIYQQFFhYGAt2h15QxVjUYzACAIoEmMWCw5by4+vZxJP1pfAVgoB56Pgl8cLYfqBN3kMEcpHUEzEh3gsMeX8GyVH/ihQS5Zc5uTBUf+MYViRvtCVK1HyDoRCNoZZjGbHCBiBjSDAmBL2yd3XDR2YQeehLpMRMALbR4DJv2UJ0eQcrBZy8UdxIE6i1tKMwlACsLAUJ+6YtsU/MYouikh6sUEpakhpsdLkSksTNvOmOg/lGY75l4tVpqSkkDXlGbO4zBTP0Y2AETgxAo2lFouKyQgYgX0hwLIPH/ZLygRWjZexCPiFiTs+49Dhw5uJ0hA3femYsCFiGYZ9HyVlBisMm3fZoIpCgYKAohQ+NDiQRsGzqDoP5UeZkGOMUNYCBmORHGYEjMD2ELCisr06sURGYBSBqAgUJ12FYc1oLBp67lpPsJxicWG5BEKxQen4TleulKB4kEdvaUjxWnkozuo0Mw8UsbcIoXTPdHU/hIgiQ1hePrxMRsAI7ACB+zuQ0SIaASOwHIFmEocFk7UuLC6tybzLXnFQRlBoktWmG2VLz2GZS7IOLTslpWtLMlsWI2AEKhGwRaUSKEczAjtFgMPemn8ApTJoUmepBIWlu0yUohwUJyzpyH0Z4zdhW7qRbFhKhixMKC8coW9rypYqzbIYgRkIWFGZAZajGoG9IaAJujiB15ZD6dkLE5ZOatNsLN73kn9q/8rGRLY4RsAI5AhYUcnR8L0R2DgCmnQ/nENE5XuObFfJsyS7/O6twtxMjIARODkCVlRODrEzMALrIeAJdj0szckIGIF9IODNtPuoJ0tpBIyAETACRuBOImCLyp2sdhfaCNQjICvOtWKz14XTbDlQ7Y38BjfhKtxkBIyAEVgNASsqq0FpRkbgMhGQUsLR9JzHci23+cbQZZbWpTICRmBrCLD086coVHK3JqPlMQJG4PwIcLJrc5Dc+cWxBEbACFw4An9J5UNR+U98SG4Ks2sEjIARSAiw/PNTeljiyhqDRea5rta5Lt3nJbydxggYgYtD4F+pRCgqJiNgBIzAIAJSJFj2gRZbVMSDs1g+lcveFr5wHM5mibxRgkxGwAgYgSICVlSKsNjTCBiBDAEUicGvLWfxxm4fKvCVFBM25HKMfzqEDd7hOz1jiR1mBIzA3UXAisrdrXuX3AjUIlDcn4JVRFeVNUTxknLyRJl+l2X8WPdHLSllvHxrBIzABSJwdYFlcpGMgBFYFwGUkdJR/C/k/5KspIiwPPRIF98W+l0XFpPP5N9NB69cUeGZbwmxLBQ+LqhnkxEwAkagQcAWlQYK3xgBI9BFICogeLf2p8ifJZyP5aYlnEe654vMr3X9Nd6nMHm1KHwgUHFQUh7o4pl7kxEwAkagh8BVz8ceRsAIGAEhIEXiuRyWaiC+pIyLYoHlBAsKS0KBFIaSAqFwhKUc+X0dfNo/T/XIhw5/k4uCwgFyfOHY1hSBYDICRqCPgBWVPib2MQJGQAhImeAfOlUn0CoufzsmLspLUFD0/ExXUmDkHXiimHAlyu+Tn10jYASMQIOAFZUGCt8YASNwBAKPUUyUHmvKE91jdXl7BD8nNQJGwAgEBKyouCEYASNwNAJSTHy0fgWKwol9PWGPTkX0TUa5hDJsElgLNYiAFZVBaBxgBIzA3hDQJHotmdlH87Eu/oH0g/xaG4HldxaSHOz5QUlZTVE5U3lRtji0r2pZ8CxgO9OLQsD/+rmo6nRhjMCdRwDF5Mc4ibJXZhNntDCxS5Y/I9vKNXTr5VUZguInl6U+kxE4OQIoKmj3nHXw7uS5OYOzIcBAqYu3zLOSZOCtcpS2IuuokA6chUBNvc9iOBz5syyI9j70F+ks2mlvVXYsPC/klv4FdWzmZymvyoI1hX+CUbZBUvgmxp1BAbMAyTo5NmXRfXt6BFCIwzlMLP3QmTmACc+zd2rJcOdJHQbzNRXEWxhvYG/kt9jMqrS8+XAy6GomZ/FbRJRD13e6ugeBBX7yP4usyvdbCcBAxSFlF/lX2aEyyp/2xiSKy790GAeYgDj2HuLvxEe1HaUfrfebbI7/7chJnW5h7wxy5IfcNQWVvPzNm4Pz6OvgXOzn8ic9fYP6of+ENio3r5fVyiu+1P9XulBGcmVIXg0hE3luqi830s28UTlvpY3OFOsuR2c8oo29wqJi2hgC6jAojW908X2VL+lAS0VUWgYcDuAK5toj+NBg1iLM1QxwLVpL1hbT+odQPsmwCyVFci6pj2IZxYu2wReNUWaZmJgwcZnkmQjXWj4p1rv4r06SnbJSjqPa/UqCfSU5Wn/TTnzlT3sDX15I+JxAjxSHARul8WfdUy+9Niq/1corXihPKEWMHVxFUjzKRNl6caLf0eNOMePTet5aGz1tMS6LuxWV7dZn8fsqC8QdfJubyQvL2yqkQYzJ47owwK0l6xI5eaPdwqRWK/uS+hgr41B74zj8JXn1yjFS7724x3goH9oRSsqvus5qzlf+YJ5bPUpFw2LxWhcKQouUPikLuEWFUXFWLa/4gRsvR1NyIytxsLx06Zx9uStL9bPKPTQ2VfNwxPURuFqfpTmuhABvUUWT6kz+KASDfBTGgJK+zcJH5hZZb5QOeRloOU+jMbfrnjeU5jmTPQwIes43F47KmqWtvlXexfLJn4H/hS5OSOX+ia7XugIpfG55UtJFbiYPdcGb9Uv59d6c5zDPeBbL2OFFeTk1tku0nbyOuuFzn0v1PpdHiK/y9epWfr8okHbIAXTEYyJttWn5Yy1AOSAu4Shi/EOIf7OU2qqCyqT4qR0N1duQAthlSF2XFMJgjVE+WLx6e1zkP1nebkYrP1OflLFrMer1Zcl6sj61Mu/V2ujKWN9ZdvfvbMk3XHB1uvRmRYdZTOLDwPd+iIHCmcB+kstA/lYXE/dsUnoGaz4qBx82z/F8kEs5GJxKxNIWA1wgxR2VNcWb44pnsXzyRz4GeNb6GWDBGVkD3jF8bnmU/Cj6p1K/Vt5g+FIXz4tpqow5Y8UFezBp2ht+upgcWW6YNXnnvAv3rXovhFd5SaahumWP0b3sQgFpSP6hbcqDsrFcgnL+SlfYoyMXLA5y8e/dE9ahqXp7pPjIWqSYxy9yg/Ui5Ulk3dN3wD+MB3J7iqv8RstbzHRdT8oWcEpsJRPP79MzrvzA/SR96gS8V2mjefl9fxwC949L7tQnQoABiv0pYfA6Ig8GjHel9OLNIM2ehDQ5kdfnpbgVfg8Vh8E+mLnlpkGKcqAAlYg4+QA3KGsp8ZTfRPl4E2cCaOGr5zQRLClPEEk8vtWFElRNis/yxNssf+RiomRwX0pTZcz5hvYmj2fIEuVhcnyq+6I1Tv6zyxkz7NZ7LkfVvfI+pu1St9/rony0gdxaBN6pv7Cc8ZvCP8hFqUn+ur0hhdXUW84zJc3doIxED9ofch3Em3S0AdpCHofgLRG45P0Y2Up9GdznjhHwqqFZvIUpSjhtaIiObqNDjO2/DIGrZcmc6sQIFM3FcfB6JDcpF1NiMNjR6UrEQNy8KYsn8RgoD7qnE3cHH/LtrpGzrMPgEyZ8uSyf5AMASxjdNPIK1B34B2UVXwZvJt4pYqNhUj4GyycmrTA9tyaCxGNmeZJslJeyzCGUgVwh4C38oPxD3cmdVR8x49EyxjjJCe1N+WDNqaUl5YR3q96V59p1Oyq/8kttlTKjgASKcvByEDDHU/f3bkIHf0frLaZiEm14FjhhEUnLJij19BmUp7DkE+Mj61A/ilHKjngvwbfMrOwLnt32znOrzJIj4T45RsyVeQ7vWAT6+6CVS2GtNhrT2DkjAlZUzgj+SNZ0pHziSlFf6OYlD7EzM6Fh2mZ9nIGBQS9PVxpEFC0Qg0kYPOJz43R4BH/5sUTEgDlGyJ0rKjyz1wKTb1CCssQoQnn+g7LGtFN5Z6zDbbF84oV/NyxMBDHsIPd9ZDanPCn/WZNKzBMscssTCmTzpq84eZ2GfOQ3WB+RZ20Z4Uc5e/sfQkbDP7PKmbFp1btkpV2sUrdZHjW39J28zGDQegGIOBKv99f+GDZabzVCdOIwefJPma4sS+onsF6Ib0es0ceSIjbYl8WJsoyOEUfIXMP7ufKnP2FNY5m66WfyS9Rqo8nT7vkQuDpf1s65hIA6Dm9AUHfQ/EJ+mCzTJIqFA2tGeGOSywDXsjromd37dLoSMUG0OiTpdeWDdyndlF9QPsSHQSNNlmxeLCkqzVuN4o/JOpVnKXywfMorYXjQPfghK+XGCsGyQE6T5REPygdRXuqpGYgjfya7IYWSvJEjyCSXOsFv6OwKoo8SvBI/Iup+sIwKIz/kbrU30nVJcY8pZ2JHfk29J8+Z7mDd1vBJZZabt0mUpcbCovt3uq4Vh1NuWQ4D02T5IJvaeoMP+PZI/LpYIA8vI2nJ56A4YTyQm8va43VGD8pGGRtCVl2UbYgm+9RQwgr/Ud6Si7NSsLz2lP+Md7desiDfngOBq3Nk6jzLCKjzoO0/iaF0Jm4ZCJjoGLCaN0+FpUGTATOYheVXUjJ4G0TBCR1YcRPx1s5fONOAQj4vU+BC92nkyUREfrytlJQUeYeydAeLIVmJP5fGypfC2EvCIAtu4M6ehPdyE02WR/Ep3ydyA/ZyOYE0x3pKoaROw2Qol7xRaLCM5XLIazZNllF50N5Sm6K9Yf0q5iv/Y8uZCkB+3XpPYbVuKtvStku67jIX/SiXizfuhAV97d+6Up/TbcCtpt5oC0lO0gUS7/RmjwLExI6iiFWNvUrhLT/GAS/irPESEfKe+lFeyAsWYMLYwQvQ73K7mMk7nO+St3f8oKG+/FRhjDs1Y0RgNONnkrfyfSB+qV6HWK/RRod4238BAlcL0jjJiRCIA0FpMOjlqLi85RGXTpUmyWfyywdT0jHIMOiEOHhAisfgkg/Mwf+YH/FkgA2DbOST3zesFY/BIsnQ+OumKGseofZ+rHwKY1KosSDUlAcMmTgpD8rkW+4TyS/Vx5BCiRKKglDEKvGZ64rfZBkVh/ZT1d4U79hyHpTfUL3PKp74HNV2lb6FjZ6pN5SBfML9H/l9lAnWndxq6w1LyOOMT7hVXj3s5Uce9OdApTgp7JRuxKE1Xozkh+WvZO0p9mXxrulTI9kNB1Xyph+GPqr4vfFSfqu00WEpHbIEgftK9KeYMLlL+DjN7SPAeSW85WJNeRLvW5MkIsmfQRlTcu+tjvAZlA/iM5IVo6ZBrBW4oqwtvid+YGB7F/MIyojK8UXKU/e8OUNMQEE5kh/1lohJMvgnj0p3zfqoyfLYcpJHsd5rMj9xnGbyyvLhH0/sYaCuWI7p/iOutt5eKy1xL5UaBTwvoHBba9zJ2a5xH5SqWK+lfrfVNrpG2ffG4y9J4HvffPMNnQgTOObr2x78khx2T4yA6pYOOGjaP3H2Dfs4QGAWLg0SId5WZG2EHrmRrCglvDFz9gLKIEs3nIsRLCly2feQ/iHzZ91j8sa8n9bxOculeYtW2CZJMi4uJwVSeib80Xo/V8ElG3uKmjqbkkPxqefqelN86pxPYYRJcor/XsIjDmzqps0XSWGbGHeKwnU8Jetm22hH1DvxGOuDfnbvgKKi64Oujz98+HDwdbkYqI4fnLt+a2WojXfu8jj/uv5yl+tTZX+m67tLayuUibJNlUtxzj7uTMlI+F7krCnLJcShbelSUT4cbFG5E7qpC2kEjMA5EdBbIVY1NixfhNVa5ZhlVTon9s57nwiojWHhChaV+/ssgqU2AkbACOwKPlkRYwAACylJREFUATZcN39b35XkZWEpy6qb8cvZ2NcIHA5WVNwKjIARMAInRkBvh/yjB4tK2lx94hxPxz6W4WKsQ6dDypzXQuBqLUbmYwSMgBEwAsMIaIJn2af27+DDjM4conLsvgxnhtDZz0TAispMwE4VXZ2fj5+ZjIARMAJGYEMIaGye+ubThqS9TFGsqGykXt0ZNlIRFsMIGAEjYAQ2hYD3qGyqOiyMEdgnAlK0ORyNf4KcjZT/7vd/nA08Z2wENoyALSobrhyLZgRqEdAkzcmxnKAKJYWB01XZxNmQnq/1wL81OMCN48zfyO+oPQdKnw7KOutfbymHLv7O6H+jqGJNRuBSELBF5VJq0uW46wiEj9ZpkuaDb/wVlmP9OXG6RQrjRGBO0eXbNpyWeqySgoLEl7sHTxpuCVB4UNo1/7b7g/hxGqrJCBiBC0HAisqFVKSLcecR4ANrWEsSMVnz5dvSd2aa7w6lyEe45HOsopEsQEeIcZNU5UVhupaLAmUyAkbgAhDw0s8FVKKLYASEAMsdvY9SDiCTln8Ggmd5oxQUl1rkjxLzuy6Wn/gw5iLrjdIhLwoXH+LEWhRI91hPmufkLzcoK3JZ2jIZASOwcwRsUdl5BVp8IwACmrBf6cr3o6A88BHA1ofw9JwsLIuXahLi4oUlJM8zBR0Uxof4+GAdygkKVNo/08SpuVF6LCOfRj5s2OX5IJdy5BYkvBOxtLX5Dz0mYe0aASMwjoAVlXF8HGoEdodAnMTZLPtZQXgmd/anrLHxFUWFvTAtEm+WgvIvJZPX561I9Q8PFRUljPLAMylGlGPIgkQcZDMZASNwAQhcXUAZXAQjYAQiAprImaBZcvksm9RzfIr7UxQXS8UjuXMsLaRJikOex1d6aJZkohzBsqN7lJiuEkG+fLQvJ5Z1UFCCQiX3iQLzvTCP9dxNk9L3lKcUYNcIGIH9IWBFZX91ZomNQBEBTeYoAPzrJyx7xOeD3Nx6giWitKeEpZmXMFZ8llUe6fpEV9pjguLTTQdflJUu4Zfn2YQXeJAfS0RTSzXInSsqPL9UOpaFWstb8geHYv7yNxkBI7AzBO7vTF6LawSMQAEBTdZMzkzknCPC5I2y8bWuxroQ/eQVNpviBpI/yyr8QyhZR7BwvJLfa1389Zj7FKbbG5I/CgL5dqnnr7hYeY6loHyIF0pKUoa47xIysUfGZASMwAUgcHUBZXARjIARuDkzhcm7dXaKJvVgBZHLqa0sn0B8+RaX+FhOUGoai4bCUEwglICwvCI/lJ4SsW8EJSe3YLDsg2UnKTHkE6w1JQaVfk8jTxQQ8uIfPRw017WmyCuUpWv9wd9kBIzADhGworLDSrPIRqCLgJSCj7p++bPC+fdN1d+DFfd5jI/yEhQUPT/TlRSYnDWWEpSCRpFRPBSJVRUF8UQx4UqU3ye/g+KhFOHmilMT7hsjYAT2h8D9/YlsiY2AETgxApxXgrUCa8qTeP+2lKfC2HzLGSnJelKKNuW3plKRFKepPB1uBIzAThCwRWUnFWUxjcBtISClo/nHTk2eis9SEkf4s7n1fU2aPA7p8+el9+KDcsW/hdZUfJaK43RGwAishIAtKisBaTZG4K4gIEWAg9daFhQ9N0s/Z8The+XNfhuTETACF4SAFZULqkwXxQicGgEpJFgtigfGKWy2NWVNeclfV/iC8pp8zcsIGIHzImBF5bz4O3cjsBsEpASwUfWoLyXfUmH9BeVbAtrZGIHbQMCKym2g7DyMwGUgwEbV/NC1TZZKClX4KGFUrDYpo4UyAkagHgFvpq3HyjGNwOYR0OSMMpFOk+XfOCyFsFzDd384Y4WNpuwv4dRZzj+Zs3H2WvGLG1/lT77pkLV3ei7+fVhxqulInkFZUWZHy1EtsCMaASNwEgRsUTkJrGZqBG4fAU3svS8Wyy+cKyJpftCFNQTlhW/osPkVxQOlZZJivOIeFIXB97Vczlnhb8xPJhlORFiBp7+gPIGxg43AXhCwRWUvNWU5jcAIAnFiL32x+KGS8W8YrCo/K15uYUCJyY/Y5yh9PvYXLCNR8dBjIBSaJm70Sw5h/4gyfC93jpUm8ei6ozyVB+Gcflu08CgMpYo4JiNgBHaOgBWVnVegxTcCEYHBLxYTrgmdU2axqgTSM3/j5V8ywUoiF0XmE7lM/igwxM1PosUvxJXbJawz/9SFZYXzVPiAYTjLRC75sCw0RZzFkp9/MsgzMrqWm5aaSryHlKpSXPsZASOwYQSsqGy4ciyaEZiBAIpEPtF3k/JNHyb/REz07ONIhDKBgoE/lpnm2z8xArzJo0WKh9WC+B/Fe06zxTITjuuXH9/i6fKS1zBV8OS7RVhSsBBxpktuJUqMg1zpwa4RMAL7ReD+fkW35EbACGQIoBC0ljo0gQdLRpz42ZtCnEQoD+mDgyggXHx1GeUFt/Xvnpi2xV/xIHigBB0UB2UGpSFXgAiaS6M8lU9SgrDClJQU8kPWMYvLXJkc3wgYgTMhYIvKmYB3tkZgZQTYFzL0xWIm7TC5Z3liOWnt70iTPq4u9pywjJNbaUpfSkYZQgli6Qh6o/tcIbrxnfc7ylP8UareT7BEEWuVbyK+g42AEdgoAlZUNloxFssIzEEgKhTFiVlhWDgaK4ee0/6UoITomb0qv+pC4cgVgHcdGVAgyKNZQlL8fB9LJ/qyxwqeKFlv4a64va86yw9FhrBcycLLZASMwA4RuL9DmS2yETACxyHQTPQZGywyWFCe62LZ50u5udJy0DPKDspMaQkoY3Xy22CxkRzhn0yF3JJCVQiylxEwAntDwBaVvdWY5TUCxyPAYW/NP4Bgp0kf60PRIkN4IsU76kvJic8x7pisCkN58ReUjwHYaY3AxhCworKxCrE4RuDUCKBsHJOH0qe/MB/D5lRpOcelZQk6VUbmawSMwO0g4KWf28HZuRiBi0Jgq8rAVuW6qMp3YYzALSNgi8otA+7sjMDaCGhy/rA2z0vjJ4zuXVqZXB4jcFcQsKJyV2ra5bxYBDwJX2zVumBGwAgIASsqbgZGwAiMIiBF6FoR2NfCibMcsMZZKd1zWeRtMgJGwAisj4AVlfUxNUcjcFEISCnhqHrOXrmWu8YHBy8KHxfGCBiB0yLgzbSnxdfcjcClIMBJr82hcZdSKJfDCBiB7SNgRWX7dWQJjcAWEGD5J3wbaKkwssZgkeFAue4ZLq3npfydzggYgctEwIrKZdarS2UEVkNAigXLPtBii4p4cKw9HztkbwtfPE7H3IclJZibjIARMAIlBKyolFCxnxEwAjkCWFP4HtAx3855KB6vxIMNuXzcMB3KBu/w3R65JiNgBIxADwErKj1I7GEEjEAHgeL+FKwiulA0JknxknLyRJH5llCix7o5akkpMbJrBIzAZSJgReUy69WlMgJrIjC0P+WFMplrDYFX+KhgFJDn9K+i6GXHCBgBI/AHAld/3B5+01tP9hhuf5Sf/47YRcXPRuCOIKD+X9yfIn+WcD6WG5ZwYrxH8uODh7/rwv8z+Ze+KxSWkBSGksJeFZ75mGCuwOjRZASMwF1AQGPBbyrnx0NlRVEZ+2rqMWvSQ3na3wgYgR0goMHjucRkqQbiq8m4KBYoJCgwLAkleqRw9qDg/63cv+r6NgVm7lPd81FDBibGFw6Qs5IiEExG4A4jUBorGjjuffjgz4Q0aPjGCBiBoxCQAoJyc5Drk2uPQtKJjYARSAh4j0pCwq4RMAKLEUgKihg0G2/lh6XEZASMgBE4CgFbVI6Cz4mNgBEAASklHNrGv3dYGvqzLpZ23srf+04EhMkIGIHlCPx/Os2ziVFQJvIAAAAASUVORK5CYII=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzgAAAC8CAYAAAC0RQvRAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2dXdLdNLaGN6lcd+WEqr5vmAGEETTMgCYjSJgBVK44dymYATCCADOgewQEZgDnvqtIf9UT4LyPPsnI3pIt/+z/V1XesvW71iPZ8rJk77f++OOPnZ0JrCHwv//7v+9o+21NGc5rAiZgAiZwmwQ8huy3u5nsM3HI7RDYov8/VCHvCdnPFWw/KP4flTgHm8BO/eMzYcC4mTRwlPZDpXuk7R1t72r7XmH/lH/zzmxuvgsYgAncMgEekn2s7atbhpB0F4fmcTXlqfkeW2pkHH7mBCavCerbv0oH7if3nOLeepCFcmH5dLB9ncV71wR6BNSBPlbA2/J/6EXUDzBoMJrpa59r+7Ge9OZizObmmtwKm4AJQEBjQnjQJf/5rRMRg7nj6hQyjy1ThBx/dgQarwlfSvCh3dLdjz7MtPpaBU4+hc/SL96NJ/Avx6pvsaCFjJL5M22bP2U6JyYtOioNMzEv5L9fwFQLytNidd/VEt5guNncYKNbZRMwgXsCGku+0vaztu+0bTo2qDyMhpPec0iGyXsHpVkyrk51IY8tU4Qcf5YEdD6MXhMU/81QcIURxPm+yw0cjpucCmCpEVYThVDBjwrrrCbts+SNG1guVKTrnI55QvOb/D1jSmGUy5N9fMrlIscJ/1gb7vNSvvuo9t819SgvwDEGe3q1176fUmVVmZBa8bCESXKPFLbKyFJ+uH6i7VPt5xfAHWVrm9IRy3nWDJ/KzNuc/JPLH5WHdEzXv6/9X+RfpTOb5c16K31kKSHz2SdXY6Lwo4xB+xJtH3KhOjKmpKeym0ARh9HxdZNKGgqRHIvHVeUNhk+shvsB3DOFc4806pTmKOOu6oEz92/cO6y6PxlV6Awipd+t3JcU9ZT+x7xOLr4mPFjSV6Qc08k/abvTPjfIuXGD4sT/jTj5ndMxJ+lH8ovvXcTw75UGA4hyMWjwuRHmJN1kSZPKo/419TDlS8OPOqWZNACUZooJ70h9qHTfpE3HzJyQb5FTXsrkYkQZtXKmdPwEeZYIoHxwoW2L/WBQZmCotGdv3ES9BuLPO7xWNjmFLTjl5Wn/YvrIQO7iofkUsVQDF/Iq9hmVtXZsqMq5JuIWdISP9GRMYWypjUsdxhYmsZzqPUdX2MhOSz0j2YdRS8fVLyUHYyYb90NvtNXenR7WGY6jHgcbd1U+bcfD6JZxvSjjBQUWrx8XJH+rqEU91dZHu07GftV0TRgqtcjAiYV8JL/XkSUIT9p38jmJ7mK63MMoCMDywMH+Xrkx/nf56cnFIMuiw8X1SDf0xuiYugi3yDvF5Knq6QwJ7WNAvpZf4tsEQnmZqucJS/5kp5dX8VUdFcfMXTVvr6DBgfKiL/0DGUJ/GSQZHlJXr58NE5zRcUt7V8W9cja53qs45QXF/UvqIwXx94LMZw/JaMASXmN9ZvHYMCrlushb0DERYmxhdcGUa2EyNb5O1UF8Sz0t5ex0jV86rj5XXsb+5NCLl7B5WDnplO7g467qCJzkn/3DyElg0wnGrh/TuS8nxZiex7xOtl4TemQf9o7mHXCyhRma2LHZf6n9sRtvjILerE6hSsp9VggnXzdTVIifG7S2nnCh2kCmKpPI9Sf5GAJva6OzMWvWW1KmsEO5mo61jt3JIRm5oGKU0h/CkjqF8cSJCzJrkeUFI6k3la1wjMYX2vg6BvtPtb3SFpziaTfK+ED7YYmbfOrayWd6fDOn8pIs6PGBNvr36ou3yjgmG3Tg6R8zoez/nzaW+y0yUJV3z8VyabODc6LyrL7mPhLz8fQ09BmOt3CZLHu6K+6gfVXl7/UjdMpkOjmfgTytjDbvs1NMBn1h7dgwKO7PQ8lxsD5x5jrOaVPGHcaY7sHenwRn742Nr8XzZ24NpTalDIXXrjdLxlXuf15PyaY693RS2M/Kt3bc5d6DNmEVzWNttCdfQmVsSWMJffufOmZ1CI5rbXiYGY6yn0xO7mt2Ot507M6qmrWbyXWnjN2rAApH31n3JVSsfLU+QPQql8m0d11dWnBWZnHsGJR7sOvkoB4OF10THhQKmgwSBE4WXOrMnEC/K5xOUXSKw7qvxpMppqEjoUxwhGljORl1bXJzslE9LNHjhF/sohxjTMIFQxVg2NHhgnEY8y2ud0bGmo5PojzFoiQfsvJeFsYLF2UuDDsdc2P9VrZxgeycwml7+hJreBnc6Af0tdAfYvx78imXT4qSHoecxadsSsMFmDKXuH8p06tY30vtc7zKqaxjs+FJaHqyRl9jMNqa1TE5Leoj4k4/4nyqOqVZ0leKuqss5JzVV6uCFSJG+tG58UH6uYya+2wBzV5QbIvqdSXPoLScGzBsHoOUp6nfRDkO0icuQMc5bco1sniNyttqaj+25V0pneKoY2+MKqUdC6u1qcLHrjezx1WVxxL1XBfuBVjK3z1w035RJ4WvGnej/o/lf6/tW45VJmMw9wHomRz3Q9yvheX02scYCmN/SoCveM7FwF77GDacE8koIknnFN50bnUZVuyorhq/c7ymoum/tG12fyL9R/XM0Srtwa6TeT3ZPm0z+5rwMCtgzm66UeAk+1obN6N05N7TeB3nDuFYNzrmKJeT+LkApnTckDW9TJcyNPhN9cRG5AlEMCwG5SLnbOCDMqaYvKu6qYctPM3S8SvtI88xnnjUdHyk+ottKfnoD1x40w0C7fd3bS2Op08YsumJUMij43QR5yLLxZOnSdSBfDv5fHqaGZaS4yKLvLOcymPWjKWAqW5k4okOW6h3VoFKrHxHZ6Nq01O3JC79p8c3RcifzUo6HZvToj4i3Tjnp56AztJ/THfVtaSvKtu0m+hHZ8MHTZYwUrY5fXYa2P1L62PXlbyMprEhz6D91n5zsD4hGabaPRf56Dqq8jltytiydmxF3+L4OnH+kG+OK7apChi73jB+lPRjnCqOq7lAkv89HTMGdis5Vuo02ndifYzn6MS4m2bWuC9L46OiQnw+1vMAszfWFOQkH2XQP1K5hCXXem6l9Iv8glzInXQZ5aN0S/pAknORfpJ383FXAk3pmWTGP+Q1JK8n7S+6JjxMuWf6dEYGjHSTjRHwXBvWdgobFsnJO3VjmModM5RCuaqHk5wGmXIszemdZMrQWg+NiOVYcr0Lkerg5nV40XqicDpw7piyTCdyC5M8L/tM6ZIvOJW1hkMqpub3dMwScULX2pIndd1Mm+QjHRewFtfLqwzwT4bSTmWFdpT/VOHMagWnYxgMOcfYvYE1hU/5GJG5YcvTKmQIestf0t49/WJZB2UjkWGIrJ1TvcPzIcVxXtQ4pjRD/9icegwlzFgfyfXGAJ7Sba7+Y7qnfjLaVw/Qj86JD31lNqPYpnnb7VKf3YJXLL+7riBk5lrHhixL2zUm0+HgfULC9c6LXFjtH13HKE+xTQeyccj16VEevrDdKSOch3lZ2u+dIyqbNOE6PLeeQZvm+o1db5aMq0EF1cc9Bvc9zMrkulV1ChnHf3p5lbTXd1RPYkO/eZWKSuEcaz/c++RhCqac4f0gdT3TljvG79o4SJ1T1+28LGRZck/UY6Ayuj6hwntxOh7yye9LWvtAknm2fjHj2HV1EwZDPZPA0UdubIDJe/Us31JdKWLvmpCVW919WI0Zj6CBAZy7lzrAwKm9h9MiYOmEyOvo9lUPJwTAlrjJelT+ZyoYHWlElkN1N9SxQk7o0LE5VvyQB2FMw47JWGWifI9U7O+UPXA92ZVuDYdB0XuHPR33YssByN1xKSfZD436DvOGEyLG7eRz0cHBoDOiOFZcd6JpP013Ux5PurqLjuI4ZvBhSWXII7/3SWwdkw/d8yf+1Nf1AaVZ0t5D/VTktIvyDPPW2HBxD/qmfPLzm7m7vEbFVVmRTvEMpjBDd/pjt1RCcUflFOtr5UAf6dpd+xxzbWI5RDeYar+ov8JH+4niJ3VXfbipvrpZP4oyHYXPvWrr+0csp7nPSsdZvGYySe01vClL6na+yl3Ub2IBm/aJY+uYIKje6rVBaZrbNJWX+Y+1f5cd71TXrHaPeWvj6/Ac6apaWA/5m643saIl4yoMyMfD5HBPEY8JT3oeY9zNr6lRneChfzdeRtlYrsbqivyaC/v8+ssxebtzTumL55bS7ChL3hNtzA4xHtFPMPa6/qH9JfdExT6hsggfxtXG3qY+oDLX6oc8U/cnsxjM1FPV99uMgJKr6arwyXYclLd3TRjEFw8fFENHAqNgpMhvmnYK52bxTtsLIodO8QCnUYpO8cTRcL1yi4lXBLbWE/XZyWcGqLuxzapG3trsTpasvqtyx5ikk7grQOkxulg2dVBGXYX37VXS8Y3S0FYlt6eT5GUgHHVKQ99hC07HnABcMNCVJyi5o362ndLRDtQZnI65eLC0jxtx+uRj+cMLP2uguUDuFEc9nDy5o17igjzyqYOwZ4SvcMdgg8yBjXz6UOekB2y6vhOPp1hh/MGKfoCx37WRjo/KKdbd1a/jsT4i8e4NbaVDzkfxOMhMpMKn+spYP2nVnbYI7aH6en0VGRa6Yj9S+bA5Jh/E36J/IHNTn6XCOW4Ok9g+9JPuHCnVpXRr+g1FbtonTqQjeoy1/Zo2pQ1Sf6CeRU5c9s6TWNBeuNJOjlENQoRxRmUVrzdZ/tq9Azqj+55TmeTBuIA5BgPXPoyCxGmRTiqHdmILLpaL/L1xV+HUz/Ls2rkRbvrvSwm/lJHum55m4ckYS0Hfaof/B0L+nfypc4tVMayAeaWNz3+z38mv/aWuyE/lN/HJKh3tAxvp1zr2ZGKN787RU2lDX1CJtb4QKpvQdW47PlKhqa+PK5PFPsz2J3clMDfY4emBfG78u9ka7fPEExe+kKXjziK/Dw6/rN/Equ/dcOq4Wm6Wd/XunHqUFqBjJw4cuqcGK4QrMlF5XMC4mMEGOZCHtN1MhY4XOZVBB0V2ThTag4t7N6Oh/eRqOtJ+lFFyzHTwlCnFI/fLUsJCWMrLS4h0ZvoQF8dfVV7eFsj+VGHhBl5+WvKn4KAX5ewUDsPuqVIM44kSL0umJ1EwGE6BozfpEntu8IdLAhQ02yX9DskGZi8kOzfnMOM8pX0xUOg/+bkHxyorxe1Iry0YRoO8RJ+CU2I41UeeST76YdBb+wy26BEGUvm4qv7KN9VPWnUf66v3Usz/TQxK/SjFHZRPEpk+oW1t/5jTZ1PVc/xJJtJhzhi0pt8g9yH7RLXdt9IxgZ9o+zVt+lh15NepVOUSn/45vOdI/aF0/iypgzwt15tUNtcO+sDQjY2rtCtjKX7npFsqZ41OKW+176hC6k4GS1d/tjOM5+YXA4Sx52WWDt3TdZnl9rwkn5eLPsizU3hp/E5jfTduKx19ba1LDEp9IsWN8aH+lj6whX4wPOT9SVVPsd7qOjm3HRddE+YaONxcF2+wpTidNO+oOtxzdHYauNchlbda7l4JKwJm1sMJ9JrqlO+5ttQgHHMy429xES4yieVzM5bfkBG82kW5e20wLHRCR2T6YJiH41g2bTzbKS8XxdGnAhQ6kY62eUM6uXARVPrhEkOegKV6wgX3Pnn3i+GE8T7Vn7sMLTsqj/5ySjZDMSdZSeYwQMm/08aN7Hfsx4KOzkl1t/aR4fWo1JZT+o/1kybdW+UdNszYscqs9qPW+pRuCz47lbO6f7TKPMZkLK6lfKWZMwat6Te7FnnG9CnFtZS5sY7oUW37FnlKesQwXp7fatzbG18lW/X8GZFpNEpltpxPO6Wj7+CX7h3GxtX/GRMglnewsUXlI1swPEpyKJ5xtHNRnr30DXKOnlvKzwN0ztVu3NZx7/6sE2LGzphcijvamKO6WvRrGntmqB+StuipNJtcJxv1zFVYdE14kJdw6P0IkGnOZCUfuso15YcLrGQNTycHBaWL5iB477B0EeslOmMmYzq+khI8XTlHl54cfhyFY/YF6z93YWYstu2H8oeDKbolAyjPN7U/2d5TBRw5fpSVuPC0hhkQPoyBv5N/hx/dpXMa1V86jvWTpbondmP+ufSjUT4H7B9jbEpxx+Y1ykUCjvWbkvwtYWelY0Pbt+hUS9M9na8liOGTTCQn1/G19xyT9UzImUdf6ria63DI/alzi/+/456MVRes4mD/9SEF2rjsLfQ75Nizpbpjus5tx9ZrQk/+t7744gtgMSXFWvwtT+ReRfmB6uEk75a35XHnvh9PKKa9l9wAV9XLmWifNuHdkU3rqFY+iFC9XDRGdVQabnj/IX9oHAxKO69DyYtxzZN5pngxgphG7558xXhuUHpPpM5Li9NLc+2con7FfnLtum/Ru26V0Vi/2YLrtZcR+fFxnvCO5Fb6qryT33NIhqsdV7dqJ5czTiCeHzd1fxJ1br4mxPMMRm89HMd5mFhVzBrMMFV7mBoOWmq+RGezinIm2j+10dCiY3oS1RkHm8E4bEH0O54ePJbPk72e/DrGyLdxM9EGN8Cp2k9uQPeJ1p+OvmFG1X4zTc0pRICnvowtmzr1x3O457jmcXXT9nJhZQI3el1dfE04yQxOuekcemkEdLIxTcxL7EeZ+bs0PpbXBEzABEygjYDGEWbXb+rpdImMx9USFYfdIoEl1wTlYaY0zOAc9R2cW2ygK9eZlwjT18iuXFWrZwImYAImcEACjCW9GfUD1nXORXtcPefWsWzHJLDqmmAD55hNdWV1yVK+k0rM4PAyup0JmIAJmIAJzCYQxxCvBhA5j6uzu48zXCGBLa4JzUvUVNkfV8jQKpmACZiACZiACZiACZiACVwAAdkjb9XEVFy3RK35IwNjBdYqcrgJmIAJmIAJmIAJmIAJmIAJHJNAs4FzTKFclwmYgAmYwHkR0EMu/ouAr4TxMjif8eX/kYqfslc4n2D/Rf5JP0Ci+tMf50kcOxMwARMwgVshYAPnVlraepqACdw8Ad3wY6C8iCAwVHDPFM77dFMOgyb8o3os5z/KsLdUQHHp/z5OatygjGT5Shtf1PHL61Ot63gTMAETuCIC/sjAFTWmVTEBEzCBCQJf6maf/wRh42tNb7TxR88t7v0sEcbRnlGkMjGg+PPc4sxOln90V/m3/Dojhtnm/60yqoAjTcAETMAETkrABs5J8btyEzABEzgqgee62WepWXLc+L+jsPdSQM1XmnxGhnwYSENH+BbGSZpdGpY/+1hyY2x9KB/jy84ETMAETOAGCHiJ2g00slU0ARMwgUiApVqvp2jIGMBQ+V0bszSPdPxVyqN9DBhmgH5JYZmPIVFdDqa4arlZGZO7KgcjDaPsA+13hpb2ma3pjrOCgpGj4x+yMO+agAmYgAlcKQHP4Fxpw1otEzABExgS0M3/N9rypWUYI78prDNWtP+rwn6Uj1GDMZTe2dkpDAMlGDfa7/3/lY6ZdcnL1uGfTvHVcv9MNb2ncpiJeU8+8n0cj3fyMXjy2am8sJ908FEe4H0TMAETMIHrJWAD53rb1pqZgAmYQJVANAj42ln3bo3CmJ3B4Env0LAs7e8UojDe1cGo+Y/2+V+04UwNBg7v9Ow5pa+Wu5d4OuCxkmCoITuyJqMK46Y2O0Ua5LMzARMwARO4AQJeonYDjWwVTcAETCAnIKOAm31mY97PDASSfKKtW+IV48LsjvY7Q4iEBcfMSjI2htFj5WL8DI2PJ6rvx0EhLD/DsAnvAsl/qnjyJveBdoZ5UlzR8EqR9k3ABEzABK6LgA2c62pPa2MCJmACowRkGGBMsMwsLNmKxzv5GA4YKfnHBEbLGkSm/IPgcFgtV/UOZ4KQhSVyU0vKmLHJDRyOXyofy9e6JXdRGHReqlcswp4JmIAJmMClEHhwKYJaThMwARMwgXUEdOPPjT5GAf8NgyHAeyufa0szHBgGpOmc0jDTM+mUbi9vlmkvrrXcrIzSbjBaVBbGTTKi2B86dOIdIDsTMAETMIEbIPDwBnS0iiZgAiZgAvcEeI8GQ6D33zcyENIsCsvTmN1JRg5pX2prdbwTw2enh7Mla8st1f9MgciK4UJ9fCGNPxnFmBo6ZoOSjsM4H5uACZiACVwZARs4V9agVscETMAEagRkDPxPLY7waJisMQSY7SE/s0Kd26Dcrqy0ozIxaNiSy/dTGDphpOEPja4ujXdMwARMwASui8CD61LH2piACZiACZyKgIwIvr7G/+akGaClomxpjCSja6kszmcCJmACJnBhBGzgXFiDWVwTMAETOGcCMm6YwflUfpg5WSJrLGNJ1l4elcOSNb6+tqXB1KvDByZgAiZgAudHAAPnL1Gs5J+flJbIBEzABEzgYgjIoOgtUTuh4N9JlvSfPicUw1WbgAmYgAkcgcBfUx2ewUkk7N8UAd30rF1Cc1O8rKwJzCWgc+xubp6t05+DDFvr5PLOh4DHkfNpC0tiAkMCfGTgvzEw+cM0PjaBqyKgQYl/Y2fJyuSyFaXlk7MstcEgelcby138RFggcOZzz8G/JmACN0mALwZ+rO2rm9TeSpvA+RH4dxLJMziJhP2bIMBgJEXfll/84lIBAgbND3EAY9lN7Z/SC1lvIsh8bqKZraQJmMCQgMaF8LBLPu962ZmACZwRARs4MxpDFzGe1Fzk0ibJzazF5u6cmEzpqHhmYl7In/N+wPsZNNr+5MtuMnnOYdd8zqEVLIMJmMBJCGg8YfZm1Uc1aoKr7JPfc0iGyXuHc5CzxtDhYaXFZBteI6eb+h8cnYQsN+ILPzzF/0bbjwrrnuRrnz+/4yaWF1N7/wWhY57Q8Cd2e8uaFEa53DTjUy43wdxMP9aG48/o9vLdR7X9rq1D+b/Sxr+X9/Rqq72cSmVVmZBD8bCESXJ8PnbVVL7yw/UTbQwo+c31jrK1jenI52L5F/dmp/LydiM/f1g46ZSPtFxU3td+6Y8HJ8u4hARz+dwKl6m2M4cpQuH6cRPn0DSJP1PU+o3CDz4G/SnFYfcuVEfGFfrr0cbXw7bCn6WrPUbHVcWP3gf8WVJ9r9bm9RyXGVPTU+EHPX9V/mgbXibNaakfTCe5nhRqZKaTf9J2p31ukHPjhg5G/N+Ik985HXNT/ZH84rsXMfx7pcEAolwMGnxuhrlBXr2sSWVR99o6WE7ERXjUKc2kEaA0U0zeUyUfKt03adMxsyfkW+SUlzK5mFJGrZwxHT9BliWVKx9MaNdiHyiUGRgq/dkbN1G3ggrtQTP4XAyXXPstGOXlaf8iOQx06B2aUQ/H5MFCXsV+o7K2GB8mZZ6b4BZ0hIn0ZFxhfKmNSx26FiaxnOo9R1fYyE5LPSPZh1HFcXULOWNFxX49FOIKjot6iuMxzt9iG14B06oKN2XgRAofye/dpKpzhek7+dzA3hVoYRSEjlmIS0F75caI3+Uzk7GFW1VHPIkwOqYuwi3yTjF5qno6Y0L7GJCv5Zf4NrFR3l+0MQOUz6r08iqett3TUeHM2lXz9QoZHCgvutI3qL91qpf6ev1sUOw5Hba0d1XemXwuiUuu8ypGeUFx/1I5FFTpgsyoQ9G0s4TXWL9ZNT40STw/0S3omKgwvrC6YMq1MJkaX6fqIL6lnpZydrrGF8dVZd5CTmQY69dNMl5IojE9D3r+jrThhaCbL+bD+VkuPgc32mGGRg3OBYD9l9ofu/Hmhrk3q1OgQLnPCuHk62aKCvFzgraoI1yoNpCpyiRy/Uk+xsDb2jipmTXrLSlT2KFcScfaxaOTQfJxscYgpS+E5XQKY9kiM0efaV9eMJL2ltkpDqPxhbZftbH/VNsrbcEpnrajnA+0H5a5yae+nfw57wSRZdSpvCQLunygjf69eiZJZczmk8kyhwvyf6m8zIKy/3/aWOq3yEBV3j2XyXVwRlSe1dfMIebjqVvTssg9JUcCMnn29FfcQfuqyt/rR1HX1G8vldHm/TZrpyKTQRNvMT4Mirw/PGSfOHMd57Qp4w7jTPdgrwizLXBsfC2eP23F/pmq1KbEKrx2zSmNq1U5Y1lFWafafIFsfyq2cC+Tae+auLDIXVbmSc/fTP5SG2bR17X74LrUGddGnY0bTNw/tc9Sp5+1/a79OwJLTnEYQdV48sQ0XAjpPMERpo0lZdS1+gZlwzpYosdFeLGLsowxYaCFBYYdJ3ZuUOrw4K6k4xPViixFJ52I450sjJfX2jBWdjrmxvqtbONT0T2nONqevsT7Pwxu6E5fC/0hxr8nn7J5aZT0OOQsPmVTGm7wKXOJ+5cyvYr1vdQ+x6ucyprNR3mWcuEpaOCiMuhnGDZbczomo0UcpDt9iHOp6pRmaT8p6h/bbFZfrQpXiFD5tX50DYya+20BzV5QbIvqdSXPoLScHzBsGoOUvrnfRDkO0icOqSN8WvUc0XFOm9K3i9cpZGl1koUyuO7tOcUVz5+9hBMBNX0VPnbN6Y2rY3JSveKLsir8HM91RP6Xts3GzSk9qTA5pT3Y+ZvqiH6vDQdxV3f48Oo0Glco3Sxww82SM25GuZHdeyKvsOToeG/SQcWnXC5Iz9VRUxJuyp7puHihSolm+E11xBOF5VTBqCiUjzxrL8JTTN6NelNXeJql41faR6ZNZytUXsmVdHykhMV2lGz0Bd6fSjcHtN3fSwVXwnhKhSHbm2HQcZo1eax43kViJot6kG8nn89PM8NScry3hcyznMpj1oylgKluZGI2ii3UO6tAJVa+pXwWcVGVGOD5e2v0nR5bHSc3m5P0OTajpRw45zG2x9ym+quiJX11TL4ubqIfXTwjKTqn33ZcRnammORZm8aHLMOcfnOwPiF5Dqkj6rbqWdRR+ee0KePL2rEVmYvj68T5Q745rqbv2DWH8SPXrygnQkzIOtXmS2RLure2d0offMm7+Ziggqf0zGU45Pmb1zNswzzu6vYfXp1G4wpxseJGNN1kYwhglPA0K4UNS+Amc+rGMJU7ZijtVMd7KotOP+VYmjO8oWuqQwVzovDkpOZ6N/mqh5vX/KJFvicK50KRO6at09R7C5M8L/ssVSNfcCprDYtUTPRxaeQAACAASURBVM3v6RgTcdGstSNP6bpZNslGumQgxOyjXi+/UtIGyVjaqbzQlvKfKrxbrqhjGAw5Kyi44cCawqd8jMjcuGXmChmC7vKXtHdPv1hWC59ePonRxCWmQ87Oqc7h+ZDilnA6NqM5HHK9MX5r/eNQ+qd+MtpXD9CPLp6RGoT+nbffLvXbLXjF8rvrSuoA0W8dH1K25vMm0+HgfWJjHdG1Sc+ajlGeYptS+MBxjXqUhy1sd8oI52FelvZ754jKJk24Ds+tZ6Bvrt/YNWc4rtbkROyqrMM4HY+NC62yUSeuqb3vk/Z+p8aEJfcrPQaqradnr/Z7ubk3Hb2HzPIs1XPYhlmR17f78PpUGtWIDpbf/JH4pTYMnNp7OHsXLTINHOXWDKQuqergYkTHXOIm61D5n6lg9ONEYSlUdzOdVYgx090sKs2Qx05hLNUak7PKRPm46P2e1Zd2e/Ir3RoWqcya39OxligLR+aOSRY+uRv1HeYPF58Yt5N/FwuCQWdIaf9DxXUXNO2zbBJHecz2dBd3xXHM4MOSypBHfu+T2DomH7rnT/2pr+sHSrOkvYf6qchxF2UZ5qtxYfAIuqZ88vMbubu8NsVVOZFO8TxEgBd60xeZPQtlyEemozGK9bVyoH90ba59jrkusTyI8yU47Vf1V9xoP1H8pP6xmqm+ulk/ijIdjRH6qc5VfSQyau63qm8Wr5lMEIf2Gh2DVObifhP13bRPHEJH5BzTM8ZX217xzW1KWQP3WMd3eZhkmdXuMW9tfB2eI11VC+shP206ec2JFQ3H1ZqcJC/KKjkJH8bVxoUm2cbaW3G05xNtLC1nLLjTxrLzrl2iTFNjwqz7lVhmq54SafX5O6knlcgN2/A+9Ep/H0gvOimN/eZKdQxqxY7Ofn7jtFM4N4t0+hdEDp3i6dh0iqJTPHF05F65xcQLA1vriLrs5DMD1N3UDqpF3rEZnkHy/UOVPcYkXUy6jEqP4cWyqYMx6iq73ynpSP+mnUpuTx/J2jLTtlM6+g5bcDrmQsOFGV15gpM7ZGAjHzJSb3A65uaDpX3cjNMnH8sfGl2snw3vACmOeh5ryx317hQX5JFPHYQ9I3yFm80nytDKhXSBi3z6T+dUDly6fhOPpzhh+MGJfo6x38mh46MyinV39et4rH9IvHtDW+mQ81E8DjITqfC1/aRVf9ojtInq7PVV5Fjoiv1I5cPn2Iy26CPI3NRv5/KawyS2D32lO0+G9SnN2n5DkZv2ia11RMBGPcfafk2b0gapPyDOIicd9s6TWNBeuNI2jVMTgoRxRmUVrzlZ3t64OiInWYqyKg982YLT8aGvh6xGYeXJK218dpv9rv4gxAHGhDl6Ki1c6Ttrzt8WPVG314YEXKGDYzBgH2oHhbHgCRw2vIIu36kDcYPNUwIcN//dbI32eeKJC1/J0nHpKRjvTfDRgN4Np46r5d4Xuf53Th1Ky0ky1YZw6J5erJCwyETlccFiAIENsiATabuZCh0vciqDvorsXIhpDy7u3YyG9pMr6Ujbkb/kmOVguWKKR+aXpYSVsJSfF4IZ4OhDT7X9qjLz9kD2pwoLN/Hy05I/BQe9KGencBjmszCE8b7O9wpPT9tgMFy+hN6kS+y5yedpVS6Dgma7pN9cPinfFBd4vZCcGHDIyjlK22Kg0Hfy8w6GVU6K25FeWzCMBnmJPgWjVg7PJB/9MOitfR5SoAc3C8mN6q+8U/2kVf+xvppkmesnDqV+lOKm+spqRghNv9C2to/M6bdzWZF+kol0aB2D1vYb5Dlkn6i2+wwdk4xw2ynf3nU0ho+1/Zo2fazy82sV1S11yDi850j9oXT+LK2n5XxKZXPtoA/kriQn8WOyprhqm8cKWmSb6tdpjO3GS3GljXOHXoccN6t6Spatzt8WPdG51IY5i2vYp625T/rm4TVoM6WDOhE318UbbMVxE1Gb7UhFc7PFidQ7McbKTRnX+jProGHDjbHyPdeWOn0QQ8fcuO/kb3ERLjKJ5XNDlt+UEbzaRbl7bTAsdERH5PlgmJ7jWO7wwl1KWgxTfh4OVJ++pEwT6WibNzFtuBgr/XCZIUuVUj1cqIYsMJww3qf6c6ymzVN59JfZfKKsSd5qZa3pYgGTnFQefTM8xNA+N7Hfycdwwh2dUat+Sje8FpXacVJ/6TjWT5r0b5U5EG38UZnVftRa31aMVM7qPtIqcyOevWQt5StNdWwbFLi23+xa5BnUOXnYUuYMHalvUk+VV237FnlGlOJvELYa9/bGV8lWPX9GZBqNUpkt15yd0sEVf3jvsCdnlq44ZqiM1vGyRbbR9lZdPLjmHOnGSx0P742aronoNce16BllK96bDuparafqqrXhoKrrOXxwPaocTpPYUfkKVXpycrjK1pUcLq6SMzyZLBSVLkaFqF7Q8CLWi+TgjJnUdHwlsXmid64OY4VZjI+jgMy+8EQwd2FmLLbvh/KHgyn6TRoUeYFxf7K9C3lOFTTKSUx4IsYMCB/FwN/Jv8OP7tIZjeofdRzrJ0v1T/zG/HPpR6OMDthHxtiU4o7Ja5RJFG6s35Tkbwk7po7IM6pnQ9u36FRLEx5M1SKz8EkmkpPr+Np7jsl6Mpmmdovj6kZyTtU9Fj/a3srI/85xP8RqB1ZPsP9aW+4OeU3M61mzv4WexTZcI9S5533riy++oHGZQmNd+5YnxLnrPls+8aGDdMvbZhdwwgzxxGY6eckNcFXynIn26Uu8O7JpHdXKBxGql4tXVUfFc8P7D/lDw2BQ0vkdSmaMa57MM5WOEcR64u4JWYznBoUnVXYFArfAKOpY7Ce3oH+h2WcF3SqjsX4zC+CNJo78+DhPeEdyKwwq7+T3HJJhdFxF13OQcwlzyc24evXjZksbLuF3jnmirrTpWzexRG2rRhAw1seHab6tyjxiOfkync2qzZlo/9SGw5SO6QlGZxhsBuLwBdHveBr1WD5P9no66JiHEzZuRtrhRhhV+8mN6D/SA6ajbphRtd9MU3MKEeAJO+PLpk798RzuOabG1d2ZyDmb/Q2d75NtOBveBWTwDM4FNJJF3I6ALmhMVfMSu2crt8PqkkzABEzgJgloLLmJWYCbbFwrfXEEdD4y4xhmcB5cnPQW2ATWEeALLulLZOtKcm4TMAETMIFbJ8B40ptRv3Ug1t8EzoGADZxzaAXLcDQCsu7vVBkzOLyMbmcCJmACJmACiwjEccQrAhbRcyYTOCyBq38HRxegPw6L0KVfKgH1jc3XTF8qC8ttAiZgAiawiMCXGksWZXQmEzglAfXbt05Z/6HrvgUD56ob8NAdxOWbgAmYgAmYgAmYgAmYwCUR8BK1S2oty2oCJmACF0BATwb5k1pevj6pkwxeinrSFnDlJmACJnAaAszg/CVWnfzTSOJaTcAETMAEDkZAN/t8CvhFrCAZH88UzntpmzmVl/434+RfKpQsX2njizp+CXyzFnZBJmACJnC2BP6aJGMG57/xIPkpzr4JmIAJmMD1EOBdAf5Xg42vCb7Rxp88b+ZULkYUf0K76s9+lX/LLx1+r/L8vt1mreyCTMAETOBsCfw7SeYlaomEfRMwARO4bgLPdaP/YaYiN/3vKOy9LGztLmVuYZykGaa18uykH8bWh/IxvuxMwARMwARugMDVf2TgBtrQKpqACZhACwGWab2eSihDACPld20sXXuk469SnmgksMyN+A+0vVTYLylePoZEdTmY4qplZ2VM7qocDDUMsw+0z2xUcNpntqY7TuHyg5Ej/4cszLsmYAImYAJXSsAzOFfasFbLBEzABHICuvH/Rlv+vg2GyG8K6wwU7f+qsB/lY9RgDKV3drQb3L/0+yrGv9Q+x8EpjFmXvPwY08VPld1LXztQPczEvBdl4GMGHO/kY/DkM1QEJ/eTdj5KB/ZNwARMwASum4ANnOtuX2tnAiZgAnsEojHwsSLeT5EKY2kZBk96f4aPBPw9i+eLZK8Vnwwi4pnhCQaG9jFweK9nz02VvZdhPOCxojHWkB95k1GFcVOboSIN8tmZgAmYgAncAAEvUbuBRraKJmACJpAIyCDgRp+lYu9nxgHRn2jrlnfFuGTMEM+MT7787AmBWRkYOsnYICp31bKVH8NqaHw8UfiPeQHaZ/kZhk34Opv8pwojb3IsmRvmSXFFwytF2jcBEzABE7guAjZwrqs9rY0JmIAJVAnIKMCQ4CtqYblWPN7JD7MxigvGw7AAxWO8kDefIcEYyt9pSWUMs3NM/lrZudEU8qo+lslNLSljxiY3cDjmnSCWr+WGGWUie7F+Iu1MwARMwASui8CD61LH2piACZiACZQI6Kafm3wMAv4XBiOAd1Y+15ZmNzAKSNM5pWGmB4fxsNNxmKGRTzrCnhGOU9he/vuY8LsXp/Sp7CzZ7N1gtKgsZElGVJB1UBLy8g6QnQmYgAmYwA0QeHgDOlpFEzABEzCB+/+8wQjo/feNjIM0g8KMDLM7ycgh7csIjtmUHxTHezgYOe9qGy5xU1B4J4ZPTw9nS8bKJt8Sh3GFvBgu1MdsEn8yijE1dMif9BzG+dgETMAETODKCNjAubIGtTomYAImUCIgQ+B/SuEpLBolNSOA921Y/pUvSUtZc59ZGcpgZqhzE2V36ebsRFlyefL9riilw1DbRRm6cO+YgAmYgAlcL4EH16uaNTMBEzABE9iIAMvZ0tfVqkXKiCANX1ZLs0DVtBMRwxmgieSj0cnoGk3kSBMwARMwgeshYAPnetrSmpiACZjA5gSisfJP+SxNm3RKxwzOp/LDzMlkhkKCWEYhZl6QymHJGl9f29JgmieEU5uACZiACRydAEvUuPAzIL05eu2u0ARMwARM4KwJROOAd1ianfLwbsxiA6e5oumE30mOJsNsuiinMAETMAETOHMCrCIIS62ZwWEpAV/W4c/T7EzABEzABExgNYFzMCzOQYbVIF2ACZiACZhAKwG+ohn+PsBL1FqROZ0JmIAJmIAJmIAJmIAJmMDZE7CBc/ZNZAFNwARMwARMwARMwARMwARaCfgz0a2knM4ETMAETKAjoOVffFntW20sc+Zdl7DuuUvgHRMwARMwARM4EQEbOCcC72pNwARM4JIJyKDhDzX5s88/5P94ybpYdhMwARMwgesi4CVq19We1sYETMAEjkZAxg0vdOIm/yPnPpl/TcAETMAETODwBGzgHJ6xazABEzCBayXA56N/k6HjTzFfawtbLxMwARO4QAI2cC6w0SyyCZiACZwJAWZwPHtzJo1hMUzABEzABO4J+B0c9wQTMAETMIFJApql4WMCX2rjz6F/14Zhw4cGXmoLTmn4c8/n2t7W9quOvwkR+tH+r/L4A9AfUph9EzABEzABEzgEAc/gHIKqyzQBEzCBKyIgo4SZmp+1YaCwfaV9jB1cPoPzIsb9pPAUHxLphz+TfpoO7JuACZiACZjAoQjYwDkUWZdrAiZgAldAQAYLszLfa8OwYfYmOfZ/UVh4/0Y+szkYNrjwbs79bvf7THt5/i7COyZgAiZgAiawJQGWqP0lFpj8Lct3WSZgAiZgApdNgJmYRzJguuVmUR1mdfLlZnxsgE9H4z7R1i1dCyETxo3yUs9n2vj0dConZrVnAiZgAiZgApME/ppSMIPz33iQ/BRn3wRMwARMwAQwVvJlaDsZIMzq8E5O9/83CkszOR8rnPg9g0hpcoNISXrua46UxsZND4sPTMAETMAEGgn8O6XzErVEwr4JmIAJmECPgIwNDBW2zpCJCTB6MEZ6hk+Mq306mg8PjDkMo1J5Y3kcZwImYAImYAJ7BPwVtT0kDjABEzABExgQGL47gxETZlpk5GCY8C5OSsPMTm8WJqYJMzSpXIVhOL3QxtfV2OcDBK+0dU5pWLKGe1cbS9ioK+xn9SnIzgRMwARMwAT+JOAZnD9ZeM8ETMAETCAjICPiTofMqmC0BKcwjAw+KPD6PmT30cDYwLjJ07P/Tp5G+xg0fJXta+2zlI06KLObwVE4xs0P8vli22NtpGX/iTbS2pmACZiACZhAkYBncIpYHGgCJmACJhAJ/EP+t9HgYJkZsyzM4HwZw4YzM3xtDWOEL6+FpW3axzDJHbMx/1R4mvUJcTrOZ37usngMorRM7tkgXV6u903ABEzABExgZwPHncAETMAETKBKQMYEszgYOUNXCgtplOfTYeLBMe/w5Pn5Ils3e0NalZF/pID4UKbCcyOIpHYmYAImYAIm0CPgJWo9HD4wARMwARM4JAEZKMzGsOWzN8wI/UhcjO9E0DHL0brZHB13y9+6RN4xARMwARMwgYyADZwMhndNwARMwAQOS0AGCjNCbMFFAybN4KSvs/HOzn9iEj4+kBtDn8dweyZgAiZgAiZQJOAlakUsDjQBEzABEzggAZan8a4OHxp4w742DJlfkwEk/zttfGggvcfDPs4Gzj0H/5qACZiACVQI2MCpgHGwCZiACZjAYQjIcOF9m947N8OalCZ/j2c07TCvj03ABEzABG6bgJeo3Xb7W3sTMAETMAETMAETMAETuCoCNnCuqjmtjAmYgAmYgAmYgAmYgAncNgEMHF7eZCkA66DtTMAETMAETMAETMAETMAETODSCLCcOSxvxsB5Rxt/1MY/RduZgAmYgAmYgAmYgAmYgAmYwKUR4Iuc4c+nvUTt0prO8pqACZiACZiACZiACZiACVQJ2MCponGECZiACZiACZiACZiACZjApRHwZ6IvrcUsrwmYgAmckIA+3/yeqv9WG8ub+a+a/HPOJ5TMVZuACZiACZjAPQEbOO4JJmACJmACzQRk0PyixO/L/0N++BPO5sxOaAImYAImYAJHIOAlakeA7CpMwARM4JoIyLjhRU6c/4DznoN/TcAETMAEzoiADZwzagyLYgImYAIXQuAjyfmbDJ27C5HXYpqACZiACdwQARs4N9TYVtUETMAENiLADI5nbzaC6WJMwARMwAS2JeB3cLbl6dJMwARM4KoIaJaGjwl8qY0/hf5dG4YNHxp4qS04pXmknefa3tb2q46/CRH60T5pP5UfPkYg/2MdUx7v8XgGSCDsTMAETMAEtiXgGZxtebo0EzABE7gaAjJAmKn5Wdvn2mf7SvsYJ7h8BudFjPtJ4Sk+JNLPC20YSclh1HD8JAXYNwETMAETMIEtCdjA2ZKmyzIBEzCBKyEgg4VZme+1Ydgwe5Mc+78oLMy+yGeGBsMGx7s5b8Lenz8YSd3X1pQew4gvseVl/plae0rzpbY/tFG2nQmYgAmYgAnMIoCB85eYI/mzCnBiEzABEzCBqyTATMwjGRndcrOo5fD9Gz428EOM+0T+13F/Fw0UDKV8tofo14qrGjiKD2UoDYaQnQmYgAmYgAm0EPhrSoSB8994kPwUZ98ETMAETOB2CWCs9AwTGRwYKywvy2dk0kwO79YQnxtEGEN3BUPlV4WPOcrq1T2W2HEmYAImYAImIAL/ThQeph37JmACJmACJgCBaMhgrHSGTCSD0UN8yfhgeVq3dC2mJ6yXVnlZdtabmYn18a4Ohg/1PtX2SlvnlOazePCufGaXMILCvuLGZoNiNnsmYAImYAK3QsDv4NxKS1tPEzABE5hPYGg4BCOGYmRUfKyN2Zzk2B+mL4U9Vb7O6NE+Bg0fMvha+8z+EIcRlKfBuPlB8Xzk4LE20rLPhwpIa2cCJmACJmACHQEbOB0K75iACZiACUBAxsOdPAyMzoBRGDMmGBOvteE+Ulhu0DArg7ESnOJYnoYxkpdB2HBWiNmYfw7K2uk4n+VhmVuqizpSGc8Unt7/UbCdCZiACZiACex2XqLmXmACJmACJlAi8A8FfisDgtkT/t+GJWPM4PCFM8K6jwlof6cwvrbGzArhGEj8Z87ftFFGCuv9R47icJ9oo67kMIK62RsClX/4Xk/6T53cCEr57ZuACZiACdw4ARs4N94BrL4JmIAJlAjIqMBIyQ2PlKwUFuKUJxgeKWH0x9IzG8OWZmfIghH1o8oifBflYJd9ZpC62Rwdv6MtzxvS+ccETMAETOC2CXiJ2m23v7U3ARMwgZMRkHGCEcUWXDRg0gwOMzs7hWHE/Oc+Rfj4QG7QfB7D7ZmACZiACZhAR8AzOB0K75iACZiACZyAADM8LG/jQwNv2NfGV9RYzhYMIPnfaWNZXHj3Ju7rMKTFtzMBEzABEzCBjoANnA6Fd0zABEzABI5NQMYK79v03rkZyqA0+dK30bTDvD42ARMwARO4PQJeonZ7bW6NTcAETMAETMAETMAETOBqCdjAudqmtWImYAImYAImYAImYAImcHsEMHD+EtVO/u1RsMYmYAImYAImYAImYAImYAKXTOCvSXgMnP/Gg+SnOPsmcPEEtHb/nYtXwgqYgAmYgAmchIDHkJNgd6UmsJTAv1NGL1FLJOxfHQENTHx1if/NsDMBEzABEzCBJQT4TDljiZ0JmMAFEfBX1C6osSxqOwENSB8r9dvyv2rJpXT89wZ/LMiMz7vavleYv9YkEGYjCHYmYAI3SYBxQNt72p5r++YmIVhpE7hAAp7BucBGs8jjBDQIYai8kD/nTwAxaH7QhkFEvvB/G+M13Uys2dxMU1tREzCBIYE4Lnwqn7HFzgRM4AII2MApNJIuYh9r40n+RTnJfLBp9HNh0qjjl2q4r2c23vtZetqePxi0uydgNu4JJmACt06AMYWxZVN3SWPruci6aQPceGGN91QXSekql6ipwVhuxB/DsUyJKeUfFfaD/OC0zz9mcxPLv2PnfyC30/Fzhf8m/7eQOP7omDJ5so9PmdwA8zTnsTYc/8Tdy3MfPO93TT3K+5W2r7X1dJonwX5qlVdkQkrFwREmyT1SWNOysJRh6Cs/XD/RxhOz/OZ6R9napnT8RGlmMVD6vO0YxPh39UmnfKTFsHxf+79MZrjABEvY3AKXlqY0h3FK5rPPp8ZE4UcZg/YlOkzIpekpeb/R9h9tjPWbPABTOdWx9TDU66VKltGx9RSyqs6rH19pkZqeCj/4Oa86Rtu93mPOP+bB+Ys4X0I1GO9O/KTtTvvcJOfGDR2G+L8RJ79zOubG+iP5e+9exLDvFY/xQ5lc5PC5EebmeJMlTSqPutfUw3KipqdMSjc5y6E0Y0x4gf9DpeHCHzYdszSMPIuc8lImF33KqJVT1VH5MWpzY0WH7U75YULb7vWBSimBodKftXET9aqo0BY8k81FcBlqvgWnQZkXyWGgQ3doPh2Kpp2FvIp9RmWtHRuaZF6S6Fb0FBvGFh6+jboWHkpTHVtHCx9EttQ1yDJ2WBxbt5J1rOJKXPFcqKQ9i+CF7VHUU2Ud65wvtvtZAF0hxFUaOJHHR/J7N6nqLGEJl/zaExgMg9DRKkz3yozpfpfPTMZWbnE98YTA6KgZB7mMLTKPMXmqerqXLrWP8fha/l1eyZx95f1FGzNAVSNF8bRrTccau0kxVC660jeQIfSVyUz3s4S9ftaQ5xRJWtq6KtcCNhial8BlqPMqTsPCdHypHAqqhCDzqZEphy/hNdZnate3rcegsjb10FvRk2sabTDlWniMja1T5efxLXXl6av7us7XxtatZK3WXYkYOxcqWU4evKQ9xvQ8+Dk/0u4nh7lGgIdrMp95Xm62wwyNGo8Ox/5L7Y/dfHPT3JvVGehImc8GYRySp5slKsTPDVpbT7hIbSRTkUlk+pN8DIG3tXGCMmPWW1KmsEO5mo5PVOGYkbqTjFysuSGgL4QldQpj2SKzR59pX14wsPaW2ikOw/GFtl+1sf9U2yttwSmetqOcD7QflrnJp76d/DkfPSBL1amsJAd6fKCNvr16FkllLGKTyTOHCzp8qbzMhLL/f9pY6lc1bhU/y2VyHZwTgmX1NXOI+XiC1rQscg6ATJ49/RV3sL6qsvf60ZXw2bzPZm1U7DOD9l47NgyK6x8euE+ka9ZJ9azo2NquyE4bbOGKY2squHYOpfhWv6QveRVeu+aUxtZRWVtlSelquil8tI8ofu+aNaFLqnKxn8m0dw1dWmhW5knPhYH8pXYfJLmswweXJW6btOo83GDi+Lwjy51+1va79u8ILDnFYQRNxXPy0QmCI482lpNRzyY3J1GOtfWwPK/lKdO9IpXfKEuNCRcaWGDYcZLmxqQOD+5qOsLuTa126YSsvJOF8fJaG8bKTsfcWL+VbXwquucUR9n0Jd4BYuYK/elroU/EeD4nStl8qIL0OGQtPtVRGm7wKXOu+5cyvIp1vdQ+x6ucylrERvmWcmGpR+CiMu60j2FzyZwWcZDu9KHRmyal2bSfxDab1VclY5NT2bV+dA18mvtsC6zYDtVrSl6G0nJuwLB5DFKe5n4TZTlUnxht+2PpOaJja7sythSvUbkOU/uxLe9q6RRfPIdq6WvhNX0VPnbN6Y2tU7LW6q6F13SLslbPhRi/1z8VPqZLEENpms+DgtyMrZuNtVN65vUr7UHP+bwu7ffafRB3kYcPL1LqaaHTzQI33TzN52aUG9m9J/IKS46OVL0xVhxlckF6rk4nLzhuyJ7puHqhiunmeE31xI7PcqpgWAwqQJ7VF+FYRo3Ju1Fv6grL1HTMTAbybDZTobJqrqbjY2Uotofkoy/wDlW6QaD9/l6roBDOU2mM2d4Mg45/iWmpm3eRmM2iniCHfD4/zSxLyfHu1qNSRC1MZTFrxlLAVC/yMBPFVtS9VlYKV741bBZxUd0Y4fm7a/SfHtskX0x37pyWcuCcx9gec5v2E1W0pK+OyRfiJvrRxfORknP67CQvJZhikpfRNDbkGbQ/p98cpE9Eec5Fz6KOkrG1XcO1dsB4yWH1fmPiHJpbV03fsWsOY0h+/1CVda4wE7pN9ZEluiQR55wHKc9O8m4+1qrwKT27+rVz6HM+r2vY7nncRe4/vEipp4XmYsWNaLrRxhDAMMGKT2HDUrh5ooFrLpU5ZiSFvKrjPe3QiaccS3OGN3StjIuHcgAAEjtJREFU9dDxecpTcntGierhBja/aJHvicLzG0zCmLZO79VMMSF97liqRp7gVM4aDqmYmr+nYy1hFs5Tum6mTfLR3slIyJJVd3v5lYo2SMbSTuWFtpT/VOHdkkUdw2HIWUHBDQfWFD7mY0Tmhi3L8qg/9F/5S9q6p1ssq5VNL69EaeIS0yFr51Tv8HxIcZfAaQ6HXG+M31r/OJT+qa9U++oB+tHF81Fj0LfzttulPrsFr1h+d01JjR/91rEhz9Z83mR6VPsEBV+ynjUdpVa1XXOY2ucmO5w7KXwhj0fDclJ58nvnicqnvnAtnlvXQN+8345dc4Zja1FWlb1kfK/qNtRbx2PjSKsuKia45vMgZYj+wcda1dPTc1D/Qc/5QV3Ddh9EX97hQ4nMDQWNeE3K0WHyG0Ad7l5qw8CpvYcDB07kmqPMmnHUy6M6uBjRMZe4yXpU/mcqGP0w4lgK1d1MxwoxZHo3ikoz5LFTGEu1xuQsMlEeOP0e68q9nuxKt4ZDXm5pf0/HmIh+XGtHwntcSgWXwqLOw/zhohnjdvLvYl44dIaU9lm/3BnG2mfZJI7ymO3pLtaK45jBhyWVIY/87rPY2icPuudP/Kmr6wNKs6Sth7qpyGkX5RnmrXFhQAy6pnzy85u5u7xGxVU5kU7xPESAF7rTH5k9C2XIR6ajcYr1tXKgf3Rtrn2OuS6x/IJzJjjtV/VX3Op+Equp9lXVsVk/UlmwORofdFOdq/pH5NPcZ+fymskEcWiryTFI5S7uN1Hnap8g/kL0rLZ91LG5XWP65NGHGWM6N5dHzFgcW2Pc8DxZWxf5adPJa06saDi2FmWV3kvG96JuKovwYVxtHGnSRWWOnQe0/xNtLEVn7LjTxjL17poXZdp0DJmpp0Rad86rvkk9qSS6Ybun8EvzuacI7fhAOyhFx3+s7eJdbFD0yG+cdgrnZpFO/ILIoVM8Jyss9pziCOfk65W5l3BlQGs9UZedfGaAuhvbrHrkrc3uZMnGd1V2jUm6MHQFKC1GF8umDsqoq/C+rUo6cjEutqPC9/SRvC0zbTulo++wBadjLhxcaNGXp1K5e6MDNvIhC/UGp2Muuizv42acPvlY/tDoYi1seAdIcdSTn5vUuVN4kEU+5RP2jPAVbhGbKEcrF9IFLvLpQ51TOXDp+k48nuKE4Qcn+gHGfieHjo/KKdbd1a/jsf4h8e4NbaVDzkfxOMhMpMKP1U9oj9AmqrPXV5FjgSv2I5UNm2Pz2aJ/IHNTn53Lag6T2Db0k+4cKdWndGv7DcVu2idOpOdY26Pj0nblWjy8XlPeLCcme+dJVsBenNI3jVNZGaXdILfKKl5zsgxcB7qxdULWLFvTblE31UF7sAWn40NfP1m9wkqVV9r4axD2u/qDEAcYQ+boqbS0wyNta875Fj2jurteu6fAC/Tp38GYf3iBwldFVofgJhurH8fNfzdbo32eeOLCV7J0XHoSxnsTfDigu4Bpv1rmfXHb/M6pR2np9MOTMRcEBt2TiDxiwf4eE5XBxYcBBDbIgTyk62YpdLzIqQxOMmSnk9IWXNi72QztJ1fTkQsoMyAlx0wHyxWpA4fcL8Ne20/Kz4uQb7TRh55q+1Vl5u2B/E8VFm7i5aclfwoOulHOTuFwzGdiCON9ne8Vnp62wSFfvoTepEnsucHnyVNev4Jmu6TbEjYp7xQXeL2QrBhwyMs5SvsymNJ/uvOOOG1VTorbkV5bMIwGeYk+BadWDs8kH/0w6K19HlKgB303uVH9lXerfjLWV5Msc/zEoNSPUtxUP1nNB4HpE9rW9o85fXYOp5R2kol0mDMGre03yLV1n6DMY+s51vbIs7Rd+Upofp5S1lKHjL37jVhQYlU6h5bW1XJOpbK5dtIHcleTNU/Tsj+mW4o7+PVB3NOY3I2vCqNP5A4Ohxxrq3pudc436pl0LrV7irtI/9oMHG6wizfZamhuIkqzHXnDcbPFid11dOWrlplnXLs/sx5OynBjrHzPtaWTdad9btrx85vFNeLtMYnlc5Hf6kLfyRfl7vh3EdnOhI6vlBQDYc/FsocX7r10tQDl50nK6NMU8k6ko33ekE4uXFyVfrjMkKVKqR4uOjkPjCYM96m+TPnNTuXRXxaxibImeat1tqaLBUxyUnn0zfAQQ/vcyH4nH8MJd3ROrfop3fBaVGrLSf2l4+p+0ipzINrwo/Kq/ai1rq34qJzV/aNV5gY0xSQt5SvNnDFobb/ZtchUVGYksKXMLfVUWWNtv2uRp6IO1+xF18lCecjYu98gjWSrnkOFMpqCVGbLNYe66T/4w/uHoqxNlWeJYrlFfoprHV9bdBk9D1QXD7o5r7rxVce9eynFHWoMmdQzyla8l81wpt2qro167pSu1u6pjov0H1yk1AcSWo1Mx+NLVOnJyYFqWl1sMCwkZ3g6OSgtXYgGwcXD4UVsL9GZMqnqKHkTG2ZHztFhrDCL8XEUjhmYxwNBw+xYbN8Pk04xDXpNGhOD8jicbOtCnlMGjXISE55qMwPCRzHCcgr5d5nAl85pVP+o5yH6SYawuHsu/WiUzwH7RxHKSOCxeY1yiXKO9ZsRVUajzkbPhrYfVaQWqXLDfYH8luvvJI9Yzhb3G5N11XQqhBfH1g1lLVR5kKCp84D/qeP+idURrLZg//VAkksZQ8Z0bdETtYvtPuBxcYdvffHFFzQiU2Wsd9/yRLk4GElgcaCxu+VtKfzc/XiSMpXccgGepU5iokxc5HlvZPM6WgRq0TGm6b0w2FL2OaSR7PDlyTxT4xhBrA8OT7xiHDcnPHWyqxC4BU5RR/eTSh8YC76F/lHTf6zf1PI4/J6A2LFs+Gf53YqJLdiovLO435Ac3OSP3j+ci6xbcB8rQ3oyDt/EWNvS7mOszi0u6kPbvWUDp9I6grP4P0UqRR48+NAyH7r8FkCtMigdT2Z4x+OijHbJywOHp9qYlaAPtk5TK7ndrRBwP7mVlt5WT/ebZTzF7aA3vCr/5PcbrTK0pltG2rmOTeDa2lP6YKjbwDl2R3J9xyPASavaWL7k2Y7jYXdNJmACJnB1BDSOXOQDs6trCCtkAhMEcgPnwURaR5vARRJQJ+d9DGZweFfDzgRMwARMwARmE4hjyMWtBpitqDOYwJURuKqvqF1Z21idlQQ0MLE8zUu8VnJ0dhMwARO4VQIaRzyG3GrjW++LJnA1Bo4uQn9cdEtYeBMwARMwARMwARMwARM4MQHdU791YhFWV39NBs7FN8bq1nQBJmACJmACJmACJmACJnDjBPwOzo13AKtvAiZgAnMJ6Okef07Ll6VO6iSD37E7aQu4chMwARM4TwJXM4NznngtlQmYgAlcBgEZC3x58EWUNhkvzxSe/4HqTsfp/zJO/gl2yfKVNj4JWvx39MsgbylNwARMwAS2JuAZnK2JujwTMAETuEwCX8pQ+Dxu/5AKb7TxJ9CdUxxGEH8+u+qPfpWfP03cyvE5eP4s0c4ETMAETMAEAgEbOO4IJmACJmACEHguQ+HDDAVGwzsK489nkyNsC+MkzRClchf7kg9j60P5GF92JmACJmACJrDzEjV3AhMwARMwAQiwzOv1BAoMiepyMMVhAP2ujWVt/Dv7ok/sKh+GFobVB9pnNik47TNb0x2ncPnByJH/QxbmXRMwARMwgRsl4BmcG214q20CJmACOQEZDt9oy9+3wZD5TWG/kE4+sy55PMGdU/yvOvhRPkYNhlJ6n6dL07Kj/MzEvBfL4WMGHO/kY/DkM0wEJ/eTdj5KB/ZNwARMwARum4ANnNtuf2tvAiZgAnsEojHxsSLezyIxcHgvZ88pPcvWMIbSuzl8gODvewnbAh4rGcYW9VNmMqowbmozTKRBPjsTMAETMAET8BI19wETMAETMIE/CcigwFBgqdn7mXFBAmZSkrHBce4+0UG3dCzmSzM/GD9D4+OJ0vyYF6B9lp9h2ISvs8l/qrD8fZ8PdDzMk4ooGl4p0r4JmIAJmMBtEfA7OLfV3tbWBEzABKoEZFRgiPAltbDcKx7v5GN0sGHklBzhwTAZRirv3js7CmMp29SSMmZscgOH45fKx/K1YDxldSF3sf4sjXdNwARMwARuhMCDG9HTapqACZiACYwQkNGAkYBBwf/KYETwzsvn2sLsSDQqSFNyGBy9OKVnFmitC0aLysK4SUYU+0NH3bwDZGcCJmACJmACXqLmPmACJmACJhAI8J83GBHD/77JZ2B4J4ZPRw9nS1iexsxPMnIo56W2Ne6ZMlMmhgv18YU0/mR0OHujoPCBgVxOwuxMwARMwARulMDDG9XbapuACZiACWQEZEj8T3ZY22VWBkOCmZ3ORYNnUwNDZWLQsCWX76ewndJhTOEPja4ujXdMwARMwARui8CD21LX2pqACZiACSwlICOCr6Tx/zZppmZpUVsaI8noWiqL85mACZiACVwZARs4V9agVscETMAEDklAxg0zNZ/KDzMnS+qKZSzJ2sujcliyxtfXtjSYenX4wARMwARM4PII2MC5vDazxCZgAiZwUgIyKHpL1E4ozHeSJf33zgnFcNUmYAImYALnRMAGzjm1hmUxARMwgQshIMPi7tSinoMMp2bg+k3ABEzABPYJ2MDZZ+IQEzABEzABEzABEzABEzCBCyVgA+dCG85im4AJmIAJmIAJmIAJmIAJ7BPwZ6L3mTjEBEzABExggoCWh/FHoN9qe0cb78Js+pnoieodbQImYAImYAJVAjZwqmgcYQImYAImUCMgg4Y/3Hxf/h/yf6ylc7gJmIAJmIAJHJuAl6gdm7jrMwETMIErISDj5sOoir9kdiVtajVMwARM4BoI2MC5hla0DiZgAiZwGgIfqdrfZOic/Itqp1HftZqACZiACZwjARs459gqlskETMAELoMAMzievbmMtrKUJmACJnAzBPwOzs00tRU1ARMwgeUENEvDxwS+1Pabtt+1YdjwoYGX2vac0pOWdLh3tX3umZ7Awj8mYAImYAIHJmAD58CAXbwJmIAJXDoBGSbM1HyvjY8KYODs5KcPC+zN4MQ4DBo+REBa8mPw+EtrALEzARMwARM4KAEbOAfF68JNwARM4LIJyDh5JA0wbjBYgnETNWL/F4X13r/RMTM9H8oPxk1M+7l8yqg6pccA+kwbRlSet5rHESZgAiZgAiZQImADp0TFYSZgAiZgAokAhscjGR3fpIDoMyvzwyCsO1R6Zngwav6pfT5GMOW+VoLPbNxMYXK8CZiACZjAFAF/ZGCKkONNwARM4LYJfCL1e8vQZIQwq8NMTVqm1hFSHDM7X2nDAMJo+VVhGElT7mMl6NUzlcHxJmACJmACJlAi4BmcEhWHmYAJmIAJ7KIhgzEzNGQweogvGiQKZ0kaS9owcthnZualtm45m/Yp94W2X7Wx/1TbK22dUxqWrOH4SAFGEkZQ2FdcvlxOwXYmYAImYAImcE/AMzjuCSZgAiZgAlMEhsYES87SBwQ+lrHBbM5O/pfaMFiC035xeZrCMWh+1va19ln6hqHEF9k6g0nhGDc/yGc26LE20rL/RBtp7UzABEzABEygSMAGThGLA03ABEzABGRQMOOC0REMGIgojFkUDIzXHMt9pLBkAKVlafcx+o3pv5FPWckxG4Pxk/KFcB3nHxe4y+IxiNIs0jOFV9/9SRXYNwETMAETuF0CXqJ2u21vzU3ABEyghcA/lOhbGRXMqLytjWVkzOAwW0MY79kk90w7Hyr8uXyMEhyGyvDz0J8onHKTwzDqZm8IVJ78owbEhzIUnhtBJLUzARMwARMwgR4BGzg9HD4wARMwARPICcigYOYlN0ZS9F5YND5GDRClwfBhy2dvMJh+jHE7+dQZnPaZLepmc3T8jrY8b0xpzwRMwARMwATuCXiJmnuCCZiACZjA0QhE42VowKQZHGZ2dtGI+U8Uio8P5AYNHy2wMwETMAETMIEqAc/gVNE4wgRMwARM4EAEmP3hK2t8aOAN+9owZPikNMYPMzbfaWMJXHj3Ju7rMKTFtzMBEzABEzCBIgEbOEUsDjQBEzABEzgUARkrvG/Te+dmWJfS5O/tjKYd5vWxCZiACZjAbRPwErXbbn9rbwImYAImYAImYAImYAJXRSCfwWFpwFA5/oNg70XSYSIfm4AJmIAJmIAJmIAJmIAJmMAxCMg+4T/Xur8wGNaJgcPLm/lSgDxN/mJnHu59EzABEzABEzABEzABEzABEzgFAf5Prer+H7UjCMDqgAVaAAAAAElFTkSuQmCC", "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} u \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - 2 R c \\eta_{2} \\rho \\left(c + u\\right) \\left(t - t_{t}\\right) - c^{2} \\eta_{5} \\rho u \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c^{2} u \\left(c + u\\right)}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} c \\rho \\left(c + u\\right)}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x} u}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x} u}\\\\\\frac{L_{x} \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right) - c^{2} \\eta_{5} \\rho \\left(M^{2} - 1\\right) \\left(u - u_{t}\\right)}{2 L_{x} \\left(c + u\\right)}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x} u}\\end{matrix}\\right]$" + "$\\displaystyle \\left[\\begin{matrix}\\frac{K \\left(P - P_{t}\\right) + \\left(\\beta - 1\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho + c du_{dy} \\rho v + c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right) + \\left(c + u\\right) \\left(2 c^{2} drho_{dx} - c du_{dx} \\rho - dP_{dx}\\right)}{2 c^{2} \\left(c + u\\right)}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\beta - 1\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho + c du_{dy} \\rho v + c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right) + \\left(c + u\\right) \\left(c du_{dx} \\rho - dP_{dx}\\right)}{2 c \\rho \\left(c + u\\right)}\\\\dv_{dx}\\\\dw_{dx}\\\\\\frac{K \\left(P - P_{t}\\right) + \\left(\\beta - 1\\right) \\left(c^{2} dv_{dy} \\rho + c^{2} dw_{dz} \\rho + c du_{dy} \\rho v + c du_{dz} \\rho w + dP_{dy} v + dP_{dz} w\\right) + \\left(c + u\\right) \\left(- c du_{dx} \\rho + dP_{dx}\\right)}{2 \\left(c + u\\right)}\\\\ds_{dx}\\end{matrix}\\right]$" ], "text/plain": [ - "⎡ 2 ⎛\n", - "⎢Lₓ⋅u⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - 2⋅R⋅c⋅η₂⋅ρ⋅(c + u)⋅(t - tₜ) - c ⋅η₅⋅ρ⋅u⋅⎝\n", + "⎡ ⎛ 2 2 \n", + "⎢K⋅(P - Pₜ) + (β - 1)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ + c⋅du_dy⋅ρ⋅v + c⋅du_dz⋅ρ⋅w + d\n", "⎢─────────────────────────────────────────────────────────────────────────────\n", - "⎢ 2 \n", - "⎢ 2⋅Lₓ⋅c ⋅u⋅(c + u) \n", + "⎢ 2 \n", + "⎢ 2⋅c ⋅(c + u) \n", "⎢ \n", - "⎢ 2 ⎛ 2 ⎞ \n", - "⎢ Lₓ⋅(c + u)⋅(c⋅du_dx⋅ρ - dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", - "⎢ ────────────────────────────────────────────────────────── \n", - "⎢ 2⋅Lₓ⋅c⋅ρ⋅(c + u) \n", + "⎢ ⎛ 2 2 \n", + "⎢ K⋅(P - Pₜ) + (β - 1)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ + c⋅du_dy⋅ρ⋅v + c⋅du_dz⋅\n", + "⎢ ──────────────────────────────────────────────────────────────────────\n", + "⎢ 2⋅c⋅ρ⋅(c + u) \n", "⎢ \n", - "⎢ c⋅η₃⋅(v - vₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ dv_dx \n", "⎢ \n", - "⎢ c⋅η₄⋅(w - wₜ) \n", - "⎢ ───────────── \n", - "⎢ Lₓ⋅u \n", + "⎢ dw_dx \n", "⎢ \n", - "⎢ 2 ⎛ 2 ⎞ \n", - "⎢ Lₓ⋅(c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) - c ⋅η₅⋅ρ⋅⎝M - 1⎠⋅(u - uₜ) \n", - "⎢ ─────────────────────────────────────────────────────────── \n", - "⎢ 2⋅Lₓ⋅(c + u) \n", + "⎢ ⎛ 2 2 \n", + "⎢ K⋅(P - Pₜ) + (β - 1)⋅⎝c ⋅dv_dy⋅ρ + c ⋅dw_dz⋅ρ + c⋅du_dy⋅ρ⋅v + c⋅du_dz⋅\n", + "⎢ ──────────────────────────────────────────────────────────────────────\n", + "⎢ 2⋅(c + u) \n", "⎢ \n", - "⎢ c⋅η₆⋅(s - sₜ) \n", - "⎢ ───────────── \n", - "⎣ Lₓ⋅u \n", + "⎣ ds_dx \n", "\n", - " 2 ⎞ ⎤\n", - "M - 1⎠⋅(u - uₜ)⎥\n", - "────────────────⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎥\n", - " ⎦" + " ⎞ ⎛ 2 ⎞⎤\n", + "P_dy⋅v + dP_dz⋅w⎠ + (c + u)⋅⎝2⋅c ⋅drho_dx - c⋅du_dx⋅ρ - dP_dx⎠⎥\n", + "──────────────────────────────────────────────────────────────⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞ ⎥\n", + "ρ⋅w + dP_dy⋅v + dP_dz⋅w⎠ + (c + u)⋅(c⋅du_dx⋅ρ - dP_dx) ⎥\n", + "────────────────────────────────────────────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎞ ⎥\n", + "ρ⋅w + dP_dy⋅v + dP_dz⋅w⎠ + (c + u)⋅(-c⋅du_dx⋅ρ + dP_dx) ⎥\n", + "─────────────────────────────────────────────────────── ⎥\n", + " ⎥\n", + " ⎥\n", + " ⎦" ] }, - "execution_count": 21, + "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", - "dQ_dx_inflow_x1_lower" + "dQ_dx_outflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_outflow_x1_lower)\n", + "dQ_dx_outflow_x1_lower" ] }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "dQ_dx[0] = (1.0/2.0)*(L_x*u*(c + u)*(-c*du_dx*rho + dP_dx) - 2*R*c*eta_2*rho*(c + u)*(t - t_t) - std::pow(c, 2)*eta_5*rho*u*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*std::pow(c, 2)*u*(c + u));\n", - "dQ_dx[1] = (1.0/2.0)*(L_x*(c + u)*(c*du_dx*rho - dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*c*rho*(c + u));\n", - "dQ_dx[2] = c*eta_3*(v - v_t)/(L_x*u);\n", - "dQ_dx[3] = c*eta_4*(w - w_t)/(L_x*u);\n", - "dQ_dx[4] = (1.0/2.0)*(L_x*(c + u)*(-c*du_dx*rho + dP_dx) - std::pow(c, 2)*eta_5*rho*(std::pow(M, 2) - 1)*(u - u_t))/(L_x*(c + u));\n", - "dQ_dx[5] = c*eta_6*(s - s_t)/(L_x*u);\n" + "x0 = std::pow(c, 2);\n", + "x1 = c + u;\n", + "x2 = c*rho;\n", + "x3 = du_dx*x2;\n", + "x4 = rho*x0;\n", + "x5 = K*(P - P_t) + (beta - 1)*(dP_dy*v + dP_dz*w + du_dy*v*x2 + du_dz*w*x2 + dv_dy*x4 + dw_dz*x4);\n", + "x6 = (1.0/2.0)/x1;\n", + "x7 = -dP_dx + x3;\n", + "dQ_dx[0] = x6*(x1*(-dP_dx + 2*drho_dx*x0 - x3) + x5)/x0;\n", + "dQ_dx[1] = x6*(x1*x7 + x5)/(c*rho);\n", + "dQ_dx[2] = dv_dx;\n", + "dQ_dx[3] = dw_dx;\n", + "dQ_dx[4] = x6*(-x1*x7 + x5);\n", + "dQ_dx[5] = ds_dx;\n" ] } ], @@ -969,180 +934,14 @@ "dQ_dx_def = Matrix([drho_dx, du_dx, dv_dx, dw_dx, dp_dx, ds_dx])\n", "L = simplify(lambda_waves * Sinv * dQ_dx_def)\n", "\n", - "L_inflow_x1_lower = Matrix([L[0],\n", - " eta_2*(c/Lx)*(rho*R)*(t-t_t),\n", - " eta_3*(c/Lx)*(v-v_t),\n", - " eta_4*(c/Lx)*(w-w_t),\n", - " eta_5*(rho*c**2 * (1 - M**2) / Lx)*(u - u_t),\n", - " eta_6*(c/Lx)*(s-s_t)])\n", + "T_phi = simplify(T_1[4] + T_2[4])\n", + "L_outflow_x1_lower = Matrix([L[0], L[1], L[2], L[3], K*(p - p_t) - (1 - beta)*T_phi, L[5]])\n", + "dQ_dx_outflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_outflow_x1_lower)\n", "\n", - "dQ_dx_inflow_x1_lower = simplify(S * Inverse(lambda_waves) * L_inflow_x1_lower)\n", - "print(cxxcode(dQ_dx_inflow_x1_lower, assign_to='dQ_dx'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### x1 lower inflow (with relaxation term; zero normal velocity)" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}c \\left(c du_{dx} \\rho - dP_{dx}\\right)\\\\\\frac{R c \\eta_{2} \\rho \\left(t - t_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{3} \\left(v - v_{t}\\right)}{L_{x}}\\\\\\frac{c \\eta_{4} \\left(w - w_{t}\\right)}{L_{x}}\\\\- \\frac{c^{2} \\eta_{5} \\rho u_{t} \\left(1 - M^{2}\\right)}{L_{x}}\\\\\\frac{c \\eta_{6} \\left(s - s_{t}\\right)}{L_{x}}\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡c⋅(c⋅du_dx⋅ρ - dP_dx)⎤\n", - "⎢ ⎥\n", - "⎢ R⋅c⋅η₂⋅ρ⋅(t - tₜ) ⎥\n", - "⎢ ───────────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₃⋅(v - vₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₄⋅(w - wₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ 2 ⎛ 2⎞ ⎥\n", - "⎢-c ⋅η₅⋅ρ⋅uₜ⋅⎝1 - M ⎠ ⎥\n", - "⎢─────────────────────⎥\n", - "⎢ Lₓ ⎥\n", - "⎢ ⎥\n", - "⎢ c⋅η₆⋅(s - sₜ) ⎥\n", - "⎢ ───────────── ⎥\n", - "⎣ Lₓ ⎦" - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "L_inflow_x1_lower_zerou = L_inflow_x1_lower.subs(u, 0)\n", - "L_inflow_x1_lower_zerou" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}- \\frac{1}{c} & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\\\0 & 0 & 0 & 0 & \\frac{1}{c} & 0\\\\0 & 0 & 0 & 0 & 0 & 0\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡-1 ⎤\n", - "⎢─── 0 0 0 0 0⎥\n", - "⎢ c ⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 0 0 0 0 0 0⎥\n", - "⎢ ⎥\n", - "⎢ 1 ⎥\n", - "⎢ 0 0 0 0 ─ 0⎥\n", - "⎢ c ⎥\n", - "⎢ ⎥\n", - "⎣ 0 0 0 0 0 0⎦" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "def pinv(x): # Moore-Penrose pseudoinverse of a diagonal matrix\n", - " if x != 0:\n", - " return x**-1\n", - " else:\n", - " return 0\n", - "ll = [pinv(l.subs(u,0)) for l in lambda_list]\n", - "linv_zerou = diag(ll[1], ll[0], ll[0], ll[0], ll[2], ll[0])\n", - "linv_zerou" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAASUAAAC7CAYAAAAjfIjwAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAgAElEQVR4Ae2d3bEct9GGl6fOtYqmqhwAlYEsRqCjDCQyAsoZyMUr+o5lZWB9EVBSBrIiIKUMZN+rSvQpJeDvfUA0hMFgZjB/e/bsdlfNAoOfBvptoKeB+dkHL1++/PhwOPyko0bf//3vf/+iluFpjoAj4AgsQUA25RfVe1yrq7wHV1nG14r/tTj+meV71BFwBHZAQBOxOkF3aGpXljPk+Ic6Utqa761z1xZR+E8x/Xd27lFHwBHYGQHNua/UBPNu07knvjfi+VAHBu8jHd8p7V8K96THauNzHTg4g6T8b8pMpZH0OT+5p8S5kyPgCBwJASawmvpQYfISNmwaI8T2Cwbibzp+2JB3lZXaCkZP4ZfVAo2JJ2WUJAxW9ixc2Ub8z76Y9Ikn4FQgIFzwYl4oxGDsQX/JmDKnbrPz3aKSJ2wDRfkWtZMv35oZqEFcQ9aEWHqs/JvYGUWXkepjXf+tcFM3dqw3aou1LZPmL4r/PFb2PucNyal09MikIMSlZuAyWR7pgP6mMqv0ofpf62BrgPHi9AcCjL3BPVvhxQ2oFzqYY+ihuiQCW+Uzd9AfOIdxrDDXG21tcsNKfBkfT3X8VfHc8CkpEX2yfaOU2BpZ5CmpM7hpb3TcKv6FjipgrZ1QfQT9LPJtrbZFuTAo1O69MUjqa+jzTOGrcka8vxMvLgYMMgY/IQOYQb2Vy89SgkE6SiqzRLZRniec+VTy9vZWrL/KY0yCPxf9J5aehyrDxYQLyL8UR2+9caw0MEWvq/eTxANDiQFkvnJUSeWQC/kGy1QrxsRFRinW/UzhakEjr9GrRiyzR8BVaCsZ9uhfjeeS5e2YnEN6/E2NL2mr1+c4IW4aBukm7fU6cGIJwgF95J7MUA/xRF7rwBh0KGJpxqF68VAZ5hUG6Wcdq5fRkQ8OSEvfKYNHNZuuZ9f4owJWeiuXnAG7Fa+DeKEMJtWtjoc6D56cQpT4QgfPSRB/pgOlB1I+MjEAniie3F3FudKn8/elt/kVX+sT/eWK+EppvSvenNYynlU5C17I/LxI4xR9bLkBi/GnrdU8JV9Pv0rjCs4k5pk7JgQGjrtO3BGapbsMv55OlLfFGBm6EKi7PWIs1Ix18LTUHzzd3r6U0sGBsfyV4goCJqtWNDCZQegbOQe9wSFeV0MZY+kS0iz3ai9DvAAc47EJiR8T8QeFKOCtDozQQedMfhTFuhug6DtyBBli/scKqceGO+UPCinDQBwklfmHDngvoR9V6bXq0+4rHZwvJvEZlTNnrLJgT/mkR9J0MNBZEvQms9KWyspyn0G6itR+T79KC7oSY/rNcoUL0Tc6wn6ZwjCpKVeLVzpU1Qn1VXbRGCna+ETnyDFIsZ8/KQxeifWbCoozHtFPmIcKexcxpbFP+iA7MNDHJOQLuM9t9GpuhVgeUNhPanHjppqg4++mCrXkqz8MSPZHbJLRv09jXa6uKLLTZ52bQh8pn4EcXGuFt7EesmLcxgj3eapMr77awKV+m/WBvjFxbJL16jQkTMmZswh6VMKX9CX2h4H+XPEhz3WRrOIJnosGqeoFUp+G9IvuvtVB39Fx7o2BpY0vlhO/KP9/CjFglq7oe1LemE5mjRHxwsDT55LyPpV5dh4MTzxhjCLbQfyoyxhhrORlyD4lAttF+r5eKEXV/YyAfaLQjEILe0C+LQuKB0pggk0RG3xmaBh06equdPiiUKiTp/OOQo2HQpZ0+UBiSVVdsyvdCDymyljZPGTi55OfK+gh9puQfpSKBd+yLZaX5iaPygn/jIIeVRcvrZWWytoxAFvIJh65fg86p28Ym0A6Zwxx8UzjS/EHMXsoGNNJ4CMerWOEMVbziDBuqU8DHcHTMZ1ywWMcYmzDsi3WWaqLg3gvmV+x2aYgXGCbShaFlholwM4nk7F9ocgrTqLQTDLcRtbmKAGgy3rVzqscxgTQ59BDFTYDleqJF+llXlBozDsopH8QsuVGiXP2eXDbzcBRnj0MCL54V6kOZXU+KrvKUA+Dk3tYGNR0lVeZEquD0liaVnFROjw5cgyG5FSxIGtvP4KMnMS3KqvSJ+XM+CBr6pfqzpIt8illy9iHKJjn8qC7zgUyYkS53uMnMW9UJ6GVhjEiXnhcyIjnxnZA0mvkMSfAsHF3upSH81zeZp7itWR+NfNXwRbDW+V3VU0dSZQwDESoVDYTE3f1NuRqUiqOpX+tA0CJW14sEowX4DAQtqAeL7XLHgjtprZ1jgymYDyLksLkUTnKPNTBOfFASmeSfqSQ5R5exiOFacLpvEX2wE/1Qr8UggFpz3UsosirSc7YHrJ19Fg2rHJjsrbIaSyRr+Y1WH5LWNUvFU0ehZQxCgbZThS+03GjMsiMoTBja0Xm6GRqjATvU23gyZcGiX6AfZVUvsQKmTCktmw7qEyYhwpzeav87igR+ZBzNl3PqSEAsP64rhBgE9I4gAFSuoIrz1xPFB2WG0obsupctTBo+cRWtdmEp8EtUJQK0bdXIfZ+WUceG9KARV+QhT2GW4VGGAXKMYHoDwOKwZsrnysgbR1UDrnfEjdSWovsYMVrAGBK+3iUeJJ5X5Q0mwyDQTljm6Yr9IgnONTuoKyq0yKnCUB78FpDJltNv6SVy1DGXt4mXovJSd//q8NkUDSM3xadTI4RtfNQ/KwteOfEuDIZ8vSD6pmHxbKTW/kYUMYXe4/BuMUy4EkZLrpD86rDe+2J2qHP4AmuzFe2V35TWOKu5OApLZrP19Rupdh4rQM9FirLxillAS+ApvMvdeSDwOohHMKuAle8ASEfhMb/oDyUO+oVUFjlUHxQPueiPP4+5b2xs6tAMLqqx5U3DRrFp2THkGMMavytndmh+E3KGfvWpEd1gMlVlVV8mnSscvA4KFw0SKkLxfpN+lVZLhZM2rzN/yjtT/CKVBqNJp2IJzrL9ZbHjTfj4i0nKl+Oey5wT8grSWXRS0c3SqOfzKNAtTKWt2eodsGydY7yeEZ+IW/u2lVzyfkFedYHDwMv6VmMByWVrJTHRMI1rV49yvIncI5ieG/p89gXvJxHWb9aZGfSTBrJjKdF80lmaXuGY7K2yEnf7KIz1c8tZUtGIWuUu4q2bGP/0+7MWpGlOrH6eRgmpNpjDpR6ZkuDts6ZwsV6iYAPso+8sUey5aCY3R+1z+AdW0rM5nmKFSQnxpfnpdLV7xT7uUWfJCOTMn9MYwu2kzzULjceeM6n5pn36qvcUXWi9tge+ELhIm+iJ8AJJUQsuSHDxbqJVJZxwpx4cN1U40iF1CH2coKrf6Qm76QZyYjxP3uDFMH9VvKWy6TdcVeb1WXeUMN3oBPzHmf1c6j/J5aOd418i2jP5duiDt3FAF7UUa/UhIDrsw6TcMGDY7P4vmxZ1AUpUqM8yNXkoRbVw+nJGaVaJz3NEThTBLibmJ5vOxMZkWeV9+dG6UxGgotx/xCQN8GylkcyeAzg3lOUA3lW7U037ympId4XcnIEHIEdEND8WrwHs0N31rDkualefaVNvd6T6swxSs1ME3ePOAKOgCMwE4FmozSTrxd3BJoR0FX0RoW568qmL7eRecG4fLZHyU6XgIAbpUvQciGjJjwGgIcHIbv7w4OFnVv30ViwaclDojy1/EZpnaeNlbYFYYTCk9YK6Ruvf7hnvgWy95CHG6V7qLQNusy6P90hUTw8aCi+nYfdlM67Yjx5fKOQO0V7Uf4Beoxkxzju1ajzPU0Erk6zW96rnRHgXSyWTEZssvJsSe3VBx7y3HUppXbzuzX0ZU8DaDJ7eKIIuKd0oorZuVt4SdX3ECvtYrySV1XJn5UkA4TRse9r8b5jWg4qjsfGU/1n9+rFLJAuvLB7Shc4ADTp+Q5UvkTC6PB+WscY6Nw8p008JfHjfa/e99NRgfIwVsEgKX4Wz+0gl9N8BNwozcfsrGrIAGB42MjO93VMRryk8vMfljcrVDt4QfmLuSzZwlv6yuPbTxii/yrO83CbeWbi5XTPEPDl2z1T2JbdlQFgUxkPZejjctX9JNXjDhlfnZzjQT1VnbRXpLp4avZ5j5pBVLbTJSLgRukStS6ZZRQwSCyXwtcK4jnp+abz0H4SjxO8AjqVx9Pi42jcubO9otq32DFkOW+dOjkCfQR8+dbH5OxTZEgwSCyn+H4Nf4iAYeFzE+90BIppxDvekNJZ6nGnzvak8Jh4I/y1jsFvsSsPr4h2E6keXpqTI9BBwD2lDhwXc8IeDp4LYSIZibCXo5D9nWcxgxcsiVIejwgDlr4FpTz7RAVe1di32Fm64ZmZYYJf8LYUOjkCCQE3SgmKy4nIMOTfqe4Jrvzed6J7hWKCyrZ+p5ulm29gDwHp6QkBjNIH8czClOkRR6ABgfI73XhTrc9ANbD3IheCwJ9NTveUDAkPFyEgTyndUVvE4IIqCSv24u79Zv/ecmCUfo/jwsILGiYuqiNwHAQ0kdmnwyBtZpTE80b82Jtjn+6YX1fAuPKvMOlpfLW/ln41BlcW8dARcAT2QYAJLM4fKuRLC1sSX1fgzzMxDtw9DTcatmygxkvthTuyCvkHks3pXhglCY9Vtrs2m4PgDNchIN3gBThVEBA2eDL8RyBGY2vKHzplftxu3cAQP8mDIeTOLPJtSpvvKamTuJTcZeHqsPobPOJn/xu22O0VD56HYeLwUB/Py5wlDcmpdHTCpCDkFj6Dl8H0SAfErfo1+H6t+jzz5HfX3uOZ/zL2eCasSsKMRyx4GJX5gh6qSyLwVT5zAf2BNX/pneuMdjbb3xNvxsdTHRie3PgpKRF9ot1N9b65pyQBcO3e6OCdKf5srwqy8idJdQGGB/I6D/BNVuwXCINCfM7WIEWRq3JG/L5TGd49Y5Ax+AkZxAzsLdx+lhIM0ElSudDPyYLnUeCp5LVnuXoSKY8xCf5cwJ/0CihBZbiYcAHh+1borTOOdQ6e6HTtPBGb9JQ+BpD5x1EltYdcyDdYplpxInFzoxTbq74zNdGXWvboVaZWYSCNq9AmChvgfyrJY3IO6YRXQ1YvjeOEuGkcoKvbOxXAx/ohLNBH7s0MFccTea0Dr6lDEU8zDr2Lh/KZIxgkPKdNltGRF85ES98pg0e1GV1vxqnLCMu+hUvHIB/kozwUYu9bpW/zKB0lvtDBpzKI83QySg+kfPrHAOAZm+TyKs7VPp2/L73Nr/han+gvV8RXSutc8ea2lPGsylnwQ+bnRRqn4LvVBiyGn3Y24Sf5evpVGldwJjFPozMhMHDceeKO0CzdZfj1dKK8LcbI0IVA3e0RY6FmrIOnpf7g6Xb2pZQGBoxjHmBVEPBYvDKBwQJC58g56A3O5Xk1t8JUeYFj1n6VZyI+KOh2qD3lV7/No3QmP8pi3Q1Q9IM+hf7EfN73QnlsoFP+oJAyDMS96Ecxfh3bfaU454sp9ntQzpyxyoIlciadkKaDgc6SYNZkznkXcZbtDNDVpD719Ku0oCsxp98sWbgQ8W2osF+msDapx/pS1UlsZ4sx8okaR45Bin3+SWHwSnIZFGc82ieJDzrvXMR0zh7pg+zAOB+bkG8u7qN9vBrNXZYJkFt8gwdB39W6ICUwIKvf5lE6V1cU2XE9dW4KfaR8BnJwrRXe6hyi329DbOBHZfm2NYZgFqkObvVbhdYH+saEskk2i18sPCVnzjPoRAlf0pfYH4wwfxbQ80SVtkhO8QPL1QNU7Q/pF919q4O+o+PcIwPLMF6UDrahH3lc+YmUPqaTxWMkNfA+kvpUpOenwfDEBMYHsh3otwLkYKzkZcg+JQLz1TrPBbrOTzaKV13WCDJvlKer9UR7KOV2oAxr2HR1F0/K2YTv5Cm9o9Co5INClnQMfiOWVL01u2XGkHz6NZeY+Pnk5wpKH4J8ChmIGJkpYpPTjO2onAWjoBPVbXXtl8oZjELettoE43LQMg5KrFk62xKgI5vSc/0edI48eEuBdA5+XAgDnopTH09ZQfAO01ghIdKYTkwvTWNE7SBfuHlgzGOIcbM+FVnpFG/H5OaiyDjE2IZlWyyFvCVeMWs8EO8lY2ucaTc3XGC7SevO9jBKGIF8AloPXyjyyk4awjFhH6q+Tc7ESgogvcwLCo15B4U2SOhnbpQ4Z58Ht90MXOIdI7MHh3jRHwZt7oUxSdJVPrYH7yaKPFvlhCeydfYjJhqaLWfkh5wdvaivvbGgND6JOyZvKVvZXYx6Lg/ydS524j/4F03Km9RJbLB1jFBudJkW+U0F8OBucykP57m8U3xSvngxlsewTmUXRloM7yzW1yrNIGLg9K5yszipsADAKkPlAGGpxB7GLZmxHANr8MNgKsPdhPIKS3UIoDsTQGVZcnC1Cm1QSHH6Ywrl6onrn1OYQCpHGZsIbKQmo6Q8ziHykSMZssh/VA6Vh/dBZU12+k3a0LMfFB8leBk/Cio+KKfyaI++d3RCvZxUbq2csKOtLSbnmH6DPOpv0pHaZNIlz0nxg/KRGd2wzO8YSqXN0cnoGBHvr8SP+cNykj3KdLFR2jsd9KNKKlvihUxcvG3ZdlCZMKcU5vJW+d1RIvIh51pifIYL2JUiAMNEe6RjMQk0lPN/kQHLDIwELjR7MLYxafxx33FZX+sY+zAYA4r+lYSnwTNQX8aDtl/FQuRhnJhk1OUK80zHQWm3hJGeK6QcdQGWwVQzSB+pDHtQLH0eKcwHeIscTBheBWAvB/4Aj8ue90VJs2lSTtoUVzOi6AQ5exT7tVZO+AZZew3MTxjTLzotl6EYmdzoMkluJBdpGAozuDoN1KqTljES+qI2wDc3SDTEWKmN34PKohuWZM8UD0ZS8bccxieWYVnPRahlea+i60lt4UDQHgYyxGNfasyxG/mcqJVpSQODMFavW0q3lFGnUU45WKpVVdbW0HQkrJWVVnNPAYZJ3MlTWUAIVlVhh5THQMwHaCffTlSOAZQPojxuxWiDCXJQea5YDJpESmuRg6s1y8Ia/8RrbkT8JuVUmVadrJZTbQWDp3D1AI08mvSrsuiFSZu3i9diRh8d8Y+7piugbtKJeKCzXG95HD4HlUFuayukZT94N0+y8xRVvZ5ulAYfDGagWhnL2zNUu2DZmXMj7eHxb+rFXY00tluWhOYqAaGAYECUVl7NDkojD1e2erWBwc7EgDPXNBhQ9eVza1PxFjmYNJNG0njeUbiFnHYBaREhNyAt5cfKoJe3RYH/FOel0dhSJ6l9jYdyDL9WP2jrnCk5FlsJeSdGSZ0vPwyGMsuBFWSUorliDi49QqH9frhavMgMEXtgj7LmRuVQPYxpftXOqp5UdK2c6I+7Z03GJup0KwDQSWc/Sec86mDLNpYgn1pjO+gkeAniCwadi4/SLO8sDVPE8qCwI7dhvTR88PLlSwBj34c9haZBtbSxNfXUNzym8oq3hqXX3QgB180wkMIGY8UeYnU5Olzz9HMkE3tAPPiZL40XdTzixB70g7vylGZ3XJ11gzQbteNUcN0M4yxsmLBsFt/VFsRw51bkRHmQa7VBKrtxb4xS2XE/dwTuEQLcLAl3lu5Rn6e6ijy7eH9ulKag93xHYCUC8ibw8tkXtRsjKznebfUoB/Lsst1zfbfieeuOwGUgECdw0yMzp46IZNlVjk2Mkjr5v1MH0vvnCDgCx0FA9mDwFZ+WHmxllFZ1oqWjXsYRcAQuAwH2lD6Iolp4GZK7lI6AI3BKCPzZOoOn9Hs8sdDyPDxTBOReP5RoPFQI2a1qHjjsPHah8xvlc4eFp9h5xeKN0nbdT1AbTpeJwK8m9ibLN2Pm4b1BgJel0+1cxcNDcOo9T0cnUjpPo/NwLS+3hncAU6ZHHIGdEPBHAnYC9sTZ8nUFvCAj3lvjQTgMUEnp/cQyw88dgT0QcE9pD1RPnydeUvVdw0rXbQlXyZqfJMOHAfxNB0tFXh1Ky0HFbVlJPm/X83WF8P6Y4k4XgoB7Shei6FxMTXS+D5XvH2Gk+HZVxwDo3DynTV64FD8+AMdXJzFEGEXb11I00I/6fR3zXynOudOFIeBG6cIUXoobDQ8b2bUvYeIlld8qKlk0nasd9q2G/uzhoHyedt76zxWa+uaFTgsBX76dlj6O2hsZgsdqkOXU0Jcwq/tJqscyi69uzvGgnqpO2ixXXTy13DPDW+Mw4kNsh1jO0jy8AATcKF2AkmsiarJjkPgccPjSYTw/KMzfZxraT2LZxfKK8izxMCDcubO9otqnOjBkOW+dvifxII/+5PtcGDAeQ3C6MAR8+XZhCkdcGQEMAMspvl/Dv7dgWPjQ2zsdgWIa8Y43pHSWetypw9OBWr5TTjm8ItpNJB54aRDG72A8FVKOtOekO10WAu4pXZa+TVo+6od3QphIxiAsnxSyv/MsZvA2OFHK4xFhwIJ3pfCgPPueDkZk7HvreD54ZmaY4Be8LYXwC3+uoBBjh9c1tKRUltM5I+BG6Zy1OyCbDMOfBrJCsvK5O5Zu1U+U5V9aKIthwds66JznoMxYkUQaS7d8zyikxx+MHbf/fbmWo3KhcTdKF6r4DcUuv1OOgcn3hlqawvvqLBNbKnmZ80QAo2RXsLSfcJ6iulR7ICDvJt1RW8Jf9VnO3Yc/V1gintdpR4CLUvCkMUoMCjY9SWQ97+QIHA2BuKxLe1RHa9gbOjUEbtQh7NA3V6fWM++PI+AIXDYCbpQuW/8uvSNwcgj4RvfJqeR+dUjLL3vWiAcnuZXPZ1GqD0neL8m8t3eFgHtKd4X8GbQr48NzTnz4jeePeCyARwJ44ZZ9SidHYBECbpQWweaVZHj451c+PZKeLVKcGyWcs2Hp5AgsQsCN0iLYvJIQ4FGA/IVaA+WNIjcyUDyx7eQIzEbAjdJsyLxCRIBbuLVn22w/iXwnR2A2Am6UZkPmFRq9oEeOlCOwBAE3SktQ8zpmcMYetvXlm4+TRQi4UVoEm1dqQODDhjJexBHoIYBR+iCmWtgr5AmOQIFAbS/JipgXxXNLTo5AKwLpzygxSr/HWha2MvFyF4pAvPWP9LUlmqXZhveFouRiz0TgVyvvyzdDwsO5CPAC9+NKJfOU/FMkFXA8aRoBN0rTGHmJOgLfKZlvJ5XEv6L8nHlTZb6fOwKjCLhRGoXHM4cQkNHhy5LvFH5uZRRn6ca/ljy3NA8dgbkI+Au5cxHz8jkCeEW8gPtEIRvbhJ/q/GeFTo7AIgTcKC2CzSuBgIzPrYKh7247SI7AIgR8+bYINq/kCDgCeyHgRmkvZJ2vI+AILELAjdIi2LySI+AI7IWAG6W9kHW+joAjsAgBN0qLYPNKjoAjsBcCbpT2Qtb5OgKOwCIEMEr+Z5SLoPNKjoAjsCEC6c8oMUqPdfBNZXtnacN2nJUj4Ag4Ak0I8KXS8G13X7414eWFHAFH4FgIuFE6FtLejiPgCDQh4K+ZNMHkhYYQ0Ksm/meUQ+B4+iIE3FNaBJtXAgEZJP8zSh8KmyPgRmlzSC+DoQyS/xnlZaj66FK6UTo65GfToP8Z5dmo8rQEcaN0Wvq4T73hFm7tDwTs29zkOzkCsxFwozQbMq+gpZv9OcAYGP7c2xg6njeIgBulQWg8YwQBMzh85G2IWgzXUF1Pv2AE3ChdsPJ3Ft3/jHJngM+VPUbJ/oTSwnOV1eXaDoHaXpJxNy/K/4zSEPGwBQH/M8oWlLxMHQHtKdmyrbZEszTb8K4z8VRHoIuA/xllFw8/W4CA/xnlAtC8yjQCvqc0jZGXqCPgf0ZZx8VTVyLgRmklgJdaXUs4/zPKS1X+znL7C7k7A3zm7P3PKM9cwXchnhulu0D9TNqMG97+Z5Rnos9TEcOXb6eiCe+HI+AIBATcKPlAcAQcgZNCwI3SSanDO+MIOAJulHwMOAKOwEkh4EbppNThnXEEHAE3Sj4GHAFH4KQQwCj5n1GelEq8M5eGgB6teHwOMq+UI/0ZJc8pAQh/AkeivWipqJMj4AjsjYAm8ldqA8dg0xeYxZcvf/JyNPP7Ix3fKY05vic9Vhuf6/h6QSP0Fzv0DZ6SkyPgCNwBAkxgNfuhwu93aB4j9H00EH8T/x92aKPDUm0Fo6eQP5VYTCdllCQMVhbL7nQmCEifeAJOBQLCBS/mhUIMxh7EK0BGzKmjrIIkD17SX6N81v6scNFrJmoQV4vXC7D0WPk3sTOKLiPVx7r+W+GmbuxYb9QWf6TIpPmL4j+Plb3PeUNyKh09MikIecGWgctksQ+1/U1lVulD9b/W8U8d/jqKgM2IscdypUrC62NlvNDBHEMP1SUR2CqfuYP+wDmMY4W53miLf59ZTeLL+HiqA8OTG76cN32izUU6X+QpqTO4aW903Cr+hY4qYMpvItVH0M8i36Y6GxUKg0Lt3huDpL6GPs+UvypnxJtPkHAxYJAx+AkZwAzqrVx+lhIM0lFSmSWyjfI84cynkhdDUiXlMSbBn4v+k1ohleFiwgXkX4qjt944VhqYotfV+0nigaEM//enkDlbJZVDLuQbLFOtGBMXGaVY9zOFqwWNvEavGrHMHgFXoa1k2KN/NZ5Llrdjcg7pkc/ZLmmr1+c4IW4aBukm7fU6cGIJwgF95J7MUA/xRF7rwBh0KGLJpOeoXjxUhnmFQfpZx+pldOSDA9LSd8rgUc2m69k1/qiAlV7knv3BIsUYsFvxOogXymBS3ep4qPPgySlEgS90/EK6jmc6UHog5SMTA+CJ4sndVZwrfTp/X3qbX/G1PtFfroivlNa74s1pLeNZlbPghczPizRO0ceWG7AYf9pazVPy9fSrNK7gTOKfdDAhMHDcdeKO0CzdZfj1dKK8LcbI0IVA3e0RY6FmrIOnpf7g6fb2pZQODozlrxRXEDBZtaKByQxC38g56A0O8boayhhLl5BmuVd7GeIF4BiPTUj8mIg/KEQBb3VghA46Z/KjKNbdAEXfkSPIEPM/Vkg9Ntwpf1BIGQbiXvSjGL+O7b5SnPPFFPs9KGfOWGXBHjmTHknTwUBnSTBrMue8K3GW+6nLQz4AAAqrSURBVAzSVaQ+9fSrtKArMabfLFe4EH2jI+yXKaxN6rF+VHUS29lijHyixpFjkGKff1IYvJJcBsUZj+gnzEOFvYuY0tgnfZAdGOhjEvLNxT3072phLwGF/aQWN26qCTr+bqpQS776w4Bkf8QmGf37NNbl6ooiO33WuSn0kfIZyMG1Vngb6yErxm2QVPYfOjAEs0h1cKnfKrQ+0DcmlE2yWfxi4Sk5c55Bj0r4kr7E/jDQnyte9VyVvkhW8QTPRYNU9QKp7SH9ortvddB3dJx7Y2AZxpfSwTb0IY8rP5HSx3SyeIykBt5HUp+K9Pw0GJ6YwPhAtgP9VoAcjJW8DNmnRGC+SN/XC6Woup8RsE8UmlFoYQ/It2VB8UAJTLApYoPPDA1r2HR1Vzp8bcJ38pTeUajxUMiSjsFvxJKquma3AjEfOeYSEz+f/FxBD7HfhPSjVCz4lv1heWlu8qic8M8o6FF157j1tL1E1mAYrO0tZBOPXL8HnSMP3lIgnTOGuHhSDgIbPGXijNE0VkiINKaTwEf1m8aIyqG7cPPAmMcQ42Z9KrLSKZ6O6ZSLIuMQYxuWbbEU8pZjIWaNB+K9ZH6NM+3mhgtsN6ntbKlRYkLnk8lae6HIKztpDKudF2gYE0CfQw9V2AxUqidepJd5QaEx76DQBgmy5UaJc/Z5cNvNwCXeMTJ7cIgX/WHQ5l4YkyRd5VWmh7HSWJpWcYk8W+Wk68jW248gY4Rmyxp5IWvSzVzZIo9StrKbGPVcHuTrXCDV7oOykp1H/EZ1Esu2jhHKjS7TrO2JEB7cnS7l4TyXd4LNH9nitWR+/cFgOtZieKtcrpX6QcyxsFrQEiUMFhYqlc2yh/2IMLljOQYJa9nfdJCO9e9MNJ1zZ4CBsAUBdDn4WW5wtQr9ohHFkcEUytUT1z+nMHlUjjI2EdhIhX8g5XEOkY/syZBF/lOyw/ugsqFfCuk3aUPPflB8lOBl/Cio+KCcyqM9+t7RI/VKUtmqrJH/lJzGjvbWTtAx/QZ51KekI7WHAU2eEx1RPjLT59ozcXN0MjpG1M5XaoOxznKSPcp0sVHaOx30o0oqW2KFTFzwbdl2UJkwDxXm8lb53VEi8iFnK/3ZCl4p8ns8sdDyeqEAAOj/ixksm5jwuMPsp9gmo9VjmYH7+VoHVp74rWUWIQMERawlPA2em/oyHvTXPDfyME5MMNriCvNMx0Fpeb+ek6c06gIsg6lmkD5SGfagWPo8Upi8AJ23yM6E4TUA9nLgzwDGaOd9UdJsmpSTNsXVjCh6RM4qxb4Nydoip/EN8trJwnBMv+i0XIZiZHKjyyS5kUykYSjM2Oo0UKtOWsZI6IvaAN/cINEQY6U63lUW3bAke6Z4MJKKv+UwPrEMWxtchFq2OFR0PaktnA7aw0CGeOxLjfkjJeZzolYmT/vVTq4t0hKqAwBdKr5aVWVtPQywYd2rtCFXE0GZlEP51TbKRPEHBPj0SHkMxHyA9sqQoHIMoHwQ5XGrQxtMEMpzxWLQJFJai+xcrVkW1vgnXnMj4jcpp8o061HtD8raKOdB5YLRUzhnkPZEj/Wb9Kuy6IVJm7eJ12JGHx39V4fpivaadCIe6CzXWx6Hz0FlkNnaCmnZD97Nk+w8RVWvpxulwQeDGahWxvL2DNUuWLbOUTz+RV7c1V5CSAAsPgSYwRgorbwyhQJKJx/XtHr1CIVO64cBZ65pMLrq++fWRcVbZGfSTBpJ45mF+STLkneLDsraKCcds4vOVCe3lA29vC0a/E9xXhqNpTop2IbT1L5wKsf9a5WgrXOm5IzMFXI3o6SO8AAiyjBXlHg5SFJ/VZYr4OhSIhW++whXixfqsxki9s0eZd0alV31ML75VTurOh6NOI0X2jZ3TNZROemG+oveuTs4aXA2lg2ddPaTdM6jDrZsYwlij4sclL5YJ+JTo+AliC/ydy4+SrO8szRMEcuDwo7cNZBqaQ9evnwJMOwJsW8wOXBqTLZMUx/wmMor2JZNOK8jIuD6rIMtXDBWvRs/9dL3K1WysV/Jg5/50nhUiIgH+9MP9vSURjsxlKlOuUEaAuceprs+60oTLkxYNovx0M6GojzI1WyQSuFPziiVHfRzR+CMEeBmid0FPRcxkad6M6JVQDdKrUh5OUdgYwTkTbAqYB/Vboxs3MJx2UU5kGfVNtD1cbvtrTkCjkCOQJzATY/Z5PVOMS5ZNpGj2Sipwf+dIhDeJ0fAETh9BGQ/Bl/vKXs/xyg1My0b8XNHwBFwBFoR8D2lVqS8nCPgCBwFgWZP6Si98UZOAgG52g/VER4uhOyWNQ8edh7X0PmN8rnTwkOkvGrxRmmb7CuIl9OFIuBG6UIVPyE2L1qn27qKh4fhVIenpBMpnafSefj2RmF4FzBlesQRWIiAL98WAnfm1fjKAl6QEe+u8UBc7bWI9G6jFfbQEViDgBulNeidb128pMH3FAuxMV7hKxBFup86AosQ8OXbItjOu5I8ovIVAYwU37zqfIoi85wWvXh53ii6dEsRcE9pKXIXUi8aHjaya1/ExEsqv1l0Ici4mHsh4EZpL2TPgK8M0mOJwX7S0Bcxq/tJqseXHvI9qTNAw0U4FgK+fDsW0vesnWiQ+Cxw+OJhPD8ozN9rwvCku3SZiDxO8IpzlWdz/BMd3Lkb/Fa78pwcgYCAe0o+EHoIyJDgIfEYAN+34V9cMCx87M2+tnmIaUrqfcCMpR536uyZpjnf8Yaf04Uj4J7ShQ+AAfH56B8PUBImkqEJXpFC3mp/FjN4K5wo5fGIMGDBu1J4UJ5tmuNVTX2rnSpOF46AG6ULHwA18WVI/lRLtzTl9z5ub3llqLL8WwvlMVR4Wwed8xyUGSuSnByBhIAbpQSFR3ZCoPyON95U6zNQO3XJ2Z4yAm6UTlk7Z9A3eUT++skZ6PGYIvhG9zHR9rYcAUdgEgE3SpMQeQFHwBE4JgK+fDsm2mfYlpZnPFwJ8QwSzyLxhYH8WSbynByBZgTcU2qGyguWCMj48MgA31DiIUvusHF37QfFec7JyRFYhIAbpUWweSUZHv5MkddJ+LhbIMV5YJJzHrx0cgQWIeBGaRFsXkkIcFet89WAiMobhXz0jYcpnRyB2Qi4UZoNmVeICNwoTK+dZKjYfhL5To7AbATcKM2GzCs0ekGPHClHYAkCbpSWoOZ1zOCwhzREvnwbQsbTRxFwozQKj2euQODDFXW96gUj4EbpgpW/QvTaXpKxMy+K55acHIHZCLhRmg2ZV4i3/gGitkSzNNvwdsAcgVkIuFGaBZcXzhDgzwIeZ+cWNU/J/0zAEPFwFgJulGbB5YUzBL5TnM+QlMQfDPyceVNlvp87AqMIuFEahcczhxCQ0eEjbe8U8vnbQIqzdHuq4/n7FP91BOYj4C/kzsfMa/yBAF4RL+A+UcjGNuGnOq896a0sJ0dgGgE3StMYeYkBBGR8bpVV+zeTgRqe7AhMI+DLt2mMvIQj4AgcEQE3SkcE25tyBByBaQTcKE1j5CUcAUfgiAi4UToi2N6UI+AITCPgRmkaIy/hCDgCR0TAjdIRwfamHAFHYBqB/JGAX3SLt6zxvdL8f7tKVPzcEXAEFiMgm/KLKj8eYoBR4sXJoWdN/KXKIeQ83RFwBJYiYP+AU63//2MYId96fmtzAAAAAElFTkSuQmCC", - "text/latex": [ - "$\\displaystyle \\left[\\begin{matrix}\\frac{L_{x} \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c^{2}}\\\\\\frac{L_{x} \\left(c du_{dx} \\rho - dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x} c \\rho}\\\\0\\\\0\\\\\\frac{L_{x} \\left(- c du_{dx} \\rho + dP_{dx}\\right) + c \\eta_{5} \\rho u_{t} \\left(M^{2} - 1\\right)}{2 L_{x}}\\\\0\\end{matrix}\\right]$" - ], - "text/plain": [ - "⎡ ⎛ 2 ⎞⎤\n", - "⎢Lₓ⋅(-c⋅du_dx⋅ρ + dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", - "⎢────────────────────────────────────────────⎥\n", - "⎢ 2 ⎥\n", - "⎢ 2⋅Lₓ⋅c ⎥\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞ ⎥\n", - "⎢Lₓ⋅(c⋅du_dx⋅ρ - dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠ ⎥\n", - "⎢─────────────────────────────────────────── ⎥\n", - "⎢ 2⋅Lₓ⋅c⋅ρ ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ 0 ⎥\n", - "⎢ ⎥\n", - "⎢ ⎛ 2 ⎞⎥\n", - "⎢Lₓ⋅(-c⋅du_dx⋅ρ + dP_dx) + c⋅η₅⋅ρ⋅uₜ⋅⎝M - 1⎠⎥\n", - "⎢────────────────────────────────────────────⎥\n", - "⎢ 2⋅Lₓ ⎥\n", - "⎢ ⎥\n", - "⎣ 0 ⎦" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "dQ_dx_inflow_x1_lower_zerou = simplify(S * linv_zerou * L_inflow_x1_lower_zerou)\n", - "dQ_dx_inflow_x1_lower_zerou" - ] - }, - { - "cell_type": "code", - "execution_count": 26, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dQ_dx[0] = (1.0/2.0)*(L_x*(-c*du_dx*rho + dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*std::pow(c, 2));\n", - "dQ_dx[1] = (1.0/2.0)*(L_x*(c*du_dx*rho - dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/(L_x*c*rho);\n", - "dQ_dx[2] = 0;\n", - "dQ_dx[3] = 0;\n", - "dQ_dx[4] = (1.0/2.0)*(L_x*(-c*du_dx*rho + dP_dx) + c*eta_5*rho*u_t*(std::pow(M, 2) - 1))/L_x;\n", - "dQ_dx[5] = 0;\n" - ] - } - ], - "source": [ - "print(cxxcode(dQ_dx_inflow_x1_lower_zerou, assign_to='dQ_dx'))" + "common_exprs_lower, final_expr_lower = cse(dQ_dx_outflow_x1_lower, list=False)\n", + "for var, val in common_exprs_lower:\n", + " print(cxxcode(val, assign_to=var))\n", + "print(cxxcode(final_expr_lower, assign_to='dQ_dx'))" ] } ], diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp index c8c4f589b..55e2285f2 100644 --- a/src/NSCBC_outflow.hpp +++ b/src/NSCBC_outflow.hpp @@ -11,7 +11,7 @@ #include "AMReX_GpuQualifiers.H" #include "AMReX_REAL.H" -#include "ArrayView_3d.hpp" +#include "ArrayView.hpp" #include "EOS.hpp" #include "hydro_system.hpp" #include "physics_numVars.hpp" @@ -61,28 +61,38 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_outflow(quokka::valarray::nvar_> dQ_dx{}; - amrex::Real x1{}; // depends on SIDE - if (SIDE == BoundarySide::Upper) { - x1 = c - u; // wavespeed of reflected wave going back into the box - } else if (SIDE == BoundarySide::Lower) { - x1 = c + u; // wavespeed of reflected wave going back into the box - } const amrex::Real x0 = std::pow(c, 2); const amrex::Real x2 = c * rho; const amrex::Real x3 = du_dx * x2; const amrex::Real x4 = rho * x0; - const amrex::Real x5 = K * (P - P_t) + (beta - 1) * (dP_dy * v + dP_dz * w - du_dy * v * x2 - du_dz * w * x2 + dv_dy * x4 + dw_dz * x4); - const amrex::Real x6 = (1.0 / 2.0) / x1; - const amrex::Real x7 = dP_dx + x3; - quokka::valarray::nvar_> dQ_dx{}; - dQ_dx[0] = x6 * (x1 * (-dP_dx + 2 * drho_dx * x0 + x3) - x5) / x0; - dQ_dx[1] = x6 * (x1 * x7 + x5) / (c * rho); + if (SIDE == BoundarySide::Upper) { + const amrex::Real x1 = c - u; + const amrex::Real x5 = K * (P - P_t) + (beta - 1) * (dP_dy * v + dP_dz * w - du_dy * v * x2 - du_dz * w * x2 + dv_dy * x4 + dw_dz * x4); + const amrex::Real x6 = (1.0 / 2.0) / x1; + const amrex::Real x7 = dP_dx + x3; + + dQ_dx[0] = x6 * (x1 * (-dP_dx + 2 * drho_dx * x0 + x3) - x5) / x0; + dQ_dx[1] = x6 * (x1 * x7 + x5) / (c * rho); + dQ_dx[4] = x6 * (x1 * x7 - x5); + + } else if (SIDE == BoundarySide::Lower) { + const amrex::Real x1 = c + u; + const amrex::Real x5 = K * (P - P_t) + (beta - 1) * (dP_dy * v + dP_dz * w + du_dy * v * x2 + du_dz * w * x2 + dv_dy * x4 + dw_dz * x4); + const amrex::Real x6 = (1.0 / 2.0) / x1; + const amrex::Real x7 = -dP_dx + x3; + + dQ_dx[0] = x6 * (x1 * (-dP_dx + 2 * drho_dx * x0 - x3) + x5) / x0; + dQ_dx[1] = x6 * (x1 * x7 + x5) / (c * rho); + dQ_dx[4] = x6 * (-x1 * x7 + x5); + } + dQ_dx[2] = dv_dx; dQ_dx[3] = dw_dx; - dQ_dx[4] = x6 * (x1 * x7 - x5); dQ_dx[5] = dEint_aux_dx; + for (int i = 0; i < HydroSystem::nscalars_; ++i) { dQ_dx[6 + i] = dQ_dx_data[6 + i]; } @@ -162,7 +172,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_zdir_dQ_data(const amrex::In amrex::Box const &box = geom.Domain(); constexpr int N = HydroSystem::nvar_; const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); - const int kbr = boundary_idx[1]; + const int kbr = boundary_idx[2]; const int km1 = (SIDE == BoundarySide::Lower) ? kbr + 1 : kbr - 1; const int km2 = (SIDE == BoundarySide::Lower) ? kbr + 2 : kbr - 2; @@ -280,11 +290,17 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowBoundary(const amrex::IntVect quokka::valarray dQ_dt1_data{}; quokka::valarray dQ_dt2_data{}; if constexpr (DIR == FluxDir::X1) { - auto [dQ_dt1_data, dQ_dt2_data] = detail::transverse_xdir_dQ_data(iv, consVar, geom); + auto [dQ_dt1, dQ_dt2] = detail::transverse_xdir_dQ_data(iv, consVar, geom); + dQ_dt1_data = dQ_dt1; + dQ_dt2_data = dQ_dt2; } else if constexpr (DIR == FluxDir::X2) { - auto [dQ_dt1_data, dQ_dt2_data] = detail::transverse_ydir_dQ_data(iv, consVar, geom); + auto [dQ_dt1, dQ_dt2] = detail::transverse_ydir_dQ_data(iv, consVar, geom); + dQ_dt1_data = dQ_dt1; + dQ_dt2_data = dQ_dt2; } else if constexpr (DIR == FluxDir::X3) { - auto [dQ_dt1_data, dQ_dt2_data] = detail::transverse_zdir_dQ_data(iv, consVar, geom); + auto [dQ_dt1, dQ_dt2] = detail::transverse_zdir_dQ_data(iv, consVar, geom); + dQ_dt1_data = dQ_dt1; + dQ_dt2_data = dQ_dt2; } const Real Lbox = geom.prob_domain.length(static_cast(DIR)); From 31f131c28e402f238dc8e019f05da1d65e430407 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 28 Aug 2023 17:11:29 -0400 Subject: [PATCH 56/64] add option to outflow along y-axis --- src/NSCBC/vortex.cpp | 74 ++++++++++++--------- src/NSCBC/vortex.ipynb | 145 ----------------------------------------- 2 files changed, 45 insertions(+), 174 deletions(-) delete mode 100644 src/NSCBC/vortex.ipynb diff --git a/src/NSCBC/vortex.cpp b/src/NSCBC/vortex.cpp index 113860341..ce33f2485 100644 --- a/src/NSCBC/vortex.cpp +++ b/src/NSCBC/vortex.cpp @@ -63,14 +63,15 @@ template <> struct Physics_Traits { // global variables needed for Dirichlet boundary condition and initial conditions namespace { -Real G_vortex = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real T_ref = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real P_ref = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real u_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real v_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED Real w_inflow = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -AMREX_GPU_MANAGED GpuArray::nscalars_> s_inflow{}; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) -}; // namespace +const bool outflow_boundary_along_x_axis = true; +Real G_vortex = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real T_ref = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real P_ref = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real u0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real v0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED Real w0 = NAN; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +AMREX_GPU_MANAGED GpuArray::nscalars_> s0{}; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables) +}; // namespace template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka::grid grid_elem) { @@ -96,16 +97,16 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka:: (std::pow(R_v, 2) * std::pow(c, 2)); Real const rho = P / (R * T_ref); - Real const u = u_inflow + -G * y * std::exp(-1.0 / 2.0 * (std::pow(x, 2) + std::pow(y, 2)) / std::pow(R_v, 2)) / std::pow(R_v, 2); - Real const v = v_inflow + G * x * std::exp(-1.0 / 2.0 * (std::pow(x, 2) + std::pow(y, 2)) / std::pow(R_v, 2)) / std::pow(R_v, 2); - Real const w = w_inflow; + Real const u = u0 + -G * y * std::exp(-1.0 / 2.0 * (std::pow(x, 2) + std::pow(y, 2)) / std::pow(R_v, 2)) / std::pow(R_v, 2); + Real const v = v0 + G * x * std::exp(-1.0 / 2.0 * (std::pow(x, 2) + std::pow(y, 2)) / std::pow(R_v, 2)) / std::pow(R_v, 2); + Real const w = w0; Real const xmom = rho * u; Real const ymom = rho * v; Real const zmom = rho * w; Real const Eint = quokka::EOS::ComputeEintFromPres(rho, P); Real const Egas = RadSystem::ComputeEgasFromEint(rho, xmom, ymom, zmom, Eint); - Real const scalar = ::s_inflow[0]; + Real const scalar = ::s0[0]; state_cc(i, j, k, HydroSystem::density_index) = rho; state_cc(i, j, k, HydroSystem::x1Momentum_index) = xmom; @@ -127,13 +128,23 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void AMRSimulation::setCustomBoundar amrex::Box const &box = geom.Domain(); const auto &domain_lo = box.loVect3d(); const auto &domain_hi = box.hiVect3d(); - const int ilo = domain_lo[0]; - const int ihi = domain_hi[0]; - if (i < ilo) { - NSCBC::setInflowX1Lower(iv, consVar, geom, ::T_ref, ::u_inflow, ::v_inflow, ::w_inflow, ::s_inflow); - } else if (i > ihi) { - NSCBC::setOutflowBoundary(iv, consVar, geom, ::P_ref); + if constexpr (outflow_boundary_along_x_axis) { + const int ilo = domain_lo[0]; + const int ihi = domain_hi[0]; + if (i < ilo) { + NSCBC::setOutflowBoundary(iv, consVar, geom, ::P_ref); + } else if (i > ihi) { + NSCBC::setOutflowBoundary(iv, consVar, geom, ::P_ref); + } + } else { // outflow boundary is along the y-axis + const int jlo = domain_lo[1]; + const int jhi = domain_hi[1]; + if (j < jlo) { + NSCBC::setOutflowBoundary(iv, consVar, geom, ::P_ref); + } else if (j > jhi) { + NSCBC::setOutflowBoundary(iv, consVar, geom, ::P_ref); + } } } @@ -143,14 +154,19 @@ auto problem_main() -> int constexpr int ncomp_cc = Physics_Indices::nvarTotal_cc; amrex::Vector BCs_cc(ncomp_cc); for (int n = 0; n < ncomp_cc; ++n) { - BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // NSCBC inflow - BCs_cc[n].setHi(0, amrex::BCType::ext_dir); // NSCBC outflow - - if constexpr (AMREX_SPACEDIM >= 2) { - BCs_cc[n].setLo(1, amrex::BCType::int_dir); // periodic + if constexpr (outflow_boundary_along_x_axis) { + BCs_cc[n].setLo(0, amrex::BCType::ext_dir); // x- NSCBC outflow + BCs_cc[n].setHi(0, amrex::BCType::ext_dir); + BCs_cc[n].setLo(1, amrex::BCType::int_dir); // y- periodic BCs_cc[n].setHi(1, amrex::BCType::int_dir); - } else if (AMREX_SPACEDIM == 3) { - BCs_cc[n].setLo(2, amrex::BCType::int_dir); + } else { + BCs_cc[n].setLo(0, amrex::BCType::int_dir); // x- periodic + BCs_cc[n].setHi(0, amrex::BCType::int_dir); + BCs_cc[n].setLo(1, amrex::BCType::ext_dir); // y- NSCBC outflow + BCs_cc[n].setHi(1, amrex::BCType::ext_dir); + } + if (AMREX_SPACEDIM == 3) { + BCs_cc[n].setLo(2, amrex::BCType::int_dir); // z- periodic BCs_cc[n].setHi(2, amrex::BCType::int_dir); } } @@ -163,10 +179,10 @@ auto problem_main() -> int pp.query("Tgas0", ::T_ref); // initial temperature [K] pp.query("P0", ::P_ref); // initial pressure [erg cm^-3] // boundary condition parameters - pp.query("u_inflow", ::u_inflow); // inflow velocity along x-axis [cm/s] - pp.query("v_inflow", ::v_inflow); // transverse inflow velocity (v_y) [cm/s] - pp.query("w_inflow", ::w_inflow); // transverse inflow velocity (v_z) [cm/s] - pp.query("s_inflow", ::s_inflow[0]); // inflow passive scalar [dimensionless] + pp.query("u_inflow", ::u0); // inflow velocity along x-axis [cm/s] + pp.query("v_inflow", ::v0); // transverse inflow velocity (v_y) [cm/s] + pp.query("w_inflow", ::w0); // transverse inflow velocity (v_z) [cm/s] + pp.query("s_inflow", ::s0[0]); // inflow passive scalar [dimensionless] // Set initial conditions sim.setInitialConditions(); diff --git a/src/NSCBC/vortex.ipynb b/src/NSCBC/vortex.ipynb deleted file mode 100644 index 70a1a35fa..000000000 --- a/src/NSCBC/vortex.ipynb +++ /dev/null @@ -1,145 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from sympy import *\n", - "init_printing(use_unicode=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Convecting vortex" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [], - "source": [ - "x = Symbol('x')\n", - "y = Symbol('y')\n", - "u_0 = Symbol('u_0')\n", - "R_v = Symbol('R_v')\n", - "G = Symbol('G')\n", - "R = sqrt(x**2 + y**2)" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAFIAAAAfCAYAAAB06popAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAEdUlEQVRoBeWZ7VHcMBBAjwwFAOkg6YCPDqADSAnQAUx+wb8MdACpIIEOSAchdAAdAOmAvCcsR+ezfb7z2XMedmZvZVneXa12Vyvdyuvr62iocHZ2tovua+An8DN4Td8vaCdQJ2+1E4n9MdVw64qDatAXcMXnjqBS3oeOBPbFdisRpFf+TZ67aFbKG7Qh8cLHxFrntA+S54U36+StDDlHRksxwUval9D72NclLZWnIYeMp6en5+Cac4Aedz2XKnlL7ZGs/CaetQ26Iz+B5sAt+o+gI+gfiGMiPNLn2LmAb/f5cAd8on0hE6iePlXesu/a20ziCtRY59A90FwYgHaa/GN3W/obBnsygb9yN2wLdfJ6NyTKuLueBM3Kf/JakLFX2RDrxVvb9NV9mw3/T2aUd8P4a7425wq53LfHmt+uc0ob/jHnQW/BzSwPHrbhOe1b5DzEManc2FdFlz1H6h16osX2R/ABvMNrOtud4X2MDMF8bH5sVOD3HtpBxYY/TKLTurCoBvJMO25YhrgbT0wtxaETz0ttyAltu+/Q83cwohvMGjTs1k3E9hraKDbcG5Ip1uzVkFN0GfTrdxfaRIUljSFsPlzY1du7MyTGq7wK493cUGpIVs0VOwRDhQ+1FBBueedJw9U8gs5UHAcOHf+gkycfS5iom2WT8znhnfNIT0POI86N5vwwYUiEqcRX8Bt4kAkPEmjvg1b9hkd+VAsve/hBtnI1Sl1YWnfuMjaclVWLtnP6DjqfTq7exgyJEJVQSS8GUoF0BYWsr/RSx3R2pa+sCmgSlp6Pi7qps3PLgXnoEHrpQor73JAwDCsJ83Xade7uaeMLYyYMnWvZXaNJWHp784x+FtTWg24onlBuoAFoG00h1Gkfg7n3ZkNmJh/8ImNs2Jj36ozo8Gfwp42+Ad3SxdMYZScf56GRNJyeqUFzr6PfqzdD/YW2dW3jopuxlbAKM8NUxh6NmhyJnEy8HckZ8625y9zqvaGgJ8QEHzoW9YOs0rDMdBhBgzNAnZP6Gu5hEXhOvXpRKo30yLgiE8Ypk6KSYL7CjuFZL3Clf9C+EGnLT8MuFOAdw/Ketg6QgnrcpR20t0F19sjnYncCGlLhQjFBv/VO+UU5Pdr86sVramD5jiX4KaymvoZ/ZVjyzhB24TZo64ERTENuNof0R0+1+lDfsBBQ3xUXJX7fiK4ySkOMYJQaIf84E1C8vneFY50WPdkVj8pYu1lzzrU4ufBCA36VYck7c2K+ocRP6Y8RF7sizW/C6dDYraJHQz6DlS6PIobpCKrBLNLdkNJcqudZFoVxtJce0FV9rT6slQV391bRY2gHT4Rx8Ey5VkD03NSIcairOzTYZM4xCg31VtGjIWOImmNKITOynlcmzN3QUJ4AvqvkOTG4/46QIzMdy+Y1k0aWP5YI1mOeGsx9Yx7Hs4nb/KHBytzfXXQsD/GNqcJ+cSmhOM+2Sub3kcnkDWF3t1B3QR8UCtrviSHsfLRzoM9NRq/0PxXBjWcwOfNN5Xa//wCToZ0qXo7J3wAAAABJRU5ErkJggg==", - "text/latex": [ - "$\\displaystyle G e^{\\frac{- x^{2} - y^{2}}{2 R_{v}^{2}}}$" - ], - "text/plain": [ - " 2 2\n", - " - x - y \n", - " ─────────\n", - " 2 \n", - " 2⋅Rᵥ \n", - "G⋅ℯ " - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# streamfunction\n", - "psi = G * exp(-R**2 / (2*R_v**2))\n", - "psi" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "du = -G*y*std::exp(-1.0/2.0*(std::pow(x, 2) + std::pow(y, 2))/std::pow(R_v, 2))/std::pow(R_v, 2);\n" - ] - } - ], - "source": [ - "u = simplify(Derivative(psi, y))\n", - "print(cxxcode(u, assign_to='du'))" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dv = G*x*std::exp(-1.0/2.0*(std::pow(x, 2) + std::pow(y, 2))/std::pow(R_v, 2))/std::pow(R_v, 2);\n" - ] - } - ], - "source": [ - "v = simplify(-Derivative(psi, x))\n", - "print(cxxcode(v, assign_to='dv'))" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "dP = -0.5*std::pow(G, 2)*P_ref*gamma*std::exp((-std::pow(x, 2) - std::pow(y, 2))/std::pow(R_v, 2))/(std::pow(R_v, 2)*std::pow(c, 2));\n" - ] - } - ], - "source": [ - "P_ref = Symbol(\"P_ref\")\n", - "gamma = Symbol(\"gamma\")\n", - "c = Symbol(\"c\")\n", - "P = P_ref * -0.5 * gamma * (G/(c*R_v))**2 * exp(-R**2 / R_v**2)\n", - "print(cxxcode(P, assign_to='dP'))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.5" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 15c6db6c7d54c86a8b5b7afa43733ee304f46cd5 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Mon, 28 Aug 2023 17:15:34 -0400 Subject: [PATCH 57/64] removed unused vars --- src/NSCBC_outflow.hpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp index 55e2285f2..89ab74a7a 100644 --- a/src/NSCBC_outflow.hpp +++ b/src/NSCBC_outflow.hpp @@ -110,8 +110,6 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_xdir_dQ_data(const amrex::In constexpr int N = HydroSystem::nvar_; const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); const int ibr = boundary_idx[0]; - const int im1 = (SIDE == BoundarySide::Lower) ? ibr + 1 : ibr - 1; - const int im2 = (SIDE == BoundarySide::Lower) ? ibr + 2 : ibr - 2; quokka::valarray dQ_dy_data{}; quokka::valarray dQ_dz_data{}; @@ -142,8 +140,6 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_ydir_dQ_data(const amrex::In constexpr int N = HydroSystem::nvar_; const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); const int jbr = boundary_idx[1]; - const int jm1 = (SIDE == BoundarySide::Lower) ? jbr + 1 : jbr - 1; - const int jm2 = (SIDE == BoundarySide::Lower) ? jbr + 2 : jbr - 2; quokka::valarray dQ_dz_data{}; quokka::valarray dQ_dx_data{}; @@ -173,8 +169,6 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto transverse_zdir_dQ_data(const amrex::In constexpr int N = HydroSystem::nvar_; const auto &boundary_idx = (SIDE == BoundarySide::Lower) ? box.loVect3d() : box.hiVect3d(); const int kbr = boundary_idx[2]; - const int km1 = (SIDE == BoundarySide::Lower) ? kbr + 1 : kbr - 1; - const int km2 = (SIDE == BoundarySide::Lower) ? kbr + 2 : kbr - 2; quokka::valarray dQ_dx_data{}; quokka::valarray dQ_dy_data{}; From a1b6df2de230993f7ae68c4be998e038e9f8f303 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 29 Aug 2023 14:00:03 -0400 Subject: [PATCH 58/64] only build vortex test in 2D/3D --- src/NSCBC/CMakeLists.txt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt index 84ccdcb89..9e5fa8cd3 100644 --- a/src/NSCBC/CMakeLists.txt +++ b/src/NSCBC/CMakeLists.txt @@ -1,5 +1,4 @@ add_executable(test_channel_flow channel.cpp ${QuokkaObjSources} ../fextract.cpp) -add_executable(test_vortex vortex.cpp ${QuokkaObjSources}) if(AMReX_GPU_BACKEND MATCHES "CUDA") setup_target_for_cuda_compilation(test_channel_flow) @@ -7,3 +6,11 @@ if(AMReX_GPU_BACKEND MATCHES "CUDA") endif(AMReX_GPU_BACKEND MATCHES "CUDA") add_test(NAME ChannelFlow COMMAND test_channel_flow NSCBC_Channel.in WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) + +if (AMReX_SPACEDIM GREATER_EQUAL 2) + add_executable(test_vortex vortex.cpp ${QuokkaObjSources}) + + if(AMReX_GPU_BACKEND MATCHES "CUDA") + setup_target_for_cuda_compilation(test_channel_flow) + endif(AMReX_GPU_BACKEND MATCHES "CUDA") +endif(AMREX_SPACEDIM GREATER_EQUAL 2) From 33f43b0df8d4f176c4a222fbcdf52d3560cad698 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 29 Aug 2023 14:01:19 -0400 Subject: [PATCH 59/64] fix typo --- src/NSCBC/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt index 9e5fa8cd3..21cca41d9 100644 --- a/src/NSCBC/CMakeLists.txt +++ b/src/NSCBC/CMakeLists.txt @@ -13,4 +13,4 @@ if (AMReX_SPACEDIM GREATER_EQUAL 2) if(AMReX_GPU_BACKEND MATCHES "CUDA") setup_target_for_cuda_compilation(test_channel_flow) endif(AMReX_GPU_BACKEND MATCHES "CUDA") -endif(AMREX_SPACEDIM GREATER_EQUAL 2) +endif(AMReX_SPACEDIM GREATER_EQUAL 2) From cb383ada7feb19fdf0758dfcd46196afa24d9e9a Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 29 Aug 2023 14:22:22 -0400 Subject: [PATCH 60/64] fix loop indices --- src/NSCBC_inflow.hpp | 4 ++-- src/NSCBC_outflow.hpp | 4 ++-- src/hydro_system.hpp | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/NSCBC_inflow.hpp b/src/NSCBC_inflow.hpp index 098e72a7f..3e259b9d2 100644 --- a/src/NSCBC_inflow.hpp +++ b/src/NSCBC_inflow.hpp @@ -142,8 +142,8 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setInflowX1Lower(const amrex::IntVect & consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; - for (int i = 0; i < HydroSystem::nscalars_; ++i) { - consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; + for (int n = 0; n < HydroSystem::nscalars_; ++n) { + consVar(i, j, k, HydroSystem::scalar0_index + n) = consCell[6 + n]; } } } // namespace NSCBC diff --git a/src/NSCBC_outflow.hpp b/src/NSCBC_outflow.hpp index 89ab74a7a..67b419eae 100644 --- a/src/NSCBC_outflow.hpp +++ b/src/NSCBC_outflow.hpp @@ -332,8 +332,8 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE void setOutflowBoundary(const amrex::IntVect consVar(i, j, k, HydroSystem::x3Momentum_index) = consCell[3]; consVar(i, j, k, HydroSystem::energy_index) = consCell[4]; consVar(i, j, k, HydroSystem::internalEnergy_index) = consCell[5]; - for (int i = 0; i < HydroSystem::nscalars_; ++i) { - consVar(i, j, k, HydroSystem::scalar0_index + i) = consCell[6 + i]; + for (int n = 0; n < HydroSystem::nscalars_; ++n) { + consVar(i, j, k, HydroSystem::scalar0_index + n) = consCell[6 + n]; } } } // namespace NSCBC diff --git a/src/hydro_system.hpp b/src/hydro_system.hpp index e4ab68300..bb2679a76 100644 --- a/src/hydro_system.hpp +++ b/src/hydro_system.hpp @@ -312,8 +312,8 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto HydroSystem::ComputePrimVars quokka::valarray primVars{rho, vx, vy, vz, P, Eint_aux}; - for (int i = 0; i < nscalars_; ++i) { - primVars[primScalar0_index + i] = cons(i, j, k, scalar0_index + i); + for (int n = 0; n < nscalars_; ++n) { + primVars[primScalar0_index + n] = cons(i, j, k, scalar0_index + n); } return primVars; } From a42dc89b58e6115d6bd1d297f85a88e70432a01f Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 29 Aug 2023 14:35:42 -0400 Subject: [PATCH 61/64] fix const --- src/NSCBC/vortex.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/NSCBC/vortex.cpp b/src/NSCBC/vortex.cpp index ce33f2485..ec364bfb2 100644 --- a/src/NSCBC/vortex.cpp +++ b/src/NSCBC/vortex.cpp @@ -78,9 +78,9 @@ template <> void RadhydroSimulation::setInitialConditionsOnGrid(quokka:: // set initial conditions const amrex::Box &indexRange = grid_elem.indexRange_; const amrex::Array4 &state_cc = grid_elem.array_; - amrex::GpuArray dx = grid_elem.dx_; - amrex::GpuArray prob_lo = grid_elem.prob_lo_; - amrex::GpuArray prob_hi = grid_elem.prob_hi_; + const amrex::GpuArray dx = grid_elem.dx_; + const amrex::GpuArray prob_lo = grid_elem.prob_lo_; + const amrex::GpuArray prob_hi = grid_elem.prob_hi_; constexpr Real gamma = quokka::EOS_Traits::gamma; constexpr Real R = quokka::EOS_Traits::boltzmann_constant / quokka::EOS_Traits::mean_molecular_weight; From dbb6798e5c471b98ddcdbd7918a88968d1c3d6b1 Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Tue, 29 Aug 2023 14:38:08 -0400 Subject: [PATCH 62/64] stricter tolerance --- src/NSCBC/channel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NSCBC/channel.cpp b/src/NSCBC/channel.cpp index aeed5d5a7..e3f6b75ff 100644 --- a/src/NSCBC/channel.cpp +++ b/src/NSCBC/channel.cpp @@ -291,7 +291,7 @@ auto problem_main() -> int // Compute test success condition int status = 0; - const double error_tol = 0.0007; + const double error_tol = 3.0e-5; if (epsilon > error_tol) { status = 1; } From 612b355e6647764210fb82b85c808a3422accbfc Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 31 Aug 2023 14:14:58 -0400 Subject: [PATCH 63/64] fix typo --- src/NSCBC_inflow.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/NSCBC_inflow.hpp b/src/NSCBC_inflow.hpp index 3e259b9d2..e8055b9e8 100644 --- a/src/NSCBC_inflow.hpp +++ b/src/NSCBC_inflow.hpp @@ -29,7 +29,7 @@ AMREX_GPU_DEVICE AMREX_FORCE_INLINE auto dQ_dx_inflow_x1_lower(quokka::valarray< -> quokka::valarray::nvar_> { // return dQ/dx corresponding to subsonic inflow on the x1 lower boundary - // (This is only necessary for continuous inflows, i.e., where as shock or contact discontinuity is not desired.) + // (This is only necessary for continuous inflows, i.e., where a shock or contact discontinuity is not desired.) // NOTE: This boundary condition is only defined for an ideal gas (with constant k_B/mu). const Real rho = Q[0]; From e6a1058dad37f6647f065d11ce3893d00a64f55c Mon Sep 17 00:00:00 2001 From: Ben Wibking Date: Thu, 31 Aug 2023 14:17:05 -0400 Subject: [PATCH 64/64] fix CMakeLists --- src/NSCBC/CMakeLists.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/NSCBC/CMakeLists.txt b/src/NSCBC/CMakeLists.txt index 21cca41d9..d77f52f21 100644 --- a/src/NSCBC/CMakeLists.txt +++ b/src/NSCBC/CMakeLists.txt @@ -2,7 +2,6 @@ add_executable(test_channel_flow channel.cpp ${QuokkaObjSources} ../fextract.cpp if(AMReX_GPU_BACKEND MATCHES "CUDA") setup_target_for_cuda_compilation(test_channel_flow) - setup_target_for_cuda_compilation(test_vortex) endif(AMReX_GPU_BACKEND MATCHES "CUDA") add_test(NAME ChannelFlow COMMAND test_channel_flow NSCBC_Channel.in WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/tests) @@ -11,6 +10,6 @@ if (AMReX_SPACEDIM GREATER_EQUAL 2) add_executable(test_vortex vortex.cpp ${QuokkaObjSources}) if(AMReX_GPU_BACKEND MATCHES "CUDA") - setup_target_for_cuda_compilation(test_channel_flow) + setup_target_for_cuda_compilation(test_vortex) endif(AMReX_GPU_BACKEND MATCHES "CUDA") endif(AMReX_SPACEDIM GREATER_EQUAL 2)