"""Q3D source term (flux modifier)"""
import os
if os.environ.get('__USE_CUDA', '0') == '1':
import cupy as np
else:
import numpy as np
from g3d.defs import G3DRunOptions
from g3d.flow.solver.rhs.fluxmodifiers import FluxModifier
[docs]
class Q3DSource(FluxModifier):
"""
"""
def __init__(self) -> None:
super().__init__()
[docs]
def evaluate(self) -> None:
"""
"""
g3d_opt = G3DRunOptions()
ro = self._domain.get_cons_array('ro')
sigma = self._domain.get_cons_array('sigma')
u, v, w = self._domain.get_auxv_velocity_arrays()
stn = self._mesh.get_streamtube_normal()
dro, dru, drv, drw, det = self._dcons.get_arrays()
d_sigma = self._dcons.get_array('sigma')
idx1, idx2 = self._get_range()
d_sigma[idx1:idx2] = (-g3d_opt.q3d_source_factor * 2.0 * self._vol[idx1:idx2] * ro[idx1:idx2] *
(u[idx1:idx2] * stn[idx1:idx2, 0] +
v[idx1:idx2] * stn[idx1:idx2, 1] +
w[idx1:idx2] * stn[idx1:idx2, 2]) / np.power(self._dt, 2))
dru[idx1:idx2] += self._vol[idx1:idx2] * sigma[idx1:idx2] * stn[idx1:idx2, 0]
drv[idx1:idx2] += self._vol[idx1:idx2] * sigma[idx1:idx2] * stn[idx1:idx2, 1]
drw[idx1:idx2] += self._vol[idx1:idx2] * sigma[idx1:idx2] * stn[idx1:idx2, 2]
det[idx1:idx2] += (self._vol[idx1:idx2] * sigma[idx1:idx2] *
(u[idx1:idx2] * stn[idx1:idx2, 0] +
v[idx1:idx2] * stn[idx1:idx2, 1] +
w[idx1:idx2] * stn[idx1:idx2, 2]))