from PYB11Generator import *
from LimiterBaseAbstractMethods import *

#-------------------------------------------------------------------------------
# Base class for riemann solver wave speeds
#-------------------------------------------------------------------------------
@PYB11template("Dimension")
@PYB11module("SpheralGSPH")
class LimiterBase:

    PYB11typedefs = """
  typedef typename %(Dimension)s::Scalar Scalar;
  """

    def pyinit(TVD = "bool",
               symmetric = "bool"):
        "slope limiter constructor"

    @PYB11virtual
    @PYB11const
    def slopeLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

    @PYB11virtual
    @PYB11const
    def isTVD(self):
        "is this a TVD limiter?."
        return "bool"

    @PYB11virtual
    @PYB11const
    def isSymmetric(self):
        "is this a Symmetric limiter?."
        return "bool"

PYB11inject(LimiterBaseAbstractMethods, LimiterBase, pure_virtual=True)

#-------------------------------------------------------------------------------
# minmod limiter
#-------------------------------------------------------------------------------
@PYB11template("Dimension")
@PYB11module("SpheralGSPH")
class MinModLimiter(LimiterBase):

    PYB11typedefs = """
  typedef typename %(Dimension)s::Scalar Scalar;
  """

    def pyinit():
        "minmod slope limiter constructor"

    @PYB11virtual
    @PYB11const
    def slopeLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

    @PYB11virtual
    @PYB11const
    def fluxLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

#-------------------------------------------------------------------------------
# VanLeer limiter
#-------------------------------------------------------------------------------
@PYB11template("Dimension")
@PYB11module("SpheralGSPH")
class VanLeerLimiter(LimiterBase):

    PYB11typedefs = """
  typedef typename %(Dimension)s::Scalar Scalar;
  """

    def pyinit():
        "VanLeer slope limiter constructor"

    @PYB11virtual
    @PYB11const
    def slopeLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

    @PYB11virtual
    @PYB11const
    def fluxLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

#-------------------------------------------------------------------------------
# VanAlba limiter
#-------------------------------------------------------------------------------
@PYB11template("Dimension")
@PYB11module("SpheralGSPH")
class VanAlbaLimiter(LimiterBase):

    PYB11typedefs = """
  typedef typename %(Dimension)s::Scalar Scalar;
  """

    def pyinit():
        "VanAlba slope limiter constructor"

    @PYB11virtual
    @PYB11const
    def slopeLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

    @PYB11virtual
    @PYB11const
    def fluxLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

#-------------------------------------------------------------------------------
# Superbee limiter
#-------------------------------------------------------------------------------
@PYB11template("Dimension")
@PYB11module("SpheralGSPH")
class SuperbeeLimiter(LimiterBase):

    PYB11typedefs = """
  typedef typename %(Dimension)s::Scalar Scalar;
  """

    def pyinit():
        "Superbee slope limiter constructor"

    @PYB11virtual
    @PYB11const
    def slopeLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

    @PYB11virtual
    @PYB11const
    def fluxLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

#-------------------------------------------------------------------------------
# Ospre limiter
#-------------------------------------------------------------------------------
@PYB11template("Dimension")
@PYB11module("SpheralGSPH")
class OspreLimiter(LimiterBase):

    PYB11typedefs = """
  typedef typename %(Dimension)s::Scalar Scalar;
  """

    def pyinit():
        "Ospre slope limiter constructor"

    @PYB11virtual
    @PYB11const
    def slopeLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"

    @PYB11virtual
    @PYB11const
    def fluxLimiter(self,
                     x = "const Scalar"):
        "slope limiter from flux limiter."
        return "Scalar"


