def test_sparse(): sparse_array = Arraypy((2, 2), 'sparse') assert len(sparse_array) == 2 * 2 # dictionary where all data is assert len(sparse_array._output) == 0 # it's empty, even thought Arraypy knows that 'empty' data is zero if sys.version_info[0] >= 3: for i in sparse_array: assert i == 0 else: idx = sparse_array.start_index for i in range(len(sparse_array.start_index)): assert sparse_array[idx] == 0 idx = sparse_array.next_index(idx) sparse_array[0, 0] = 123 assert len(sparse_array._output) == 1 assert sparse_array[0, 0] == 123 # when element in sparse array become zero it will disappear from # dictionary sparse_array[0, 0] = 0 assert len(sparse_array._output) == 0 assert sparse_array[0, 0] == 0
def dw(omega, args): """Return a skew-symmetric tensor of type (0, p+1). Indexes the output tensor will start as well as the input tensor (array). If the input parameters of the same type, they must be equal to the initial indexes. Examples: ========= >>> from tensor_analysis.tensor_fields import dw >>> from sympy import symbols >>> from tensor_analysis.arraypy import Arraypy >>> x1, x2, x3 = symbols('x1 x2 x3') omega - differential form, differential which is calculated. It's can be a skew-symmetric tensor of type (0,p) or an array arraypy: >>> omega=Arraypy([2,3,1]).to_tensor((-1,-1)) >>> omega[1,2]=x3 >>> omega[1,3]=-x2 >>> omega[2,1]=-x3 >>> omega[2,3]=x1 >>> omega[3,1]=x2 >>> omega[3,2]=-x1 args it's a list of symbol arguments of differential form. It's can be in list, array of arraypy or contravariant tensor. External differential of a differential forms: >>> domega=dw(omega, [x1,x2,x3]) >>> print(domega) 0 0 0 0 0 3 0 -3 0 0 0 -3 0 0 0 3 0 0 0 3 0 -3 0 0 0 0 0 >>> domega.type_pq (0, 3) """ # Handling of a vector of arguments check_vector_of_arguments(args) # The definition of the start index of args if isinstance(args, list): idx_args = 0 else: idx_args = args.start_index[0] # Handling of a differential form if not isinstance(omega, (TensorArray, Arraypy)): raise ValueError( "The type of differential form must be TensorArray or Arraypy") if omega.rank > 1: if not is_asymmetric(omega): raise ValueError("The differential form must be a skew-symmetric") idx_omega = omega.start_index[0] # Define the start index in the output tensor if isinstance(omega, type(args)) and idx_omega != idx_args: raise ValueError("The start index of the differential form and \ vector of arguments must be equal") idx_st = idx_omega # Creating the output array in accordance with start indexes n = omega.shape[0] # the dimensionality of the input array p = len(omega.shape) # the rank of the input array valence_ind = [(-1) for k in range(p + 1)] d_omega = Arraypy([p + 1, n, idx_st]).to_tensor(valence_ind) # Calculation idx = d_omega.start_index if isinstance(args, (TensorArray, Arraypy)): args = args.to_list() for i in range(len(d_omega)): # tuple_list_indx it's list of tuple. Example:[(0, 1), (0, 1), (0, 0)] tuple_list_indx = [ delete_index_from_list( idx, f) for f in range( len(idx))] for k in range(p + 1): d_omega[idx] += Add(((-1)**k) * diff(omega[tuple_list_indx[k]], args[idx[k] - idx_st])) idx = d_omega.next_index(idx) # Output return d_omega
def test_next_index(): array = Arraypy((2, 2), 'Py') assert array.next_index((0, 0)) == (0, 1) assert array.next_index((0, 1)) == (1, 0) assert array.next_index((1, 0)) == (1, 1) assert array.next_index((1, 1)) == (0, 0)
def dw(omega, args): """Return a skew-symmetric tensor of type (0, p+1). Indexes the output tensor will start as well as the input tensor (array). If the input parameters of the same type, they must be equal to the initial indexes. Examples: ========= >>> from tensor_analysis.tensor_fields import dw >>> from sympy import symbols >>> from tensor_analysis.arraypy import Arraypy >>> x1, x2, x3 = symbols('x1 x2 x3') omega - differential form, differential which is calculated. It's can be a skew-symmetric tensor of type (0,p) or an array arraypy: >>> omega=Arraypy([2,3,1]).to_tensor((-1,-1)) >>> omega[1,2]=x3 >>> omega[1,3]=-x2 >>> omega[2,1]=-x3 >>> omega[2,3]=x1 >>> omega[3,1]=x2 >>> omega[3,2]=-x1 args it's a list of symbol arguments of differential form. It's can be in list, array of arraypy or contravariant tensor. External differential of a differential forms: >>> domega=dw(omega, [x1,x2,x3]) >>> print(domega) 0 0 0 0 0 3 0 -3 0 0 0 -3 0 0 0 3 0 0 0 3 0 -3 0 0 0 0 0 >>> domega.type_pq (0, 3) """ # Handling of a vector of arguments check_vector_of_arguments(args) # The definition of the start index of args if isinstance(args, list): idx_args = 0 else: idx_args = args.start_index[0] # Handling of a differential form if not isinstance(omega, (TensorArray, Arraypy)): raise ValueError( "The type of differential form must be TensorArray or Arraypy") if omega.rank > 1: if not is_asymmetric(omega): raise ValueError("The differential form must be a skew-symmetric") idx_omega = omega.start_index[0] # Define the start index in the output tensor if isinstance(omega, type(args)) and idx_omega != idx_args: raise ValueError("The start index of the differential form and \ vector of arguments must be equal") idx_st = idx_omega # Creating the output array in accordance with start indexes n = omega.shape[0] # the dimensionality of the input array p = len(omega.shape) # the rank of the input array valence_ind = [(-1) for k in range(p + 1)] d_omega = Arraypy([p + 1, n, idx_st]).to_tensor(valence_ind) # Calculation idx = d_omega.start_index if isinstance(args, (TensorArray, Arraypy)): args = args.to_list() for i in range(len(d_omega)): # tuple_list_indx it's list of tuple. Example:[(0, 1), (0, 1), (0, 0)] tuple_list_indx = [ delete_index_from_list(idx, f) for f in range(len(idx)) ] for k in range(p + 1): d_omega[idx] += Add( ((-1)**k) * diff(omega[tuple_list_indx[k]], args[idx[k] - idx_st])) idx = d_omega.next_index(idx) # Output return d_omega