Source code for mirgecom.symbolic_fluid

""":mod:`mirgecom.symbolic_fluid` provides symbolic versions of fluid constructs.

Symbolic fluxes
^^^^^^^^^^^^^^^
.. autofunction:: sym_inviscid_flux
.. autofunction:: sym_viscous_flux
.. autofunction:: sym_diffusive_flux
.. autofunction:: sym_heat_flux
.. autofunction:: sym_viscous_stress_tensor

Symbolic fluid operators
^^^^^^^^^^^^^^^^^^^^^^^^

.. autofunction:: sym_euler
.. autofunction:: sym_ns
"""
import numpy as np
import numpy.random

from meshmode.mesh import BTAG_ALL, BTAG_NONE  # noqa
from mirgecom.fluid import make_conserved

from mirgecom.symbolic import (
    grad as sym_grad,
    div as sym_div)

# from mirgecom.eos import IdealSingleGas
# from mirgecom.transport import SimpleTransport


[docs] def sym_inviscid_flux(sym_cv, sym_pressure): """Return symbolic expression for inviscid flux.""" return make_conserved( dim=sym_cv.dim, mass=sym_cv.momentum, momentum=(sym_cv.mass*(np.outer(sym_cv.velocity, sym_cv.velocity)) + sym_pressure*np.eye(sym_cv.dim)), energy=(sym_cv.energy + sym_pressure)*sym_cv.velocity, species_mass=sym_cv.species_mass.reshape(-1, 1)*sym_cv.velocity)
[docs] def sym_euler(sym_cv, sym_pressure): """Return symbolic expression for the NS operator applied to a fluid state.""" return -sym_div(sym_cv.dim, sym_inviscid_flux(sym_cv, sym_pressure))
[docs] def sym_viscous_stress_tensor(sym_cv, mu=1): """Symbolic version of the viscous stress tensor.""" dvel = sym_grad(sym_cv.dim, sym_cv.velocity) return mu*((dvel + dvel.T) - (2./3.)*(dvel.trace() * np.eye(sym_cv.dim)))
[docs] def sym_diffusive_flux(sym_cv, species_diffusivities=None): """Symbolic diffusive flux calculator.""" if species_diffusivities is None: return 0*sym_cv.velocity*sym_cv.species_mass.reshape(-1, 1) return -(sym_cv.mass * species_diffusivities.reshape(-1, 1) * sym_grad(sym_cv.dim, sym_cv.species_mass_fractions))
# Diffusive heat flux is neglected atm. Full multispecies # support in the symbolic infrastructure is a WIP. # TODO: Add diffusive heat flux
[docs] def sym_heat_flux(dim, sym_temperature, kappa=0): """Symbolic heat flux calculator.""" return -kappa * sym_grad(dim, sym_temperature)
[docs] def sym_viscous_flux(sym_cv, sym_temperature, mu=1, kappa=0, species_diffusivities=None): """Return symbolic version of viscous flux.""" dim = sym_cv.dim rho = sym_cv.mass mom = sym_cv.momentum vel = mom/rho # viscous stress tensor = momentum flux tau = sym_viscous_stress_tensor(sym_cv, mu=mu) # energy flux : viscous + heat_flux e_flux = np.dot(tau, vel) - sym_heat_flux(dim, sym_temperature, kappa=kappa) # species fluxes sp_flux = sym_diffusive_flux(sym_cv, species_diffusivities=species_diffusivities) return make_conserved(dim=dim, mass=0*mom, energy=e_flux, momentum=tau, species_mass=-sp_flux)
[docs] def sym_ns(sym_cv, sym_pressure, sym_temperature, mu=1, kappa=0, species_diffusivities=None): """Symbolic Navier-Stokes operator.""" viscous_flux = sym_viscous_flux(sym_cv, sym_temperature, mu=mu, kappa=kappa, species_diffusivities=species_diffusivities) inviscid_flux = sym_inviscid_flux(sym_cv, sym_pressure) return sym_div(sym_cv.dim, viscous_flux - inviscid_flux)