def map_sum(self, expr, other, urecs): if (not isinstance(other, type(expr)) or len(expr.children) != len(other.children)): return [] result = [] from pytools import generate_permutations had_structural_match = False for perm in generate_permutations(range(len(expr.children))): it_assignments = urecs for my_child, other_child in zip( expr.children, (other.children[i] for i in perm)): it_assignments = self.rec(my_child, other_child, it_assignments) if not it_assignments: break if it_assignments: had_structural_match = True result.extend(it_assignments) if not had_structural_match: return self.treat_mismatch(expr, other, urecs) return result
def map_sum(self, expr, other, urecs): if (not isinstance(other, type(expr)) or len(expr.children) != len(other.children)): return [] result = [] from pytools import generate_permutations had_structural_match = False for perm in generate_permutations(range(len(expr.children))): it_assignments = urecs for my_child, other_child in zip(expr.children, (other.children[i] for i in perm)): it_assignments = self.rec(my_child, other_child, it_assignments) if not it_assignments: break if it_assignments: had_structural_match = True result.extend(it_assignments) if not had_structural_match: return self.treat_mismatch(expr, other, urecs) return result
def size(k, string): minimum = 'inf' size = 0 for permutation in generate_permutations(range(k)): result = [] for i in range(len(string) / k): result.append(permute(permutation, string[k * i:k * (i + 1)])) minimum = min(minimum, compressed_size(''.join(result))) return minimum
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
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