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),
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"))