def _build_orientation_map(n_fp): """ The keys are binary masks of the lexicographical ordering of facet vertices. A bit i set to one means `v[i] < v[i+1]`. The values are `[original_order, permutation, orientation]`, where `permutation` can be used to sort facet vertices lexicographically, and `orientation` is the order of the first vertex + 1 times the sign. Hence `permuted_facet = facet[permutation]`. """ indices = range(n_fp) cmps = [(i1, i2) for i2 in indices for i1 in indices[:i2]] powers = [2**ii for ii in range(len(cmps))] ori_map = {} for indx in permutations(indices): key = 0 sign = 1 for ip, power in enumerate(powers): i1, i2 = cmps[ip] less = (indx[i1] < indx[i2]) key += power * less if not less: sign *= -1 isort = nm.argsort(indx) ori_map[key] = [indx, isort, sign * (indx[0] + 1)] return ori_map, cmps, powers
def build_orientation_map(n_fp): """ The keys are binary masks of the lexicographical ordering of facet vertices. A bit i set to one means `v[i] < v[i+1]`. The values are `[original_order, permutation]`, where `permutation` can be used to sort facet vertices lexicographically. Hence `permuted_facet = facet[permutation]`. """ from sfepy.linalg import permutations indices = list(range(n_fp)) cmps = [(i1, i2) for i2 in indices for i1 in indices[:i2]] powers = [2**ii for ii in range(len(cmps))] ori_map = {} for indx in permutations(indices): key = 0 sign = 1 for ip, power in enumerate(powers): i1, i2 = cmps[ip] less = (indx[i1] < indx[i2]) key += power * less if not less: sign *= -1 isort = nm.argsort(indx) ori_map[key] = [indx, isort] return ori_map, cmps, powers
def _build_orientation_map(n_fp): """ The keys are binary masks of the lexicographical ordering of facet vertices. A bit i set to one means `v[i] < v[i+1]`. The values are `[original_order, permutation, orientation]`, where `permutation` can be used to sort facet vertices lexicographically, and `orientation` is the order of the first vertex + 1 times the sign. Hence `permuted_facet = facet[permutation]`. """ indices = range(n_fp) cmps = [(i1, i2) for i2 in indices for i1 in indices[:i2]] powers = [2 ** ii for ii in range(len(cmps))] ori_map = {} for indx in permutations(indices): key = 0 sign = 1 for ip, power in enumerate(powers): i1, i2 = cmps[ip] less = indx[i1] < indx[i2] key += power * less if not less: sign *= -1 isort = nm.argsort(indx) ori_map[key] = [indx, isort, sign * (indx[0] + 1)] return ori_map, cmps, powers