Source code for sfepy.linalg.sympy_operators

from __future__ import print_function
import sympy as sp
from sympy import sin, cos, sympify, lambdify, Symbol

from numpy import arange, zeros

dim = 3
[docs] def set_dim(dim): globals()['dim'] = dim
[docs] def default_space_variables(variables): from sympy.abc import x, y, z if variables is None: variables = [x, y, z][:dim] return variables
[docs] def grad(f, variables=None): variables = default_space_variables(variables) n_var = len(variables) f = sp.sympify(f) out = sp.zeros(n_var, 1) for iv, var in enumerate(variables): out[iv,0] = f.diff(var) return out
[docs] def grad_v(f, variables=None): variables = default_space_variables(variables) n_var = len(variables) f = sympify(f) out = zeros((n_var,) + f.shape) for iv, var in enumerate(variables): out[iv,...] = f.diff(var) return out
[docs] def div(field, variables=None): variables = default_space_variables(variables) n_var = len(variables) field = list(field) assert len(field) == n_var out = 0 for f_i, x_i in zip(field, variables): out += sp.sympify(f_i).diff(x_i) return out
[docs] def laplace(f, variables=None): return div(grad(f, variables), variables)
[docs] def boundary(f, variables): lap = laplace(f, variables) l = lambdify(variables, lap) a = 5. for xx in arange(-a, a, 0.1): yy = -a print(xx, yy, l(xx, yy))
if __name__ == '__main__': from sympy.abc import x, y f = sin(x)*cos(y) boundary(f, [x, y]) set_dim(2) f = 'sin(3.0 * x) * cos(4.0 * y)' A = sp.Matrix([[1, 0.1], [0.1, 2]]) gf = grad(f) agf = A * gf