from __future__ import division
from hedge.discretization.local import TriangleDiscretization

tri = TriangleDiscretization(5)

import Gnuplot
gp = Gnuplot.Gnuplot()

import numpy

xpts = numpy.arange(-1.5, 1.5, 0.1)
ypts = numpy.arange(-1.5, 1.5, 0.1)

gp("set zrange [-3:3]")

for bfi, bf in zip(tri.generate_mode_identifiers(), tri.basis_functions()):
    lines = []
    for x in xpts:
        values = []
        for y in ypts:
            values.append((x, y, bf(numpy.array((x, y)))))
        lines.append(Gnuplot.Data(values, with_="lines"))

    for y in xpts:
        values = []
        for x in ypts:
            values.append((x, y, bf(numpy.array((x, y)))))
        lines.append(Gnuplot.Data(values, with_="lines"))

    tri = numpy.array([
        (-1, -1, 0),
Пример #2
0
def test_mapping_differences_tri():
    """Check that triangle interpolation is independent of mapping to reference
    """
    from hedge.discretization.local import TriangleDiscretization
    from random import random
    from pytools import generate_permutations

    def shift(list):
        return list[1:] + [list[0]]

    class LinearCombinationOfFunctions:
        def __init__(self, coefficients, functions, premap):
            self.coefficients = coefficients
            self.functions = functions
            self.premap = premap

        def __call__(self, x):
            return sum(coeff * f(self.premap(x)) for coeff, f in zip(self.coefficients, self.functions))

    def random_barycentric_coordinates(dim):
        remain = 1
        coords = []
        for i in range(dim):
            coords.append(random() * remain)
            remain -= coords[-1]
        coords.append(remain)
        return coords

    tri = TriangleDiscretization(5)

    for trial_number in range(10):
        vertices = [numpy.random.randn(2) for vi in range(3)]
        map = tri.geometry.get_map_unit_to_global(vertices)
        nodes = [map(node) for node in tri.unit_nodes()]
        node_values = numpy.array([random() for node in nodes])

        functions = []
        for pvertices in generate_permutations(vertices):
            pmap = tri.geometry.get_map_unit_to_global(pvertices)
            pnodes = [pmap(node) for node in tri.unit_nodes()]

            # map from pnode# to node#
            nodematch = {}
            for pi, pn in enumerate(pnodes):
                for i, n in enumerate(nodes):
                    if la.norm(n - pn) < 1e-13:
                        nodematch[pi] = i
                        break

            pnode_values = numpy.array([node_values[nodematch[pi]] for pi in range(len(nodes))])

            interp_f = LinearCombinationOfFunctions(
                la.solve(tri.vandermonde(), pnode_values), tri.basis_functions(), pmap.inverted()
            )

            # verify interpolation property
            # for n, nv in zip(pnodes, pnode_values):
            # assert abs(interp_f(n) - nv) < 1e-13

            functions.append(interp_f)

        for subtrial_number in range(15):
            pt_in_element = sum(coeff * vertex for coeff, vertex in zip(random_barycentric_coordinates(2), vertices))
            f_values = [f(pt_in_element) for f in functions]
            avg = sum(f_values) / len(f_values)
            err = [abs(fv - avg) for fv in f_values]
            assert max(err) < 5e-13
def test_mapping_differences_tri():
    """Check that triangle interpolation is independent of mapping to reference
    """
    from hedge.discretization.local import TriangleDiscretization
    from random import random
    from pytools import generate_permutations

    def shift(list):
        return list[1:] + [list[0]]

    class LinearCombinationOfFunctions:
        def __init__(self, coefficients, functions, premap):
            self.coefficients = coefficients
            self.functions = functions
            self.premap = premap

        def __call__(self, x):
            return sum(coeff * f(self.premap(x))
                       for coeff, f in zip(self.coefficients, self.functions))

    def random_barycentric_coordinates(dim):
        remain = 1
        coords = []
        for i in range(dim):
            coords.append(random() * remain)
            remain -= coords[-1]
        coords.append(remain)
        return coords

    tri = TriangleDiscretization(5)

    for trial_number in range(10):
        vertices = [numpy.random.randn(2) for vi in range(3)]
        map = tri.geometry.get_map_unit_to_global(vertices)
        nodes = [map(node) for node in tri.unit_nodes()]
        node_values = numpy.array([random() for node in nodes])

        functions = []
        for pvertices in generate_permutations(vertices):
            pmap = tri.geometry.get_map_unit_to_global(pvertices)
            pnodes = [pmap(node) for node in tri.unit_nodes()]

            # map from pnode# to node#
            nodematch = {}
            for pi, pn in enumerate(pnodes):
                for i, n in enumerate(nodes):
                    if la.norm(n - pn) < 1e-13:
                        nodematch[pi] = i
                        break

            pnode_values = numpy.array(
                [node_values[nodematch[pi]] for pi in range(len(nodes))])

            interp_f = LinearCombinationOfFunctions(
                la.solve(tri.vandermonde(), pnode_values),
                tri.basis_functions(), pmap.inverted())

            # verify interpolation property
            #for n, nv in zip(pnodes, pnode_values):
            #assert abs(interp_f(n) - nv) < 1e-13

            functions.append(interp_f)

        for subtrial_number in range(15):
            pt_in_element = sum(coeff * vertex for coeff, vertex in zip(
                random_barycentric_coordinates(2), vertices))
            f_values = [f(pt_in_element) for f in functions]
            avg = sum(f_values) / len(f_values)
            err = [abs(fv - avg) for fv in f_values]
            assert max(err) < 1e-12
from hedge.discretization.local import TriangleDiscretization

tri = TriangleDiscretization(5)

import Gnuplot

gp = Gnuplot.Gnuplot()

import numpy

xpts = numpy.arange(-1.5, 1.5, 0.1)
ypts = numpy.arange(-1.5, 1.5, 0.1)

gp("set zrange [-3:3]")

for bfi, bf in zip(tri.generate_mode_identifiers(), tri.basis_functions()):
    lines = []
    for x in xpts:
        values = []
        for y in ypts:
            values.append((x, y, bf(numpy.array((x, y)))))
        lines.append(Gnuplot.Data(values, with_="lines"))

    for y in xpts:
        values = []
        for x in ypts:
            values.append((x, y, bf(numpy.array((x, y)))))
        lines.append(Gnuplot.Data(values, with_="lines"))

    tri = numpy.array([(-1, -1, 0), (-1, 1, 0), (1, -1, 0), (-1, -1, 0)])
    lines.append(Gnuplot.Data(tri, with_="lines"))