Source code for opentidalfarm.solvers.les
# Adapted from the Firedrake-Fluids project.
from dolfin import *
from dolfin_adjoint import *
[docs]
class LES(object):
r""" A solver for computing the eddy viscosity by solving:
.. math:: e = (s w)^2I
where :math:`e` is the eddy viscosity, :math:`s` is the smagorinsky
coefficient, :math:`w = \sqrt{\text{cell volume}}` is the filter width, and :math:`I` is the second
invariant defined as:
.. math:: I = \sum_{1 \le i, j \le 2} 2S_{i, j}^2, \quad S = \frac{1}{2} \left(\nabla u + \nabla u^T\right)
Parameters:
:param V: The function space for the the eddy viscosity.
:param u: The velocity function.
:param smagorinsky_coefficient: The smagorinsky coefficient.
:ivar eddy_viscosity: The smagorinsky coefficient.
"""
def __init__(self, V, u, smagorinsky_coefficient):
self._V = V
self.eddy_viscosity = Function(V)
# Create a eddy viscosity solver
les_lhs, les_rhs = self._eddy_viscosity_eqn(u, smagorinsky_coefficient)
eddy_viscosity_problem = LinearVariationalProblem(les_lhs, les_rhs,
self.eddy_viscosity, bcs=[])
self._solver = LinearVariationalSolver(eddy_viscosity_problem)
self._solver.parameters["linear_solver"] = "lu"
self._solver.parameters["symmetric"] = True
self._solver.parameters["lu_solver"]["reuse_factorization"] = True
def _strain_rate_tensor(self, u):
S = 0.5*(grad(u) + grad(u).T)
return S
def _eddy_viscosity_eqn(self, u, smagorinsky_coefficient):
dim = len(u)
w = TestFunction(self._V)
eddy_viscosity = TrialFunction(self._V)
cell_vol = CellVolume(self._V.mesh())
filter_width = cell_vol**(1.0/dim)
S = self._strain_rate_tensor(u)
second_invariant = 0.0
for i in range(0, dim):
for j in range(0, dim):
second_invariant += 2.0*(S[i,j]**2)
second_invariant = sqrt(second_invariant)
rhs = (smagorinsky_coefficient*filter_width)**2*second_invariant
lhs = inner(w, eddy_viscosity)*dx
rhs = inner(w, rhs)*dx
return lhs, rhs
[docs]
def solve(self):
""" Update the eddy viscosity solution for the current velocity.
:returns: The eddy viscosity.
"""
self._solver.solve()
return self.eddy_viscosity