[![binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gl/rubendibattista%2Fjosiepy/master/?filepath=examples%2F003_Euler_Jet.ipynb) # Simulation of a Jet with Euler Equations ```python import numpy as np ``` ```python from josie.bc import Dirichlet, Neumann, NeumannDirichlet from josie.boundary import Line from josie.euler.eos import PerfectGas from josie.euler.solver import EulerSolver from josie.euler.state import EulerState from josie.mesh import Mesh from josie.mesh.cell import SimpleCell left = Line([0, 0], [0, 1]) bottom = Line([0, 0], [0.25, 0]) right = Line([0.25, 0], [.25, 1]) top = Line([0, 1], [0.25, 1]) # EOS eos = PerfectGas(gamma=1.4) # Params JET_CENTER = 0.5 JET_RADIUS = 0.05 # Inlet U_JET = 1 V_JET = 0 RHO_JET = 1000 P_JET = 1e3 RHOe_JET = eos.rhoe(RHO_JET, P_JET) e_JET = RHOe_JET / RHO_JET E_JET = e_JET + 0.5 * (U_JET**2 + V_JET**2) C_JET = eos.sound_velocity(RHO_JET, P_JET) print(f"Mach: {U_JET/C_JET}") Q_JET = EulerState(RHO_JET, RHO_JET*U_JET, RHO_JET*V_JET, RHO_JET*E_JET, RHOe_JET, U_JET, V_JET, P_JET, C_JET, e_JET) # Field conditions at init U_INIT = 0 V_INIT = 0 RHO_INIT = RHO_JET/1000 P_INIT = P_JET RHOe_INIT = eos.rhoe(RHO_INIT, P_INIT) e_INIT = RHOe_INIT / RHO_INIT E_INIT = e_INIT + 0.5 * (U_INIT**2 + V_INIT**2) C_INIT = eos.sound_velocity(RHO_INIT, P_INIT) print(f"Mach: {U_INIT/C_INIT}") Q_INIT = EulerState(RHO_INIT, RHO_INIT*U_INIT, RHO_INIT*V_INIT, RHO_INIT*E_INIT, RHOe_INIT, U_INIT, V_INIT, P_INIT, C_INIT, e_INIT) # Neumann dQ = np.zeros(len(EulerState.fields)).view(EulerState) def partition_fun(centroids: np.ndarray): yc = centroids[..., 1].flatten() # Partition cells of the inlet idx = np.where((yc - JET_CENTER)**2 < JET_RADIUS**2) return idx # Assign BC to boundaries left.bc = NeumannDirichlet(dirichlet_value=Q_JET, neumann_value=dQ, partition_fun=partition_fun) # left.bc = Dirichlet(Q_JET) top.bc = Dirichlet(Q_INIT) right.bc = Neumann(dQ) bottom.bc = Dirichlet(Q_INIT) mesh = Mesh(left, bottom, right, top, SimpleCell) mesh.interpolate(25, 100) mesh.generate() mesh.write('mesh.xdmf') # mesh.plot() ``` Mach: 0.8451542547285166 Mach: 0.0 ```python # Scheme from josie.euler.schemes import Rusanov from josie.general.schemes.time import ExplicitEuler class MyScheme(Rusanov, ExplicitEuler): pass scheme = MyScheme(eos) solver = EulerSolver(mesh, scheme) def init_fun(solver): solver.values[:] = Q_INIT solver.init(init_fun) ``` ```python from josie.io.write.strategy import TimeStrategy from josie.io.write.writer import XDMFWriter writer = XDMFWriter("euler.xdmf", TimeStrategy(dt_save=0.01, animate=True), solver, final_time=1, CFL=0.2) writer.solve() ``` ```python solver.show("rho") ``` /builds/rubendibattista/josiepy/josie/plot/matplotlib.py:224: MatplotlibDeprecationWarning: Starting from Matplotlib 3.6, colorbar() will steal space from the mappable's axes, rather than from the current axes, to place the colorbar. To silence this warning, explicitly pass the 'ax' argument to colorbar(). fig.colorbar(patch_coll) ![png](data:image/png;base64,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 )