Example #1
0
def derive_exprs():

    R = ReferenceFrame('N')
    x, y = R[0], R[1]

    w = x**2 * (1 - x)**2 / 10
    c = gradient(w, R) * sympy.exp(-w)
    f = divergence(c, R)

    return dict(quantities=dict(w=w, c=c, f=f), R=R)
Example #2
0
# alpha = symbols('a')
A1, A2 = symbols('A1 A2')
B1, B2 = symbols('B1 B2')
C2 = symbols('C2')

# Define interface offset (alpha)
alpha = 0.25 + A1 * t * sin(B1 * N[0]) + A2 * sin(B2 * N[0] + C2 * t)

# Define the solution equation (eta)
xi = (N[1] - alpha) / sqrt(2 * kappa)
eta_sol = (1 - tanh(xi)) / 2

eq_sol = simplify(
    time_derivative(eta_sol, N) + 4 * eta_sol * (eta_sol - 1) *
    (eta_sol - 0.5) - divergence(kappa * gradient(eta_sol, N), N))

# substitute coefficient values

parameters = ((kappa, params['kappa']), (A1, 0.0075), (B1, 8.0 * pi),
              (A2, 0.03), (B2, 22.0 * pi), (C2, 0.0625 * pi))

subs = [sub.subs(parameters) for sub in (eq_sol, eta_sol)]

# generate FiPy lambda functions

from sympy.utilities.lambdify import lambdify

(eq_fp, eta_fp) = [
    lambdify((N[0], N[1], t), sub, modules=fp.numerix) for sub in subs
]
pprint(sensor_functions)

# sensor_functions are functions which depend on absolute Sensor position.
# Let us find expressions for every Sensor values. We need to call this function
# providing sum of Sensor relative position plus associated Agents position
#print [sensor_function.subs({x: x, y: y}) if else  for sensor_function in sensor_functions]
# Every P[i] is a vector of potentials that affect i-th matter,
# not including the effect that produces i-th matter itself

# Let us reduce this potential against weighted against
# force affect on atoms and number of atoms in specific matter

R = ReferenceFrame('R')
M = [(P[i]*E*Nu[i, :].T)[0].subs({x: R[0], y: R[1]}) for i in xrange(0, len(p))]
#pprint(M)
W = [gradient(M[i], R).to_matrix(R).subs({R[0]: x, R[1]: y})[:2] for i in xrange(len(p))]


# Natural laws transformation calculation

natural_field = diag(*(ones(1, len(p)) * ((Nu*G).multiply_elementwise(F))))

force_is_present = natural_field.applyfunc(
            lambda exp: Piecewise((1.0, exp > 0.0),
                                  (0.0, exp <= 0.0))
        )

natural_influence = (Upsilon * Alpha * natural_field + S * Alpha)*force_is_present*ones(len(fs), 1)
pending_transformation_vector = Omicron.transpose()*natural_influence

#pprint(W, num_columns=1000)
      get_eight_edges_pyramid_expression()]

# fs = [x**1,
#       x**2,
#       x**3,
#       x**4,
#       x**5,
#       x**6]

F = Matrix(number_of_matters, len(fs), lambda i, j: fs[j].subs({x: x-ps[i][0], y: y-ps[i][1]}))

P = [Matrix(1, number_of_matters, lambda i, j: 0 if j == k else 1)*((Nu*G).multiply_elementwise(F)) for k in xrange(number_of_matters)]

R = ReferenceFrame('R')
M = [(P[i]*E*Nu[i, :].T)[0].subs({x: R[0], y: R[1]}) for i in xrange(0, number_of_matters)]
W = [gradient(M[i], R).to_matrix(R).subs({R[0]: x, R[1]: y})[:2] for i in xrange(number_of_matters)]

# Natural laws part

natural_field = diag(*(ones(1, number_of_matters) * ((Nu*G).multiply_elementwise(F))))

force_is_present = natural_field.applyfunc(
    lambda exp: Piecewise((1.0, exp > 0.0),
                          (0.0, True))
)

natural_influence = (Upsilon * Alpha * natural_field + S * Alpha)*force_is_present*ones(len(fs), 1)
pending_transformation_vector = Omicron.transpose()*natural_influence

Nu_new = (Nu -
          get_matrix_of_converting_atoms(Nu, ps, pending_transformation_vector) +
Example #5
0
def test_Airy():
    """Compare finite depth Airy wave expression with results from analytical
    expression"""
    try:
        import sympy as sp
        from sympy.abc import t
        from sympy.physics.vector import ReferenceFrame
        from sympy.physics.vector import gradient, divergence

        R = ReferenceFrame('R')
        x, y, z = R[0], R[1], R[2]
        Phi, k, h, g, rho = sp.symbols("Phi, k, h, g, rho")

        omega = sp.sqrt(g * k * sp.tanh(k * h))
        phi = g / omega * sp.cosh(k * (z + h)) / sp.cosh(
            k * h) * sp.sin(k * x - omega * t)
        u = gradient(phi, R)
        p = -rho * Phi.diff(t)

        for depth in np.linspace(100.0, 10.0, 2):
            for omega in np.linspace(0.5, 4.0, 2):

                dp = DiffractionProblem(dummy,
                                        free_surface=0.0,
                                        sea_bottom=-depth,
                                        omega=omega)

                for t_val, x_val, y_val, z_val in product(
                        np.linspace(0.0, 1.0, 2), np.linspace(-10, 10, 3),
                        np.linspace(-10, 10, 3), np.linspace(-10, 0, 3)):

                    parameters = {
                        t: t_val,
                        x: x_val,
                        y: y_val,
                        z: z_val,
                        omega: dp.omega,
                        k: dp.wavenumber,
                        h: dp.depth,
                        g: dp.g,
                        rho: dp.rho
                    }

                    phi_num = dp.Airy_wave_potential(
                        np.array((x_val, y_val, z_val)))
                    assert np.isclose(float(phi.subs(parameters)),
                                      np.real(phi_num *
                                              np.exp(-1j * dp.omega * t_val)),
                                      rtol=1e-3)

                    u_num = dp.Airy_wave_velocity(
                        np.array((x_val, y_val, z_val)))
                    assert np.isclose(float(u.dot(R.x).subs(parameters)),
                                      np.real(u_num[0] *
                                              np.exp(-1j * dp.omega * t_val)),
                                      rtol=1e-3)
                    assert np.isclose(float(u.dot(R.y).subs(parameters)),
                                      np.real(u_num[1] *
                                              np.exp(-1j * dp.omega * t_val)),
                                      rtol=1e-3)
                    assert np.isclose(float(u.dot(R.z).subs(parameters)),
                                      np.real(u_num[2] *
                                              np.exp(-1j * dp.omega * t_val)),
                                      rtol=1e-3)

    except ImportError:
        print("Not tested with sympy.")
Example #6
0
x = R[0]
y = R[1]

a=-0.5
b=1.5
visc=1e-1
lambda_=(1/(2*visc)-sqrt(1/(4*visc**2)+4*pi**2))
print(" visc=%f" % visc)

u=[0,0]
u[0]=1-exp(lambda_*x)*cos(2*pi*y)
u[1]=lambda_/(2*pi)*exp(lambda_*x)*sin(2*pi*y)
p=(exp(3*lambda_)-exp(-lambda_))/(8*lambda_)-exp(2*lambda_*x)/2
p=p - integrate(p, (x,a,b))

grad_p = gradient(p, R).to_matrix(R)
f0 = -divergence(visc*gradient(u[0], R), R) + grad_p[0]
f1 = -divergence(visc*gradient(u[1], R), R) + grad_p[1]
f2 = divergence(u[0]*R.x + u[1]*R.y, R)

print("\n * RHS:")
print(ccode(f0, assign_to = "values[0]"))
print(ccode(f1, assign_to = "values[1]"))
print(ccode(f2, assign_to = "values[2]"))


print("\n * ExactSolution:")
print(ccode(u[0], assign_to = "values[0]"))
print(ccode(u[1], assign_to = "values[1]"))
print(ccode(p, assign_to = "values[2]"))
    def compile(self):
        """
        This method generates callable objects, that
        :return:
        """

        number_of_matters = len(self.matters)
        number_of_atoms = len(self.atoms)
        number_of_forces = len(self.forces)
        number_of_sensors = len(self.sensors)
        number_of_agents = len(self.agents)

        ps = [[Symbol('p_x_{i}'.format(i=i)), Symbol('p_y_{i}'.format(i=i))] for i in xrange(number_of_matters)]
        fs = [force.function() for force in self.forces]

        F = Matrix(number_of_matters,
                   number_of_forces,
                   lambda i, j: fs[j].subs({x: x-ps[i][0], y: y-ps[i][1]}))

        # G stands for "generated functions"
        G = Matrix(len(self.atoms),
                   len(self.forces),
                   lambda i, j: 1 if self.forces[j] in self.atoms[i].produced_forces else 0)

        # E stands for "effect"
        E = Matrix(len(self.forces),
                   len(self.atoms),
                   lambda i, j: 1 if self.atoms[j] in self.forces[i].atoms_to_produce_effect_on else 0)

        # Accelerator force
        Alpha = Matrix(len(self.natural_laws),
                       len(self.forces),
                       lambda i, j: 1 if self.forces[j] is self.natural_laws[i].accelerator else 0)

        # Multiplicative component of natural law
        Upsilon = diag(*[natural_law.multiplicative_component for natural_law in self.natural_laws])

        # Additive component of natural law
        S = diag(*[natural_law.additive_component for natural_law in self.natural_laws])

        # Omicron stands for origin
        Omicron = Matrix(len(self.natural_laws),
                         len(self.atoms),
                         lambda i, j: 1 if self.atoms[j] is self.natural_laws[i].atom_in else 0)

        # D stands for destination
        D = Matrix(len(self.natural_laws),
                   len(self.atoms),
                   lambda i, j: 1 if self.atoms[j] is self.natural_laws[i].atom_out else 0)

        Nu = Matrix(number_of_matters,
                    number_of_atoms,
                    lambda i, j: Symbol("nu_{i}_{j}".format(i=i, j=j)))

        # T stands for target [of Sensor]
        T = Matrix(number_of_sensors,
                   number_of_forces,
                   lambda i, j: 1 if self.forces[j] is self.sensors[i].perceived_force else 0)

        # TODO: check weather this expression is duplication
        ps = [[Symbol('p_x_{i}'.format(i=i)), Symbol('p_y_{i}'.format(i=i))] for i in xrange(number_of_matters)]

        P = [Matrix(1, number_of_matters, lambda i, j: 0 if j == k else 1)*((Nu*G).multiply_elementwise(F)) for k in xrange(number_of_matters)]

        R = ReferenceFrame('R')
        M = [(P[i]*E*Nu[i, :].T)[0].subs({x: R[0], y: R[1]}) for i in xrange(0, number_of_matters)]
        W = [gradient(M[i], R).to_matrix(R).subs({R[0]: x, R[1]: y})[:2] for i in xrange(number_of_matters)]

        # Natural laws part

        natural_field = diag(*(ones(1, number_of_matters) * ((Nu*G).multiply_elementwise(F))))

        force_is_present = natural_field.applyfunc(
            lambda exp: Piecewise((1.0, exp > 0.0),
                                  (0.0, True))
        )

        natural_influence = (Upsilon * Alpha * natural_field + S * Alpha)*force_is_present*ones(len(fs), 1)
        pending_transformation_vector = Omicron.transpose()*natural_influence

        Nu_new = (Nu -
                  get_matrix_of_converting_atoms(Nu, ps, pending_transformation_vector) +
                  get_matrix_of_converted_atoms(Nu, ps, pending_transformation_vector, natural_influence, Omicron, D))

        delta_t = Symbol('Delta_t')

        inputs = map(lambda s: Symbol(s),
                     list(itertools.chain(["Delta_t"],
                                          map(lambda s: str(s), itertools.chain(*ps)),
                                          ["nu_{i}_{j}".format(i=i, j=j)
                                           for i in xrange(number_of_matters) for j in xrange(number_of_atoms)]
                                  )))

        self.new_position_generators = list()

        position_functions = list()

        for i in xrange(number_of_matters):
            (x_v, y_v) = tuple(ps[i])
            (dx, dy) = (x_v + W[i][0].subs({x: x_v, y: y_v})*delta_t, y_v + W[i][1].subs({x: x_v, y: y_v})*delta_t)

            cuda_code_dx = position_device_function_template.format(component="x", idx=i, expression=self.convert_position_code_to_cuda(ccode(dx)))
            cuda_code_dy = position_device_function_template.format(component="y", idx=i, expression=self.convert_position_code_to_cuda(ccode(dy)))

            position_functions.append(cuda_code_dx)
            position_functions.append(cuda_code_dy)

            dx_op = SymPyCCode(inputs, dx)
            dy_op = SymPyCCode(inputs, dy)
            input_scalars = [theano.tensor.dscalar(str(inp)) for inp in inputs]
            dx_dy_t = theano.function(input_scalars, [dx_op(*input_scalars), dy_op(*input_scalars)])
            self.new_position_generators.append(dx_dy_t)

        function_list_x = ", ".join(["""p_{component}_func_{idx}""".format(component="x", idx=i) for i in xrange(number_of_matters)])
        function_list_x_cuda_code = position_transition_functions_template.format(component="x", functions_list=function_list_x)
        function_list_y = ", ".join(["""p_{component}_func_{idx}""".format(component="y", idx=i) for i in xrange(number_of_matters)])
        function_list_y_cuda_code = position_transition_functions_template.format(component="y", functions_list=function_list_y)

        # Natural law theano optimization

        self.new_quantities_generators = list()

        atoms_quantities_functions = list()

        for i in xrange(number_of_matters):
            for j in xrange(number_of_atoms):

                cuda_code_nu = atom_quantities_device_function_template.format(
                        idx=i*number_of_atoms+j,
                        expression=self.convert_atoms_quantities_code_to_cuda(ccode(Nu_new[i, j])))

                atoms_quantities_functions.append(cuda_code_nu)

                nu_op = SymPyCCode(inputs, Nu_new[i, j])
                input_scalars = [theano.tensor.dscalar(str(inp)) for inp in inputs]
                nu_t = theano.function(input_scalars, [nu_op(*input_scalars), ])
                self.new_quantities_generators.append(nu_t)

        atoms_quantities_functions_list = ", ".join(["""nu_func_{idx}""".format(idx=i) for i in xrange(number_of_matters*number_of_atoms)])
        atoms_quantities_functions_list_cuda_code = atoms_quantities_functions_template.format(functions_list=atoms_quantities_functions_list)

        positions_initialization_cuda_code = list()

        for p_x_i, p_x in enumerate(self.matters_positions[0::2]):
            positions_initialization_cuda_code.append("p_x[{idx}] = {value};".format(idx=p_x_i, value=p_x))

        for p_y_i, p_y in enumerate(self.matters_positions[1::2]):
            positions_initialization_cuda_code.append("p_y[{idx}] = {value};".format(idx=p_y_i, value=p_y))

        atoms_quantities_initialization_cuda_code = list()

        for i in xrange(len(self.matters)):
            for j in xrange(len(self.atoms)):
                atoms_quantities_initialization_cuda_code.append("nu[{matter_idx}*NUMBER_OF_ATOMS + {atom_idx}] = {value};".format(matter_idx=i,
                                                                                                                                   atom_idx=j,
                                                                                                                                   value=self.atoms_quantities[(len(self.atoms)*i + j)]))

        return {"positions_functions": "\n".join(position_functions),
                "positions_functions_list": "\n".join([function_list_x_cuda_code, function_list_y_cuda_code]),
                "atoms_quantities_functions": "\n".join(atoms_quantities_functions),
                "atoms_quantities_functions_list": atoms_quantities_functions_list_cuda_code,
                "positions_initialization": "\n".join(positions_initialization_cuda_code),
                "atoms_quantities_initialization": "\n".join(atoms_quantities_initialization_cuda_code)}
from sympy.physics.vector import gradient, ReferenceFrame
from sympy.abc import x, y

R = ReferenceFrame("R")

rect = (
    BITMAP_BOUNDING_RECT_BASE_X_DEFAULT,
    BITMAP_BOUNDING_RECT_BASE_Y_DEFAULT,
    BITMAP_BOUNDING_RECT_EXTENT_X_DEFAULT,
    BITMAP_BOUNDING_RECT_EXTENT_Y_DEFAULT,
)
image_path = "/Users/aloschil/workspace/game_engine/snippets/bitmap_force_input.jpg"
print ">>>>>>>>>> First call"
f = build_optimized_function(image_path, rect)
print f
w = gradient(10.0 * f(x, y).subs({x: R[0], y: R[1]}), R).to_matrix(R).subs({R[0]: x, R[1]: y})[:2]
(x_v, y_v) = (10.0, 10.0)
print w[0].subs({x: x_v, y: y_v})
print w[1].subs({x: x_v, y: y_v})
print "<<<<<<<<<First call ended \n\n\n"
sleep(50)
print ">>>>>>>> A call after 50 seconds"
print build_optimized_function(image_path, rect)
f = build_optimized_function(image_path, rect)
print f
w = gradient(10.0 * f(x, y).subs({x: R[0], y: R[1]}), R).to_matrix(R).subs({R[0]: x, R[1]: y})[:2]
(x_v, y_v) = (10.0, 10.0)
print w[0].subs({x: x_v, y: y_v})
print w[1].subs({x: x_v, y: y_v})

print "<<<<<<<< end of the call after 20 seconds\n\n\n"
Example #9
0
R = ReferenceFrame('R')
x = R[0]
y = R[1]

visc = Symbol("nu")
# visc=1e-1;
# print(" visc=%f" % visc)

u = [0, 0]
u[0] = pi * sin(pi * x) * sin(pi * x) * sin(2 * pi * y)
u[1] = -pi * sin(2 * pi * x) * sin(pi * y) * sin(pi * y)
p = cos(pi * x) * sin(pi * y)
# p=p - integrate(p, (x,a,b));

grad_p = gradient(p, R).to_matrix(R)
f0 = simplify(-divergence(visc * gradient(u[0], R), R)) + grad_p[0]
f1 = simplify(-divergence(visc * gradient(u[1], R), R)) + grad_p[1]
f2 = simplify(divergence(u[0] * R.x + u[1] * R.y, R))

print("f:")
print(f0)
print(f1)
print(f2)

print("\n * RHS:")
print(ccode(f0, assign_to="values[0]"))
print(ccode(f1, assign_to="values[1]"))
print(ccode(f2, assign_to="values[2]"))

print("\n * ExactSolution:")
Example #10
0
y = R[1]

a = -0.5
b = 1.5
visc = 1e-1
lambda_ = (1 / (2 * visc) - sqrt(1 / (4 * visc**2) + 4 * pi**2))
print(" visc=%f" % visc)

u = [0, 0]
u[0] = 1 - exp(lambda_ * x) * cos(2 * pi * y)
u[1] = lambda_ / (2 * pi) * exp(lambda_ * x) * sin(2 * pi * y)
p = (exp(3 * lambda_) - exp(-lambda_)) / (8 * lambda_) - exp(
    2 * lambda_ * x) / 2
p = p - integrate(p, (x, a, b))

grad_p = gradient(p, R).to_matrix(R)
f0 = -divergence(visc * gradient(u[0], R), R) + grad_p[0]
f1 = -divergence(visc * gradient(u[1], R), R) + grad_p[1]
f2 = divergence(u[0] * R.x + u[1] * R.y, R)

print("\n * RHS:")
print(ccode(f0, assign_to="values[0]"))
print(ccode(f1, assign_to="values[1]"))
print(ccode(f2, assign_to="values[2]"))

print("\n * ExactSolution:")
print(ccode(u[0], assign_to="values[0]"))
print(ccode(u[1], assign_to="values[1]"))
print(ccode(p, assign_to="values[2]"))

print("")
Example #11
0
du = 0. * R.x
for x in (R[0], R[1], R[2]):
	for vect in (R.x, R.y, R.z):
		du += diff(u.dot(vect), x, x) * vect

D_visc = 0.0
D_therm = 0.0
D_comp = 0.0
B_therm = Symbol("B_therm")
B_comp = Symbol("B_comp")
S_therm = Symbol("S_therm")
S_comp = Symbol("S_comp")

# Construct the equations
continuity = divergence(u, R)
momentum = I * ang * u + gradient(p, R) - B_therm * temp * R.z + B_comp * chem * R.z - D_visc * du
temperature = I * ang * temp + S_therm * u.dot(R.z) - D_therm * divergence(gradient(temp, R), R)
composition = I * ang * chem + S_comp * u.dot(R.z) - D_comp * divergence(gradient(chem, R), R)

# Solve the equations
# print(solve(temperature, "T"))
subT = solve(temperature, "T")[0]
# print(solve(composition, "C"))
subC = solve(composition, "C")[0]

# print(solve(momentum.dot(R.z).subs(Temp, subT).subs(Chem, subC), "P"))
subP = solve(momentum.dot(R.z).subs(Temp, subT).subs(Chem, subC), "P")[0]

# print(solve(momentum.dot(R.x).subs(P, subP), "Ux"))
subUx = solve(momentum.dot(R.x).subs(P, subP), "Ux")[0]
# print(solve(momentum.dot(R.y).subs(P, subP), "Uy"))