def create_data(): E = reference_element.DefaultTriangle() k = 3 pts = reference_element.make_lattice(E.get_vertices(), k) Phis = expansions.get_expansion_set(E) phis = Phis.tabulate(k, pts) dphis = Phis.tabulate_derivatives(k, pts) return phis, dphis
def __init__(self, ref_el, degree, shape=tuple()): if shape == tuple(): num_components = 1 else: flat_shape = numpy.ravel(shape) num_components = numpy.prod(flat_shape) num_exp_functions = expansions.polynomial_dimension(ref_el, degree) num_members = num_components * num_exp_functions embedded_degree = degree expansion_set = expansions.get_expansion_set(ref_el) sd = ref_el.get_spatial_dimension() # set up coefficients coeffs_shape = tuple([num_members] + list(shape) + [num_exp_functions]) coeffs = numpy.zeros(coeffs_shape, "d") # use functional's index_iterator function cur_bf = 0 if shape == tuple(): coeffs = numpy.eye(num_members) else: for idx in index_iterator(shape): n = expansions.polynomial_dimension(ref_el, embedded_degree) for exp_bf in range(n): cur_idx = tuple([cur_bf] + list(idx) + [exp_bf]) coeffs[cur_idx] = 1.0 cur_bf += 1 # construct dmats if degree == 0: dmats = [numpy.array([[0.0]], "d") for i in range(sd)] else: pts = ref_el.make_points(sd, 0, degree + sd + 1) v = numpy.transpose(expansion_set.tabulate(degree, pts)) vinv = numpy.linalg.inv(v) dv = expansion_set.tabulate_derivatives(degree, pts) dtildes = [[[a[1][i] for a in dvrow] for dvrow in dv] for i in range(sd)] dmats = [ numpy.dot(vinv, numpy.transpose(dtilde)) for dtilde in dtildes ] PolynomialSet.__init__(self, ref_el, degree, embedded_degree, expansion_set, coeffs, dmats)
def __init__(self, ref_el, degree, shape=tuple()): if shape == tuple(): num_components = 1 else: flat_shape = numpy.ravel(shape) num_components = numpy.prod(flat_shape) num_exp_functions = expansions.polynomial_dimension(ref_el, degree) num_members = num_components * num_exp_functions embedded_degree = degree expansion_set = expansions.get_expansion_set(ref_el) sd = ref_el.get_spatial_dimension() # set up coefficients coeffs_shape = tuple([num_members] + list(shape) + [num_exp_functions]) coeffs = numpy.zeros(coeffs_shape, "d") # use functional's index_iterator function cur_bf = 0 if shape == tuple(): coeffs = numpy.eye(num_members) else: for idx in index_iterator(shape): n = expansions.polynomial_dimension(ref_el, embedded_degree) for exp_bf in range(n): cur_idx = tuple([cur_bf] + list(idx) + [exp_bf]) coeffs[cur_idx] = 1.0 cur_bf += 1 # construct dmats if degree == 0: dmats = [numpy.array([[0.0]], "d") for i in range(sd)] else: pts = ref_el.make_points(sd, 0, degree + sd + 1) v = numpy.transpose(expansion_set.tabulate(degree, pts)) vinv = numpy.linalg.inv(v) dv = expansion_set.tabulate_derivatives(degree, pts) dtildes = [[[a[1][i] for a in dvrow] for dvrow in dv] for i in range(sd)] dmats = [numpy.dot(vinv, numpy.transpose(dtilde)) for dtilde in dtildes] PolynomialSet.__init__(self, ref_el, degree, embedded_degree, expansion_set, coeffs, dmats)
def __init__(self, ref_el, degree, size=None): sd = ref_el.get_spatial_dimension() if size is None: size = sd shape = (size, size) num_exp_functions = expansions.polynomial_dimension(ref_el, degree) num_components = size * (size + 1) // 2 num_members = num_components * num_exp_functions embedded_degree = degree expansion_set = expansions.get_expansion_set(ref_el) # set up coefficients for symmetric tensors coeffs_shape = tuple([num_members] + list(shape) + [num_exp_functions]) coeffs = numpy.zeros(coeffs_shape, "d") cur_bf = 0 for [i, j] in index_iterator(shape): n = expansions.polynomial_dimension(ref_el, embedded_degree) if i == j: for exp_bf in range(n): cur_idx = tuple([cur_bf] + [i, j] + [exp_bf]) coeffs[cur_idx] = 1.0 cur_bf += 1 elif i < j: for exp_bf in range(n): cur_idx = tuple([cur_bf] + [i, j] + [exp_bf]) coeffs[cur_idx] = 1.0 cur_idx = tuple([cur_bf] + [j, i] + [exp_bf]) coeffs[cur_idx] = 1.0 cur_bf += 1 # construct dmats. this is the same as ONPolynomialSet. pts = ref_el.make_points(sd, 0, degree + sd + 1) v = numpy.transpose(expansion_set.tabulate(degree, pts)) vinv = numpy.linalg.inv(v) dv = expansion_set.tabulate_derivatives(degree, pts) dtildes = [[[a[1][i] for a in dvrow] for dvrow in dv] for i in range(sd)] dmats = [ numpy.dot(vinv, numpy.transpose(dtilde)) for dtilde in dtildes ] PolynomialSet.__init__(self, ref_el, degree, embedded_degree, expansion_set, coeffs, dmats)
def __init__(self, ref_el, degree, size=None): sd = ref_el.get_spatial_dimension() if size is None: size = sd shape = (size, size) num_exp_functions = expansions.polynomial_dimension(ref_el, degree) num_components = size * (size + 1) // 2 num_members = num_components * num_exp_functions embedded_degree = degree expansion_set = expansions.get_expansion_set(ref_el) # set up coefficients for symmetric tensors coeffs_shape = tuple([num_members] + list(shape) + [num_exp_functions]) coeffs = numpy.zeros(coeffs_shape, "d") cur_bf = 0 for [i, j] in index_iterator(shape): n = expansions.polynomial_dimension(ref_el, embedded_degree) if i == j: for exp_bf in range(n): cur_idx = tuple([cur_bf] + [i, j] + [exp_bf]) coeffs[cur_idx] = 1.0 cur_bf += 1 elif i < j: for exp_bf in range(n): cur_idx = tuple([cur_bf] + [i, j] + [exp_bf]) coeffs[cur_idx] = 1.0 cur_idx = tuple([cur_bf] + [j, i] + [exp_bf]) coeffs[cur_idx] = 1.0 cur_bf += 1 # construct dmats. this is the same as ONPolynomialSet. pts = ref_el.make_points(sd, 0, degree + sd + 1) v = numpy.transpose(expansion_set.tabulate(degree, pts)) vinv = numpy.linalg.inv(v) dv = expansion_set.tabulate_derivatives(degree, pts) dtildes = [[[a[1][i] for a in dvrow] for dvrow in dv] for i in range(sd)] dmats = [numpy.dot(vinv, numpy.transpose(dtilde)) for dtilde in dtildes] PolynomialSet.__init__(self, ref_el, degree, embedded_degree, expansion_set, coeffs, dmats)