Source code for opentidalfarm.problems.sw
from .problem import Problem
from .steady_sw import SteadySWProblemParameters
from .steady_sw import SteadySWProblem
from dolfin_adjoint import Constant
from dolfin import DOLFIN_EPS
[docs]
class SWProblemParameters(SteadySWProblemParameters):
""" A set of parameters for a :class:`SWProblem`.
The parameters are as described in
:class:`opentidalfarm.problems.steady_sw.SteadySWProblemParameters`.
In addition following parameters are available:
Time parameters:
:ivar theta: The theta value for the timestepping-scheme. Default 1.0.
:ivar dt: The timestep. Default: 1.0.
:ivar start_time: The start time. Default: 0.0.
:ivar finish_time: The finish time. Default: 100.0.
Functional time integration paramters (FIXME: Move to reduced functional):
:ivar functional_final_time_only: Boolean indicating if the functional
should be integrated over time or evaluated at the end of time only.
Default: False.
"""
# Time parameters
theta = 1.0
dt = 1.
start_time = 0.0
finish_time = 100.0
# Functional time integration parameters
functional_final_time_only = False
@property
def n_time_steps(self):
n = int(float(self.finish_time - self.start_time) / float(self.dt))
if (not self.finished(self.start_time+n*self.dt)):
n += 1
return n
# Needed here in order to avoid machine precision error when calcualting
# number of timesteps for dynamic friction..
def finished(self, current_time):
return float(current_time - self.finish_time) >= - 1e3*DOLFIN_EPS
[docs]
class SWProblem(SteadySWProblem):
r""" Create a transient shallow water problem:
.. math:: \frac{\partial u}{\partial t} -\nabla\cdot\nu\nabla u+u\cdot\nabla u+g\nabla
\eta + \frac{c_b + c_t}{H} \| u\| u &= f_u, \\
\frac{\partial \eta}{\partial t} + \nabla \cdot \left( H u \right) &= 0,
where
- :math:`u` is the velocity,
- :math:`\eta` is the free-surface displacement,
- :math:`H=\eta + h` is the total water depth where :math:`h` is the
water depth at rest,
- :math:`f_u` is the velocity forcing term,
- :math:`c_b` is the (quadratic) natural bottom friction coefficient,
- :math:`c_t` is the (quadratic) friction coefficient due to the turbine
farm,
- :math:`\nu` is the viscosity coefficient,
- :math:`g` is the gravitational constant,
:parameter parameters: A :class:`SWProblemParameters`
object containing the parameters of the problem.
"""
def __init__(self, parameters):
if not type(parameters) == SWProblemParameters:
raise TypeError("parameters must be of type SWProblemParameters.")
if float(parameters.start_time) >= float(parameters.finish_time):
raise ValueError("start_time must be < finish_time.")
super(SWProblem, self).__init_without_type_check__(parameters)
@property
def _is_transient(self):
return True
[docs]
@staticmethod
def default_parameters():
''' Returns a dictionary with the default parameters '''
return SWProblemParameters()