Commit 4e87a215 authored by Markus Holzer's avatar Markus Holzer
Browse files

Merge branch 'FIX_sympy_1.6' into 'master'

Fix sympy 1.6

See merge request pycodegen/pystencils!157
parents e685321c 1078bd53
......@@ -13,6 +13,7 @@ tests-and-coverage:
- $ENABLE_NIGHTLY_BUILDS
image: i10git.cs.fau.de:5005/pycodegen/pycodegen/full
script:
- pip list
- export NUM_CORES=$(nproc --all)
- mkdir -p ~/.config/matplotlib
- echo "backend:template" > ~/.config/matplotlib/matplotlibrc
......@@ -123,7 +124,9 @@ pycodegen-integration:
- git fetch test
- git reset --hard $CI_COMMIT_SHA
- cd ..
- export PYTHONPATH=`pwd`/pystencils:`pwd`/lbmpy:`pwd`/pygrandchem:`pwd`/pystencils_walberla:`pwd`/lbmpy_walberla
- pip install -e pystencils/
- pip install -e lbmpy/
- pip install -e pygrandchem/
- ./install_walberla.sh
- export NUM_CORES=$(nproc --all)
- mkdir -p ~/.config/matplotlib
......@@ -135,7 +138,11 @@ pycodegen-integration:
- cd ../pygrandchem
- py.test -v -n $NUM_CORES .
- cd ../walberla/build/
- make CodegenJacobiCPU CodegenJacobiGPU MicroBenchmarkGpuLbm LbCodeGenerationExample
- make CodegenJacobiCPU CodegenJacobiGPU CodegenPoisson MicroBenchmarkGpuLbm LbCodeGenerationExample UniformGridBenchmarkGPU_trt UniformGridBenchmarkGPU_entropic_kbc_n4
- cd apps/benchmarks/UniformGridGPU
- make -j $NUM_CORES
- cd ../UniformGridGenerated
- make -j $NUM_CORES
tags:
- docker
- cuda
......
......@@ -66,6 +66,7 @@ try:
if int(sympy_version[0]) <= 1 and int(sympy_version[1]) <= 4:
def hash_fun(self):
return hash((self.lhs, self.rhs))
Assignment.__hash__ = hash_fun
except Exception:
pass
......@@ -94,16 +95,19 @@ def assignment_from_stencil(stencil_array, input_field, output_field,
... [0, 6, 0]]
By default 'visual ordering is used - i.e. the stencil is applied as the nested lists are written down
>>> assignment_from_stencil(stencil, f, g, order='visual')
Assignment(g_C, 3*f_W + 6*f_S + 4*f_C + 2*f_N + 5*f_E)
>>> expected_output = Assignment(g[0, 0], 3*f[-1, 0] + 6*f[0, -1] + 4*f[0, 0] + 2*f[0, 1] + 5*f[1, 0])
>>> assignment_from_stencil(stencil, f, g, order='visual') == expected_output
True
'numpy' ordering uses the first coordinate of the stencil array for x offset, second for y offset etc.
>>> assignment_from_stencil(stencil, f, g, order='numpy')
Assignment(g_C, 2*f_W + 3*f_S + 4*f_C + 5*f_N + 6*f_E)
>>> expected_output = Assignment(g[0, 0], 2*f[-1, 0] + 3*f[0, -1] + 4*f[0, 0] + 5*f[0, 1] + 6*f[1, 0])
>>> assignment_from_stencil(stencil, f, g, order='numpy') == expected_output
True
You can also pass field accesses to apply the stencil at an already shifted position:
>>> assignment_from_stencil(stencil, f[1, 0], g[2, 0])
Assignment(g_2E, 3*f_C + 6*f_SE + 4*f_E + 2*f_NE + 5*f_2E)
>>> expected_output = Assignment(g[2, 0], 3*f[0, 0] + 6*f[1, -1] + 4*f[1, 0] + 2*f[1, 1] + 5*f[2, 0])
>>> assignment_from_stencil(stencil, f[1, 0], g[2, 0]) == expected_output
True
"""
from pystencils.field import Field
......
import itertools
import warnings
from collections import defaultdict
import numpy as np
......@@ -172,18 +171,6 @@ class FiniteDifferenceStencilDerivation:
f = field_access
return sum(f.get_shifted(*offset) * weight for offset, weight in zip(self.stencil, self.weights))
def as_matrix(self):
warnings.warn("as_matrix is deprecated and may be removed in the near future."
"Please use as_array instead which will return an MutableDenseNDimArray."
"as_array therefore can also work in 3 dimensions", category=DeprecationWarning)
dim = len(self.stencil[0])
assert dim == 2
max_offset = max(max(abs(e) for e in direction) for direction in self.stencil)
result = sp.Matrix(2 * max_offset + 1, 2 * max_offset + 1, lambda i, j: 0)
for direction, weight in zip(self.stencil, self.weights):
result[max_offset - direction[1], max_offset + direction[0]] = weight
return result
def __array__(self):
return np.array(self.as_array().tolist())
......
......@@ -21,10 +21,13 @@ def diffusion(scalar, diffusion_coeff, idx=None):
Examples:
>>> f = Field.create_generic('f', spatial_dimensions=2)
>>> d = sp.Symbol("d")
>>> dx = sp.Symbol("dx")
>>> diffusion_term = diffusion(scalar=f, diffusion_coeff=sp.Symbol("d"))
>>> discretization = Discretization2ndOrder()
>>> discretization(diffusion_term)
(f_W*d + f_S*d - 4*f_C*d + f_N*d + f_E*d)/dx**2
>>> expected_output = ((f[-1, 0] + f[0, -1] - 4*f[0, 0] + f[0, 1] + f[1, 0]) * d) / dx**2
>>> sp.simplify(discretization(diffusion_term) - expected_output)
0
"""
if isinstance(scalar, Field):
first_arg = scalar.center
......@@ -313,8 +316,9 @@ def discretize_center(term, symbols_to_field_dict, dx, dim=3):
>>> term
x*x^Delta^0
>>> f = Field.create_generic('f', spatial_dimensions=3)
>>> discretize_center(term, { x: f }, dx=1, dim=3)
f_C*(-f_W/2 + f_E/2)
>>> expected_output = f[0, 0, 0] * (-f[-1, 0, 0]/2 + f[1, 0, 0]/2)
>>> sp.simplify(discretize_center(term, { x: f }, dx=1, dim=3) - expected_output)
0
"""
substitutions = {}
for symbols, field in symbols_to_field_dict.items():
......@@ -396,8 +400,10 @@ def discretize_divergence(vector_term, symbols_to_field_dict, dx):
>>> x, dx = sp.symbols("x dx")
>>> grad_x = grad(x, dim=3)
>>> f = Field.create_generic('f', spatial_dimensions=3)
>>> sp.simplify(discretize_divergence(grad_x, {x : f}, dx))
(f_W + f_S + f_B - 6*f_C + f_T + f_N + f_E)/dx**2
>>> expected_output = (f[-1, 0, 0] + f[0, -1, 0] + f[0, 0, -1] -
... 6*f[0, 0, 0] + f[0, 0, 1] + f[0, 1, 0] + f[1, 0, 0])/dx**2
>>> sp.simplify(discretize_divergence(grad_x, {x : f}, dx) - expected_output)
0
"""
dim = len(vector_term)
result = 0
......
......@@ -7,6 +7,7 @@ from typing import Callable, Dict, Iterable, List, Optional, Sequence, Tuple, Ty
import sympy as sp
from sympy.functions import Abs
from sympy.core.numbers import Zero
from pystencils.assignment import Assignment
from pystencils.data_types import cast_func, get_base_type, get_type_of_expression
......@@ -260,8 +261,8 @@ def subs_additive(expr: sp.Expr, replacement: sp.Expr, subexpression: sp.Expr,
if not param_list:
return current_expr
else:
if current_expr.func == sp.Mul and sp.numbers.Zero() in param_list:
return sp.numbers.Zero()
if current_expr.func == sp.Mul and Zero() in param_list:
return Zero()
else:
return current_expr.func(*param_list, evaluate=False)
......
......@@ -61,9 +61,9 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAABLCAMAAABEOFk1AAAAPFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAo1xBWAAAAE3RSTlMAMquZdlQiEEDpMESJZs3d77ts6LWnRAAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAj9JREFUWAntmV17gyAMRlFQ1olf4///1wl0kpc+Qlba3QxvBnKas6TUaio6649evOtYg0CIzkp1HMO7RGJ24XvrTOPbJDHwgCajZtPF1csRk6MYmpajgnotZ8jkAAPTvLkkzHKZyn2BySEGpt1vv8HqgorJIQYm602TLe1CJocYNWkrXTKTVfmcmFyCUdNojVN0JROTSzA0+Zy6ILzOawy5l7gEo6Yk3UsVk0swahLhLRyYO6LIYTgw7bvLYy7vch6H4cCEH7XL6gkmhxiYxOquRlv5wsfkAEOTNsfVvSwSTA4wNF0XrH6lmWpq2KrXqocVaDsC6yG0lPvOuEz6l6XVG7bSLVi0aXcrZewUzzyMSDgw6d70xa/BGE36f2rzt6PxbBxhODAdUPkLN0baVjfuc88PJFyNafH59zbzTr3IFLJbc/V+pWnK3h2+0rRmH1qfNOmFHPc3R/rb3rhLklFi+rh9ngBZOs9lBiovolv564bPub8zDU40Zp4hSbiaXS46/2yinjOp3J5NyjiuxhjZ+89vsvQzJeEwJ9lvdpHzD1f4u4SGxrUJwqGpELpquZlqyteq16qHFfgHO4I2GTF5nDE5imH1oMmIsWHG5AADE7YqIDZMmBxiYMImIwSHCZNDDEzYZITgMGFyiFFT0iaD4HTC5BKMmpImIw0OYyaXYGhqPctSb7P1LGHTnRNoRp5nHwaA0b13dEZbz/KhXLkTWL0cWbvWTDUVDNX7q1+OtfthV6lcp6kmmaNFFATiG+4bKVe2WSLVAAAAAElFTkSuQmCC\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAGkAAABLCAYAAABz5qkHAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFJklEQVR4Ae2dXW7UMBSFp4hnBFRCvDLdQaEroOygsIPCDqh4at9QuwPoClC7hHYFpbOD8oyQqBAr4JwZG3kySezM3DvOONdS6p94rm/OFzsZO5NuHR8f745Go1tsdeHy5OTkbd0OK5NTABrfwdq4ziL2bT0MdnxFmpXD8CPMWFpNgVNYflyxvof8ActCSKegZlAqSq0jC93ZQeYCyghoAdJcpboMPkjiv7H9wbaD7RvKJoizh5J9e5CqLkTgdesG8Rk2kv+M7QLp2rE01a5EvdJ9S4IEEd5DzDHiSy8q0uxNzF/4shzxEHxLggTxeYd3VQPhBmW7EKp60aupqlZUvG+pkPYbJGZvYmjaP9ur+7ep7WJ8i0IKesl9i9bjln1qu4biWxQSFH7qVPZnZih6G7iwnlZ6EL6lQPICt113tn2lTHHRvqVAaust/kzmd6ccYRC+RSFh3PfDnAcSwvBncJaZiqH4FoXkiPD22wMJIXlwdbfnYT3NdPG+pULiF9ZXNUpzamgSnNE1VdSLivctCRIgcBroHvF0wo+yI82exZmIQ+ZzhSH4Fs6Cx3R+iQqfIMrYVeRU+mvkJ7EPrmF/0b4lQwIM3kAcrUHwzk2U7lvScNdZNfuAqAIGSVROHWMGSUdXUasGSVROHWMGSUdXUasGSVROHWMGSUdXUasGSVROHWMGSUdXUasGSVROHWPJ00I6za/HKqaNOBnMBzsZxrNodNSTeUfnTnPUGRIOjDPh59heuDmzZus92OMAnSPmo1/TgDSB3SJ+g20ta2FoZ2ndkiChAZ6JBMMVWJ6JzG9KIJC55RQcD3sRl1m4FvVE60CkdEuFxBnw6ZnoDu7/upLWAQrafQdb+9i4QBkG9qADHA+fzFVZ/oddEd2GcOMw7f0QrKn3N5WHQLOmk3pSVg9XbBxwuCBYF3ZdoUovqmtw2bIh9KQFbQCOwx+vrfyFCIekXodBQgKRL9j4U9NerjRXz5jeD3cQkteM66rjkfwhPlf77AXKCegK8YeIjd7sJqRH2H65uDeOeUcgJoejpuuKr5YUw9ZHVtwQQM/hKrmMONz9xfbMxYjKDADDrw07ISCkefvNa1Mfw084RS5TSH10UNQngOCd3F4IyDWwEd/3lrkm9f57RUjY9RTOLPBGwc/f8Rj4iDR/pXgW1ldML61bMiQcDC+4PLB9dyDXKPuONOfAFn7i7ur0ISIgDmnT61HFIfXvSBK6dYG0MXdDIQiIJHLTEdrskkb7K+s21O9JXXTOXtcgZUcQd8AgxTXKXsMgZUcQd8AgxTXKXsMgZUcQd8AgxTXKXsMgZUcQd8AgxTXKXsMgZUcQdyB5WoimMMXBCUp7c2Rc17kaq+qW3JPQkL05ck76tIyEbkmQ0JC9OTKNyVwtKd2SIKHl4t/OOKeuXEZEt1RIfg2p6j6fP2Bo2j/bq/u3qe1ifItCQpf1K4ptry0b63Kotz4U36KQIA9XYxn8mTnLzf62gQvraaUH4VsKJC+w71E+H8bbYSZDumjfUiC19RZ/JtubIxfPTDHdopAw7vthzgMJ3fFnsPoDHWGjPj0U36KQnCDFv53RgxeORXRLhVT82xmF4XhzIrolQcKwYm+O9LJ3iKV06zLByufX7M2RHSC5qivrlgzJXaR7+Xue0n1LGu66nzz2CUkFDJKkmkq2DJKSsJJmDZKkmkq2DJKSsJJmw7u7O9wlVW3bPwOuKqKQh+6N/wyYzRES592abq0nrGRBXQE+4OPnQRca+weeGBF+hDwvIgAAAABJRU5ErkJggg==\n",
"text/latex": [
"$$\\left[\\begin{matrix}0 & 0 & 0\\\\1 & -2 & 1\\\\0 & 0 & 0\\end{matrix}\\right]$$"
"$\\displaystyle \\left[\\begin{matrix}0 & 0 & 0\\\\1 & -2 & 1\\\\0 & 0 & 0\\end{matrix}\\right]$"
],
"text/plain": [
"⎡0 0 0⎤\n",
......@@ -79,7 +79,7 @@
}
],
"source": [
"standard_2d_00.get_stencil().as_matrix()"
"standard_2d_00.get_stencil().as_array()"
]
},
{
......@@ -123,9 +123,9 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAIIAAABNCAMAAABdY0yuAAAAYFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACACGXEAAAAH3RSTlMAMquZdlQiEEDpMES73YnNZu+F48P7apvf1/Fc0cls39hR/gAAAAlwSFlzAAAOxAAADsQBlSsOGwAAA8dJREFUaAXtmumW2yAMhcFrU6/pdJ0ufv+3LNjGBnQBkcn0NOfEPxIbpMsXGQMyEcI/ZO+XsK55bhwrWZYDq0nXiOcWsJLLehSHZHcLghA8N9tq2FoWQi5lpY763yPMut1i0QjN0fp6YoO6NdErnhuxqp8IKqzPKOi+BaNQ3/ZQ8tyIFUBoymEpqmjfR5U8N2AFEJD+e5Y9LkI7WYd8W4zcKGxDtvXJFz+cgi6HhTnZLV2EoPt7VhCEfTofy75sMxsex2qOu0BxD8FM56OauIoprufXTp1orn6hfR0Q9xDMpD8oBDKB2nL0vFLrjTYxnGyzpCceQuiEaBb1wT+u53oj6LQjuOIBBC1SL1mdYamrKtV9zrWCJR5BGBJRdX9rs4zmLroV9tWJYImHEcbSdk6et+ttS9y7A8EWDyLMeQRCbAjxp9IgOOIhhE6HNWvknXTrvCi44gShHmQhm08vdV33Wd3x60U2317iNwyKewh6Ov+sxvAv6zge1/NqO+XyPQodEPcQtGxXy6iS17S55LkBK4SQ1QUMAbPngP6FEFRulRpjjobPk47lBqwAQqPGzzk/t+a5ASuAoH9Y5hRlYsFz86wAgr4J21hnlFnfPDdgBRCuaqJu8qYozchzA1YAYVRRsMdwVgyUC8sNWAEEMY6lGp6zD54btUII2Y2/zeFxEe6dyny4fLRCaRIN9fol5+C5Ias/l5vHoRzAmC3sC+mcBEmOVVkwplgijhCSOQkCEKVaNZXpqYWKAwROTgIg9FgyJzsQEAcInJwEIOiidBSAOEDg5CQYob0mVztAnCKwchKIUE3J5AeJUwRWTgIRGDcCiVMEVk4SQGiWVG4LEh6AwMlJKMLaD5olnk0JAcQBQtfLvs58vaGQhkb28zU1NgFxgCD7H683rKB//vr9Wni7CjRYQBwgpHN0qryWmKQ1UL0XE6sngo7MMwrPKOxPCO4LZOPEWMe/eW7ECnRHsHESb3qr5bkBK4DAae+eNo+LcO9U5nzlcGQa5oQfcOMRXsAeFuZkF/8fbwTcOOEFgyQpxA2Ke1EIbJwQLVRAkxTPKiDuIZi1grdx4mnBS5CkELttreCJhxDcjROiBQpAkkKsdgRXPICgna2NE6IFCkCSQqzOFZMlHkGwNk6IFi1ASQqxOhEs8TBC5ks3lKSEEWzxIIKzcUK0QAFIUoiViYIjHkJwN06IFigASQqx2hFc8Q1hHTK3v1Zt07mcsndlOvV6I5UB+eLHX6ta/QenqlKPijDT+XWFIr8iWlCXYzwDouLrX6uqSvwFDr5NBGUlpz0AAAAASUVORK5CYII=\n",
"image/png": "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\n",
"text/latex": [
"$$\\left[\\begin{matrix}\\frac{1}{12} & - \\frac{1}{6} & \\frac{1}{12}\\\\\\frac{5}{6} & - \\frac{5}{3} & \\frac{5}{6}\\\\\\frac{1}{12} & - \\frac{1}{6} & \\frac{1}{12}\\end{matrix}\\right]$$"
"$\\displaystyle \\left[\\begin{matrix}\\frac{1}{12} & - \\frac{1}{6} & \\frac{1}{12}\\\\\\frac{5}{6} & - \\frac{5}{3} & \\frac{5}{6}\\\\\\frac{1}{12} & - \\frac{1}{6} & \\frac{1}{12}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1/12 -1/6 1/12⎤\n",
......@@ -141,7 +141,7 @@
}
],
"source": [
"isotropic_2d_00_res.as_matrix()"
"isotropic_2d_00_res.as_array()"
]
},
{
......@@ -151,12 +151,14 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAKQAAACaCAYAAAAnxeOcAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAAE+FJREFUeJztnXtwXNV5wH9nd7UPrWTJ8soWsh6uATPBIQ/KKzEloSngdcOAE9M0E6cUApmUuJPAJI1pnLSJA2RqbEKGkjKEAs0wDiUYOoAX8iyEDEljYGyS1ji2gm1JfuhaWkkrrR6rPf1jtbZkr/Z1X+de3d+MZ6x9nPt9+n66j71nvyOklHh4qILP7gA8PGYSsGpDIqHVARcBUUBU8FYJpIBdMh4bMSM2IxAJbQHwp0AtleVXiCxwBNgt47Gs3tjMQiS0ZcB5QE2Fb53iVH6zDtHCikO2SGg3AF8HgjqGGQe+IeOxp42JyjhEQvs08BUqL0wpeoCbZTz2jsHj6kIktBBwP3ClzqEOAjfJeKwn/4Dph2yR0JqBb6JPRoAQsFkktJj+qIxDJLR2YBPGywiwFNhswrh6+TT6ZQToBP5p5gNWnEP+mYHb8QOrDBrLKK4wefyLREKrNXkblfIhA8daJRKaP/+DFUI2GDxeo8Hj6cXo/E7HB9SbvI1KMTLnALnrCsAaIfWe4Js9nhNQLWfT4rH/Y5/hAR+f/3AHazvOZf9uveeZzsKtuevIy34hw9Esm5/s4ZKrh+0OxXLcmruOvOwXsiYITUum7A7DFtyau4687BfSw2MGnpAeSuEJ6aEUlt3LLsrGtUs5uDdMb1eQa9Yn+ejNQ3aHZBluzb3KvNQQ8tvP9JR+kUtxa+5V5uUdsj2UQo09pBu5Y3U7e1+PFHzu3Peluf8nhy2OyBHYI+Sa5hUVvX5n3z6TIjGPbS+WFq7Y78FpORtUU3uEfHLffjaubaO3K8SW5w5yznsn2PNqmIe/vphAjWThkgx3fv8INe65m1aQnX372PWzCD/ctohsVnDtLQNc+fGU3WFVhUE1teccstCtpZZlk2x5/jD3vXSYJR2TvPJsnS2xWcl4WrDjwSbu3tHNtsRhx8oIhtXUHiEL3Vpa3DZFuDY3fd3vlwgXXm9JCb1dZ5Psy00y3vNqhGA4y6Yb2vjaJ1rRev0lRlAXg2qqXtW7D9Tw5stRLr82xehwHccOdTIyVIcbvh2ZTkWR0sfIcCNSQv9xP8cOBfnWU92sXj/IY3cpNRu+JJmMn6S2iKOHOslOze3SzJqWQK2r7FTSx723tfDlB48QDEF2KsPkRIhk31kMapJowwDjo/XgrLqdJDXYhJQCgSSdqqOuIct5F6YJhuDiq0Z56oEmu0Msi6TWSGailfF0FCkFPn8G4Sv8ZbTTa1oCdfaQmUm46+az+NSXTrDs/EkAQpEx/IFJpBRksz5SySae2HKfEMLsWdrGk5kMMDkeBkBKH6nkQlZemqb7QBCZhbffCNHSMWlzlCURQnyefW+sYmy0LvfHJST1jf2IAnN2C9W0BPbtIU+/teTzw4E9YbZvXcT2rYuI35jkqk8OU7/wBIPaEqQUSCloWvJbwHnzB1ODDUh5qmoT4xGaWnxctjrF7fF2fALueOCojRGWywvAd5k5azy6YBAov6ZFsE/IQreW1tx45v3O2vphBrXFCAFSCk4cvcyK8Aynti4FUpAabEIISbShH38gw7oNSdZtSNodXgUsRspTR9ZI3RA+f+4Ev9yaFkGdQ/Zc+HySBU0akbpBWjq6ph+dEsJhl+HB8DiNzRoA4egwjbETBQ9zCiOEuAT4Df7ABC0dXQTDo9Qv7DdyG1YUNa17hPqFSZqWHCcQzHD95zZMP6qKlGMWbEP/71AnJ2UEjYs+8l8EghkWt3VTEzTivHc8/x8rCrrL0NGWr3yR3BfMQQ0pXzd5/P0yHhs0eRtFmSmjlLIZY3N+S8Zj1gkp47E/ADsMGu5pGY8dkFIeQhEpZTy2G0iYNHwG2GrS2GVRQEaAHwC9Bgw/Adw3a3sW9fbxAR+c/ldHdc2mfgW8NrP5khCig1x/GAC/lNKWxkzTnRcuBz5AqWZT27duonnpbv7ir58rMuQUcBR4ScZjfzQy1kqYQ8bccwmtAVhN9c2meoEXZTx2aNa4Tu8PqYqU5SKEkMBjUsqb7I6lGMVkNBO7z790o9Lh2y3YJSO4QEjwpDQSO2UElwgJnpRGYLeM4CIhwZNSDyrICC4TEjwpq0EVGcGFQoInZSWoJCO4VEjwpCwH1WQEFwsJnpTFUFFGcLmQ4ElZCFVlhHkgJHhSzkRlGWGeCAmelKC+jDCPhIT5LaUTZIR5JiTMTymdIiPMQyFhfknpJBlhngoJ80NKp8kI81hIcLeUTpQR5rmQ4E4pnSojeEIC7pLSyTKCJ+RJ3CCl02UET8hZOFlKN8gInpBn4EQp3SIjeEIWxElSuklG8IScEydI6TYZwROyKCpL6UYZwROyJCpK6VYZwROyLFSS0s0ygidk2aggpdtlBBs76E43aCrWpGhSxmNVrUpvFlLKQ0KITnK9hKaEELN6CYmEJoAgxZpN1YTAH/CLhBYusqmsjMcmZj7gBBlFQgsy905OAhMyHivaTMryZlMioV0L3Equa1Yp3gYelvFYsU5hlnN6gyt29q0A/gG4lFJ/5N37VxCpG2JRS6l+4v3A88C/sKb5/Sgq4/Qf1kYgDjSWePkE8Cpwt4zHCi69Z+lhRyS0VcAWypOR6ddtEQntA+ZFVTmzDt/h6BRSPg6swtgjThPwNxzc+z0UlXGazcAnKS0j5I4efw48Pn2EPAOrz4Ouo7LekEy//joTYtHFSSnf80HoOXCJKQs7jafDTE58Br9fSRlFQosA11Tx1qXARYWesFrI9irf12ZoFAYhpTzErZv/EYCeAysMlXI8Haavp4PauimeO3q+cQMbSjNQejWkwhSsqdVCVrs9tVYcm8nSswdp6cytDmGUlHkZfb4pWpcfAFRdA1GPPwVzsr/QPV0Bbr+mk7azc1eVmx7vPWMRR9UJ1GRo6ezi6MHl9BxYwdKz95W15Eeh3KMLak6T0VnorKf9QgK866I039huRBN1+6hWypm5n7lndCY66qnGB+P73ozwxavbeeirMdRuEV6cvJRQ/uE7n/v37mzheLfzZQRd9bRfyObWKR7Z1cV9Lx5mUPPzi6edvXB7JVLmc//2M30MHFvAmy9nHS+jznraL2QwLKmtyy3uveqjKbreqvaqTR3KlTIYlvj9IbQjHVx4ZZbjhwYsjNIcdNbTfiFTyVMxvPVahNblyi/RWxblSNl/LHLynPGd/0u6Ined9bT/ouaN/46wfWuMUCTL4rZJbvmGZndIhlHoQifPeDrMazvbee4RCNdOsLgt4IrcddbTfiGvuH6EK64fmfN5KaH3j21CNP+K3L33D1oXnAGcLiVAdspPX08H7//QFH95k+POGYUQFwA/5ewLfsrWRJBg6NREkFL1LIH9Qs7F5EQNqcFGRocb6PrdcnKxjkzPtlGHh3/dxJL20r/HWOshtN4OAMbTUXy+LIvbDpKZKP3ex+9pE2seUOnc+kIgSir5V/R1+/EHJqhrHKCuoaK1sQuhrpADx1qYGI8AkJ3Kn5dEgXfsCqkgzz4E1332zMfvvQ32vVn4PWe/B77ykI+jh5aXtY2f/+dvdURoHpLcESwzGSLZ1+IOIdc0r5jzuSf/cIxUsgmfT5C7ABuUUjZZFlsZiIR2G/CFM574zo9n/5z/0Hsmny0yiWln36nzzSd+/yEZj5WarmYZQoirgWcRQiBEiGBkhPrG3CcExeo5M6c5sF/InX372PWzCD/ctohsVnDtLQNc+fHUyefrGwcJRd4htzpqrV1h6mLmHZhs1k+4dpix0XrufQH+7c4x/AGJzy/Z+PARmpc64bZpF7CXWGuCls5P4A+cirlUPUtgv5DjacGOB5u4e0c3wTlOk5qWDEgpb7Q2MIM4/XZg9/4VCJ+kpbOL7NRyvvS9MO3n7uOFRxfwwqMN/O2mfrtDLoWUcj9woUhoy4B1s54sp55FsP9zyD2vRgiGs2y6oY2vfaIVrVfVmS2VU+zedKAmQ+vyLny+3OeUo8M+Ot81McdIzkFnPe0Xsv+4n2OHgnzrqW5Wrx/ksbtidodkCOVMlAjUZBjq7+buz0DiPxaz4v1jFkdpPDrrab+QdQ1ZzrswTTAEF181Svf+oN0h6aaSWTvnXzLKd3/axXW3wg/uWW7KzHMr0VlP+4VceWma7gNBZBbefiNES4ezb59VIuPEWG5+WqAmQ3PbEYJh42eeW43Oetp/UdPYnOWy1Sluj7fjE3DHA8p8vFExlc5n3LsrxL9vbsbng5pQltvvP0hmsrOi+ZSqobOe9gsJsG5DknUbknaHoYtqJte+5/IxvvPS7K+DZiYrn+SrGjrqaf8h2w0YOdO7mkm+LsJqITNVvk/d88rfvdZu+NcOTpcyqan6YbmeuAq6YLWQXVW+T8kZMUKIS9i+daMpXzvIS5lKwvqVx1XoulaAY0C1M3sKumB1kj+i8r3dJPC0CbHo4mSvnd//WqN1+cumbCRQk6Gx+Ztks6BIK8CZTPcfqqY2/wvsLvSEpRc1Mh7bLRLaLcCNwEpKNJsCfg88KuOxt6yIr1xmNX4aH2sWCa0V+DvgA+Tut899JTI8ADBOrnfPXGSBI8ALtHQ+BjzCHA2uFOAe4Di53j5LKN5sahj4JfCvczWdsrzZlNPR24VMCCGBx6SUN1X4vlkNrhST0jCUOgSojp0t8VToT2kFrkzKDFTozzgfpHRdQmaggox53C6lq5IxA5VkzONmKV2TiBmoKGMet0rpiiTMQGUZ87hRSscnYAZOkDGP26R0dPBm4CQZ87hJSscGbgZOlDGPW6R0ZNBm4GQZ87hBSscFbAZukDGP06V0VLBm4CYZ8zhZSscEagZulDGPU6V0RJBm4GYZ8zhRSuUDNIP5IGMep0mpdHBmMJ9kzOMkKZUNzAzmo4x5nCKlkkGZwXyWMY8TpFQuIDPwZDyF6lIqFYwZeDKeicpSKhOIGXgyzo2qUioRhBl4MpZGRSltD8AMPBnLRzUpXSekJ2PlqCSlq4T0ZKweVaR0jZCejPpRQUpXCOnJaBx2S+l4IT0ZjcdOKS1pNiUSWgi4DlgFVLTC/DQp4FfAs9Mt4HLjKiKjSGgR4Hpy3c+iRV/80hM3s6jlD1z0kV8WeZUEeoEXZDz2G8MCrZBiDa5EQusEPgacR/EudoXIAj3A8zIe2zVrmxYJ+QhwuQFDvSLjsVtBKRn9wOPAxWW9oXv/CiJ1QyxqKbcZ/FdlPPajauPTSyEpRUI7B9gOLNA5vAS+LOOx5/IPmL4rFgntvRgjI8AVIqG9WxUZp7mYcmWsjttMHLskcxy+16NfRsj10fzczAesODe4wNDRXv/5WtSREeDdJo+/VCQ0W1fAPV1KpDSypudMn/IA1gipf2WuZF+Mvp42xkYjvPzMN1FHRjAiPzW2UZRZUv7Pjz/GeDrEkXf+hIkxIxaWP3kOqv5VdnbKx8jQQibGImi97fj9owrJWD7pkVr6eltz/08t4MSRs8hmHbUIzSwp+3o6mcrUMDRg6N7bfiGHB3x8/sMdrO04l/27z9wTpIZy5ypS5ooXqT8shDDir9JaJsdDjI+e+oQhPVLPUH+gaO5q0oQQp9pJj4/WMZWZveJrqZoWwX4hw9Esm5/s4ZKrh894TkpIJZtOyiiEJJ1qQ5UVyCohumCIXH/xHKHICNEFk3Pmri4rAWblkhpsmPWKYjUtgf1C1gShaUnhBXjGRqJkpwIIIQnUTNDYfJTP3f0FKWW1a6PYhz8wRTA8CuSKWdc4UDR3RZFSPsEFq35OdMEAQmSRwMhg06wVx3TkpfaeRogs4doU9Qv7CUXya0k7qoCzqG/sZzwdRfiyhGtH7Q6naiLRMSJRjQWLTjA6XM/YSB1Sill7zSpRW8hwNE04mrY7DMMI1abxBzLU1icduajm6fh8krqGIeoahowaUm0h3YYQcNayapfXmxeoIeTGtUs5uDdMb1eQa9Yn+ejNhv3FKY9bc68yLzWE/PYzPXaHYBtuzb3KvOy/yvbwmIEae0g3csfqdva+Hin43LnvS3P/Tw5bHJEjsEfINc0rKnr9zr59JkViHtteLC1csd+D03I2qKb2CPnkvv1sXNtGb1eILc8d5Jz3TrDn1TAPf30xgRrJwiUZ7vz+EWqccjetSnb27WPXzyL8cNsislnBtbcMcOXHU3aHVRUG1dSec8hCt5Zalk2y5fnD3PfSYZZ0TPLKs9XMLHcW42nBjgebuHtHN9sShx0rIxhWU3v2kIVuLS1uO/Wz3y+xv4mC+ex5NUIwnGXTDW2EIlm+cN8xYq3OvBNlUE3Vq3r3gRrefDnK5dc6d29RLv3H/Rw7FORbT3Wzev0gj90VszskU6igpmoJmUr6uPe2Fr784BGCzpthVjF1DVnOuzBNMAQXXzVK9373nTRXWFN1hMxMwl03n8WnvnSCZedP2h2OJay8NE33gSAyC2+/EaKlw115V1FT+z6HPP3Wks8PB/aE2b51Edu3LiJ+Y5KrPumkeYKV09ic5bLVKW6Pt+MTcMcD5X4TUU0MqKl9Qha6tbTmRnfcx62EdRuSrNuQtDsMQzCgplYcsrOlX2LreHox/4vt6uVsdDwnf4dWCHlC8fH0YnY8GUC1I4eROaeBk5OVrRDyZWDcoLHGgWItSOzgF5g7i/0VGY+NlX6ZpfzEwLF+IeOxk78/04WU8dgQ8PfAcZ1DHQM2TI+nDDIe6wO+CGgmDL8L2GTCuHp5EngCmCj1wiJI4DXgn2c+aElvHwCR0ARwDtU3m9ov4zFrgq0CkdB85PIr3myqPLLAURmPHTNgLNMQCa0OWEZ1zaZ6p/+YZ49plZAeHuWgzgfjHh54Qnoohiekh1J4Qnooxf8DQobOZydRBWoAAAAASUVORK5CYII=\n",
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f06c885ccf8>"
"<Figure size 144x144 with 1 Axes>"
]
},
"metadata": {},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
......@@ -171,48 +173,8 @@
"metadata": {},
"outputs": [],
"source": [
"expected_result = sp.Matrix([[1, -2, 1], [10, -20, 10], [1, -2, 1]]) / 12\n",
"assert expected_result == isotropic_2d_00_res.as_matrix()"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"sympy.matrices.dense.MutableDenseMatrix"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(isotropic_2d_00_res.as_matrix())"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"sympy.matrices.dense.MutableDenseMatrix"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"type(expected_result)"
"expected_result = sp.Array([[1, -2, 1], [10, -20, 10], [1, -2, 1]]) / 12\n",
"assert expected_result == isotropic_2d_00_res.as_array()"
]
},
{
......@@ -224,14 +186,14 @@
},
{
"cell_type": "code",
"execution_count": 11,
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAHoAAABNCAMAAABe+IDDAAAAVFBMVEX///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwjqETAAAAG3RSTlMAMquZdlQiEEDpMES73Ylmze/h0WzfvadcyfFyvev/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAADhklEQVRoBe2a2XqlIBCE8YCajHuSWX3/9xyWg9LlQvfEzPLN8cKNpn5B0AJVKl2KNj3K7fe61XUuaE0/Ey+07tbI7F5fKXUbs2H3gB3xYvbLzUc0EnRn0cVsV8wlineB6DJrY5fyF9CNUtVsV8wlogfHu81w3TGVKaZUOfNvNhEv343uDPsq1bXoXvPJ16IHCflSdNMr1RTscp9XeCnpXMVYlmXLb2ZEHJpZpbv5xm83k++f3EKDOKC5KlfEPdBKhUerXfMqVBaO0X9Thfe9GXhldlG90Td+31JEHEs9Nqqa2Ghtr1LzvQUVB7SxL+2a36+1fZgNzIahFIgDegovbXaxbSC/1CAO6Lk0RmK2bB1N7Ec4iFN0NbvXgeQpbkb27UFxiq692RE4HkmFozhFq4AW9C7nzbjtA8QBPToqu9T+Plcz90pBHNDNi27bV3YDd2Z4mJ5Czza9sS3lZAFxQPdvuv/MRxeW9uVrGDUMllsGL3+AB3FASz29h4Qu0Tk7fmqMQRzRQk+/ouvZ9W94avjkZeUuLhkwANqFSTy9l/WlDuOfLtfkEvEdtMTTp2j3BsvmTQK2aJGnT9Fu1Ddlnm2p+AYt8/QrOtzrzCOBiCNa6OlXtMq3cEXFAS319B4djL2xQ6Dzfg3igJZ5eg9ejL3p0zvp0+gKxAFNYz/26N9B12OysO3Jfu25Uj89f7onokvfz0POLlniDklND2JAtJFvzzCXkgZ/7D7ea6GnjxfHy0ajAC309JHMywZRiBZ5+khWvKEARAHaifE9/YLmZ0vEt2iBp0/RvGxp1AYt8PQpmZeNRG3Qf7LCBZ4+LTYzWzJgoKUWevqI5mXDKIpWXVW0w8SfJ7h/BQhDgVw2EAf0t9fvP278qfX4FcANBfLZQBzQwiEumPp4Aw63ZPz8TjQ19YfImHAh2kkmpj4SDrcXoxNTf4iMCdeiM1YwQsP2UjQx9ZSzc3Qlmpr6HRg9dY4mE/U04/YITP02AM4Qcehci5+HPAeHYOoPouJpEAd0jPod2wf68RWA2c6oqc9menwFsK88Mtw7nXLbr8/E1O8HLGdBHNAwUb/kOt5JTf1xlE8BcYrGifqMlk0mpv48HMUpGifqz7VCKrvCUZyi/6+vAH6aw02jN3ZCv2T/XmNHDO4rQM76x9u2ii+/xNTuBxVj3FS6KnUv+M7Fs/4RvYr7X2KMUT8Bqn5A97SBuwoAAAAASUVORK5CYII=\n",
"image/png": "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\n",
"text/latex": [
"$$\\left[\\begin{matrix}\\frac{1}{6} & \\frac{2}{3} & \\frac{1}{6}\\\\\\frac{2}{3} & - \\frac{10}{3} & \\frac{2}{3}\\\\\\frac{1}{6} & \\frac{2}{3} & \\frac{1}{6}\\end{matrix}\\right]$$"
"$\\displaystyle \\left[\\begin{matrix}\\frac{1}{6} & \\frac{2}{3} & \\frac{1}{6}\\\\\\frac{2}{3} & - \\frac{10}{3} & \\frac{2}{3}\\\\\\frac{1}{6} & \\frac{2}{3} & \\frac{1}{6}\\end{matrix}\\right]$"
],
"text/plain": [
"⎡1/6 2/3 1/6⎤\n",
......@@ -241,7 +203,7 @@
"⎣1/6 2/3 1/6⎦"
]
},
"execution_count": 11,
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
......@@ -249,17 +211,17 @@
"source": [
"isotropic_2d_11 = FiniteDifferenceStencilDerivation((1,1), stencil)\n",
"isotropic_2d_11_res = isotropic_2d_11.get_stencil(isotropic=True)\n",
"iso_laplacian = isotropic_2d_00_res.as_matrix() + isotropic_2d_11_res.as_matrix()\n",
"iso_laplacian = isotropic_2d_00_res.as_array() + isotropic_2d_11_res.as_array()\n",
"iso_laplacian"
]
},
{
"cell_type": "code",
"execution_count": 12,
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"expected_result = sp.Matrix([[1, 4, 1], [4, -20, 4], [1, 4, 1]]) / 6\n",
"expected_result = sp.Array([[1, 4, 1], [4, -20, 4], [1, 4, 1]]) / 6\n",
"assert iso_laplacian == expected_result"
]
},
......@@ -272,7 +234,7 @@
},
{
"cell_type": "code",
"execution_count": 13,
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
......@@ -313,7 +275,7 @@
},
{
"cell_type": "code",
"execution_count": 14,
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
......@@ -343,17 +305,19 @@
},
{
"cell_type": "code",
"execution_count": 15,
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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iABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMVEBIBiIgJAMREBoJiIAFBMRAAoJiIAFBMRAIqJCADFRASAYiICQDERAaCYiABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMVEBIBiIgJAMREBoJiIAFBMRAAoJiIAFBMRAIqJCADFRASAYiICQDERAaCYiABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMVEBIBiIgJAMREBoJiIAFBMRAAoJiIAFBMRAIqJCADFRASAYiICQDERAaCYiABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMVEBIBiIgJAMREBoJiIAFBMRAAoJiIAFBMRAIqJCADFRASAYiICQDERAaCYiABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMVEBIBiIgJAMREBoJiIAFBMRAAoJiIAFBMRAIqJCADFRASAYiICQDERAaCYiABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMVEBIBiIgJAMREBoJiIAFBMRAAoJiIAFBMRAIqJCADFRASAYiICQDERAaCYiABQTEQAKCYiABQTEQCKiQgAxUQEgGIiAkAxEQGgmIgAUExEACgmIgAUExEAiokIAMX+P2nvVhY2t2ylAAAAAElFTkSuQmCC\n",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAWwAAAFmCAYAAABJBKDfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAS20lEQVR4nO3da3Bc5X3H8d8jW5ItW7JsycT3G5bSGAYYoGQmAZtbKALiwZca2uLiCTATIC2QdkKCmwFaUwghdQIFkmmJS6GUYqCZhGFpS6Eww5QZsAtOWzARYOqYDLCSdbNulvbpi7VkXVbalbR7zvmf/X5mmNGuzu7zvDj+cvY556yc914AgOgrCXsCAIDcTA97Aig+LpFcJWmFCrf/eUldkvb6htrOAo2BIuYSyUWSfkv524e9pCZJb/uG2v4xx2VJBEFxiWSlpIcl/XZAQ/ZIuts31P5jQOMh5lwiWSrpB5J+p0BDJCXd6Btq38r0S5ZEEKSbFVysJalc0h0ukVwW4JiIt6tUuFhLUq2knS6RdJl+SbARpHNDGnddSOMifs4NYIxFkuoz/YJgI0jVRTYu4ieofSnjOAQbQcr4MS/G4yJ+gtqXWBJBxDW+XaZvrV+iLatP1CXzM34kHGb/nnJdf85yXb6kTtefs1z795QHMEtguN0PVOuGtcu1flGd7r52wbjbPvlXc3Xl50/UxuWrdc91C9TbPaH/ARBsRMf0Uq+zv9quG+/9JOu2vT3Sjm2LtW5Dm55qbNR5m1u1Y9ti9fYEMFFgiJqFfdpyU5PWbWwbd7v/fL5CP/vJPO3YfVC79n6gTw+W6pE7ayYyFMFGdKxYc1Trr2vVypOyV3fvSxXq75euuPmwymZ4bbmpRd5Lb75YEcBMgePO39yhczd1qHLumNdPS5JefHKOztvcqtWn9GpOTUpXfrNJrzw7ZyJDEWzYdOCdci2t75Ebsgsvre/RgXdYFkE0/bqxTKtOPn4wUndaj9qap6nls5w7TLBhU9eRElVUpoY9V1GZUlcH+zSiqbuzRLOqjh+Fz65O/3yknWDDgBceq9SGZXXasKxOt16+eEKvnTlrdJy7Oko0c3ZqjFcA4ZpRkdKR9mmDj4+0pvffWZU577N8lwjCc/HWdl28tX1Sr13xhR794pG58ikNLoscfK9cl33tcB5nCOTPktW9+uC/yyWl9/lfvTVDVfP6VT0/52BzhI3o8Cmpp8vpaG/6UqeeLjfmZU+nn9+pkhLpqfur1dvttPuB9I0GZ17Ilz0hWH1H0/tqql9K9ad/7js6ersLrmjVy7vn6P1flqmtuURP7pyndRtbJzIUR9iIjo8PTNd1X1w1+HjDsjrVLOzTY/s+kCTdevlirTmrS1ff1qyycmn7rkP60S0L9MR987VoZa+27zqkMs45ImCP3lWjZx48fnnea89VadONTbpkW6tuWLtSD736oRau6NOXLu3UR+82a/vmpertdjrrog5dc3vTRIbi2/oQGJdI7pU0K4ShH/QNtfeHMC5ixiWSP5f0+QCGuto31L4+8kmWRADACIKNII1/Y0Hh9IU0LuInqH0p4zgEG0H6VUjjNoY0LuIniH2pX9KHmX5BsBGkx0MY8/8kvRrCuIinf1Lhj7Kf9w21GU9GctIRgXKJ5FckbZG0UtK0LJtPxRFJr0v6G99Qm/3LpIAcuUTyLElblT75WJqnt/WSmiX9u6S/9Q21Ga4LJNgAYAZLIgBgBMFG5DnnHnfOeefcmrDnAoSJYCPSnHNVkjYqfeb8GyFPBwgVwUbU/YGklNInKLc652aGPB8gNAQbkeWcc5L+RMNvZ98U0nRQZJxzpc65jc652WHPZQDBRpSdIWnoHzWdLelPQ5oLioRz7gTn3B2SPpX0jKSvhDuj4/i2PkTZzZJGLoHUO+fWeO//N4wJIb6cc2dI+raky449NUPSYUnPhTapETjCRiQNOdk4ch8tlfRHwc8IcXRs2eNK59w+pe+I3ah0qGdI6pb0Q+99xptYwsCNM4gk59zXJd2nzF/HekTSfO99V7CzQlw4506QdIOkm5Reaci0Tt0taZn3/rMg5zYejrAROWOcbBzKi5OPmATn3BnOud2SPpJ0q6RqZY51StLPoxRriSNsRJBz7kxJ/6Hx/9jB297704KZEaxzzm2SdLukE5Ve7sh2sNopaa33fk+h5zYRBBuR45x7XNLvafx/VF2SzuTkI7I59omtWemj6Vzt896fWqApTRpLIoiUcU42jsTJR+TEp49KL5LUkeNL2iX9ZeFmNHkEG1Hz+0qvH2YzXdz5iBx579+QdL5yi3afpGcLO6PJIdiIjBxONmayuUDTQczkGO3IXco3FMFGlJRJqlT6CGfofwNGPl8uqS7gOcKwY9F+IctmDwcxl8ngTkdEhve+R8NvRZckOedulrTTe5+vv+6BIuWc+wulP5U9LeliDb+kL5KX8g3FETaAonAs1n8maYf3/nc1enmkW9K9YcwtVwQbQOyNiPV3pYxr2o1Ru+56JIININYyxXrAkGi3SLozhOlNCGvYAGJrvFgP8N6/4Zyb5w3cRcgRNoBYyiXWAyzEWiLYAGJoIrG2hGADiJW4xloi2ABiJM6xlgg2gJiIe6wlgg0gBooh1hLBBmBcscRaItgADCumWEsEG4BRxRZriWADMKgYYy0RbADGFGusJYINwJBijrVEsAEYUeyxlgg2AAOIdRrBBhBpxPo4gg0gsoj1cAQbQCQR69EINoDIIdaZEWwAkUKsx0awAUQGsR4fwQYQCcQ6O4INIHTEOjcEG0CoiHXuCDaA0BDriSHYAEJBrCeOYAMIHLGeHIINIFDEevIINoDAEOupIdgAAkGsp45gAyg4Yp0fBBtAQRHr/CHYAAqGWOcXwQZQEMQ6/wg2gLwj1oVBsAHkFbEuHIINIG+IdWERbAB5QawLj2ADmDJiHQyCDWBKiHVwCDaASSPWwSLYACaFWAePYAOYMGIdDoINYEKIdXgINoCcEetwEWwAOSHW4SPYALIi1tFAsAGMi1hHB8EGMCZiHS0EG0BGxDp6CDaAUYh1NBFsAMMQ6+gi2AAGEetoI9gAJBFrCwg2AGJtBMEGihyxtoNgA0WMWNtCsIEiRaztIdhAESLWNhFsoMgQa7sINlBEiLVtBBsoEsTaPoINFAFiHQ8EG4g5Yh0fBBuIMWIdLwQbiCliHT8EG4ghYh1PBBuIGWIdXwQbiBFiHW8EG4gJYh1/BBuIAWJdHAg2YByxLh4EGzCMWBcXgg0YRayLD8EGDCLWxYlgA8YQ6+JFsAFDiHVxI9iAEcQaBBswgFhDIthA5BFrDCDYQIQRawxFsIGIItYYiWADEUSskQnBBiKGWGMsBBuIEGKN8RBsICKINbIh2EAEEGvkgmADISPWyBXBBkJErDERBBsICbHGRBFsIATEGpNBsIGAEWtMFsEGAkSsMRUEGwgIscZUEWwgAMQa+UCwgQIj1sgXgg0UELFGPhFsoECINfKNYAMFQKxRCAQbyDNijUIh2EAeEWsUEsEG8oRYo9AINpAHxBpBINjAFBFrBIVgA1NArBEkgg1MErFG0Ag2MAnEGmEg2MAEEWuEhWADE0CsESaCDeSIWCNsBBvIAbFGFBBsIAtijagg2MA4iDWihGADYyDWiBqCDWRArBFFBBsYgVgjqgg2MASxRpQRbOAYYo2oI9iAiDVsINgoesQaVhBsFDViDUsINooWsYY1BBtFiVjDIoKNokOsYRXBRlEh1rCMYKNoEGtYR7BRFIg14oBgI/aINeKCYCPWiDXihGAjtog14oZgI5aINeKIYCN2iDXiimAjVog14mx62BNA8XKJ5CpJJ0kqG3fDq287RY375BLJTeNu9+hdV+rUszfrg/+5x7c1E2vklUskSySdJmmZpGkFGsZLOiLpdd9Q2zpqDt77Ao0LZOYSyVJJP5R0YU4vaGueq7bm+Vqy+r0xt2lJ1qijpUazq5tUXXtI0i2+ofalvEwYRc8lkgsk/Z2klQEN2S9ph2+ofWLokyyJIAyblWusczE81k2SZkj6vkskxz9yB3J3q4KLtZQ+gv+uSyRPGPokwUYY1ubtnUbHesBspT++AvlwTghjlkg6e+QTQNAq8/IuY8d6QFVexkHsOOf+3Dn3h865mTm+JD/77MQN24cJNsLgpvwO2WOdn3EQV9+R9KCkz5xzP3bOnTTWhi6RDHM/GjY2wUY07H6gWjesXa71i+p097ULxt32sXsW6+tfrtEfX+D14++UqrebMGMyZkuaJekaSW845952zm2dwFH3cY1vl+lb65doy+oTdcn8+qzb799TruvPWa7Ll9Tp+nOWa/+e8lyGIdiIhpqFfdpyU5PWbWwbd7uXn16g5346S7f9tEW79r6vTw+W6pE7awKaJeJpuqSZkk6R9JDSR90PO+fW5P4OpV5nf7VdN977SdZte3ukHdsWa92GNj3V2KjzNrdqx7bF6u3J+lKCjWg4f3OHzt3Uocq5/WNu05Ks0SvPVmnthi6d8uVPNacmpSu/2aRXnp0T4EwRbwNH3ddKetM595Yu/dxVSqXG/xS3Ys1Rrb+uVStPyl7dvS9VqL9fuuLmwyqb4bXlphZ5L735YkW2lxJs2NHRUqOPP+xX/Wktg8/VndajtuZpavmMfRn5NHDUfap86iH95sPVav7kc+rtmfqlogfeKdfS+h65Ibvs0voeHXgn67IIdzrClu6uaervW6hfNy6UJPX1pZ8/8O5qjbwx7OFv/6u75JWAJ4gYmi3vpc72OepsnzPuDVy56DpSoorK1LDnKipT6urIetBBsBF9lXMPD/48Y+Zcpfo7VTUv/dGzrdlJqlXtwqSq5g2/bXfVyU/rv16Z2j8uxNXOCW3tXHrfmjGrXZL0wmOV+sn29Mnx+tM79b2fHcr5vWbOGh3nro4SzZydGuMVgwg2os85qWpeOtpL62boYGPf4OP9eypUNa9fS1Y3j3rdNXf8s3/6r/8t0LnCBOfc95W9f/2SuiX3G1XVVGpWZZtKpqXDffHWdl28tX1Sg6/4Qo9+8chc+ZQGl0UOvleuy752ePwXsoaNqOg7KvV0OaX6pVR/+ue+o6O3u+CKVr28e47e/2WZ2ppL9OTOeVq3cdSX5ABTcERSl6QnJK3T85/Wq7K6dTDWmfhUep892ps+OdnT5ca83PT08ztVUiI9dX+1eruddj9QLUk688LObBPjCBvR8OhdNXrmweOX5732XJU23dikS7a16oa1K/XQqx9q4Yo+fenSTn30brO2b16q3m6nsy7q0DW3j3XjDJCrY0fT+ljSDyQ94b1vl3K8cebjA9N13RdXDT7esKxONQv79Ni+DyRJt16+WGvO6tLVtzWrrFzavuuQfnTLAj1x33wtWtmr7bsOqSz7pdh8Wx8C5xLJf5B0ZgBDfcM31LIkglGcc0eVPmA9ovRKw25J93vv94zaNh3sd4Od4aB7fEPtroEHHGEDKEZNkto04mg66gg2wtAX0DgZFsEBSdJy7332m1wk+YZa7xLJfhXujxaMZ9g+zElHhCGoj5dc0oeMco31EPsLMpEJjkuwEYanJHUUeIx/8Q21Hxd4DBSPXdk3ybt9koatqXPSEaFwiWS9pKsknSypNE9v6yW1SHpZ0uO+oZYlEeSNSyTPlbRRhf+bjh2SXpP0976hdtjaOsEGACNYEgEAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIwg2ABgBMEGACMINgAYQbABwAiCDQBGEGwAMIJgA4ARBBsAjCDYAGAEwQYAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIwg2ABgBMEGACMINgAYQbABwAiCDQBGEGwAMIJgA4ARBBsAjCDYAGAEwQYAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIwg2ABgBMEGACMINgAYQbABwAiCDQBGEGwAMIJgA4ARBBsAjCDYAGAEwQYAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIwg2ABgBMEGACMINgAYQbABwAiCDQBGEGwAMIJgA4ARBBsAjCDYAGAEwQYAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIwg2ABgBMEGACMINgAYQbABwAiCDQBGEGwAMIJgA4ARBBsAjCDYAGAEwQYAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIwg2ABgBMEGACMINgAYQbABwAiCDQBGEGwAMIJgA4ARBBsAjCDYAGAEwQYAIwg2ABhBsAHACIINAEYQbAAwgmADgBEEGwCMINgAYATBBgAjCDYAGEGwAcAIgg0ARhBsADCCYAOAEQQbAIz4fxjyRMz2Xz2bAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f06c669c898>"
"<Figure size 1152x432 with 1 Axes>"
]
},
"metadata": {},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
......@@ -365,8 +329,12 @@
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"execution_count": 14,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [],
"source": [
"v3 = ps.fields(\"v(3): [3D]\")\n",
......@@ -374,13 +342,6 @@
" assert FiniteDifferenceStaggeredStencilDerivation(\"E\", 3, (0,)).apply(v3.center_vector[i]) == \\\n",
" v3[1,0,0](i) - v3[0,0,0](i)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
......@@ -399,7 +360,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
"version": "3.7.4"
}
},
"nbformat": 4,
......
......@@ -11,8 +11,11 @@ def test_sympy_optimizations():
x, y, z = pystencils.fields('x, y, z: float32[2d]')
# Triggers Sympy's expm1 optimization
# Sympy's expm1 optimization is tedious to use and the behaviour is highly depended on the sympy version. In
# some cases the exp expression has to be encapsulated in brackets or multiplied with 1 or 1.0
# for sympy to work properly ...
assignments = pystencils.AssignmentCollection({
x[0, 0]: sp.exp(y[0, 0]) - 1
x[0, 0]: 1.0 * (sp.exp(y[0, 0]) - 1)
})
assignments = optimize_assignments(assignments, optims_pystencils_cpu)
......@@ -28,7 +31,7 @@ def test_evaluate_constant_terms():
for target in ('cpu', 'gpu'):
x, y, z = pystencils.fields('x, y, z: float32[2d]')
# Triggers Sympy's expm1 optimization
# Triggers Sympy's cos optimization
assignments = pystencils.AssignmentCollection({
x[0, 0]: -sp.cos(1) + y[0, 0]
})
......@@ -53,8 +56,6 @@ def test_do_not_evaluate_constant_terms():
x[0, 0]: -sp.cos(1) + y[0, 0]
})
optimize_assignments(assignments, optimizations)
ast = pystencils.create_kernel(assignments, target=target)
code = pystencils.get_code_str(ast)
assert 'cos(' in code
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment