diff --git a/contrib/translations/PDE-reduction and translations.ipynb b/contrib/translations/PDE-reduction and translations.ipynb index 043f61c4a93999533df35269f69685d76d93a3d8..b3771a1e735ac7a0881fd4f9412debf257caa947 100644 --- a/contrib/translations/PDE-reduction and translations.ipynb +++ b/contrib/translations/PDE-reduction and translations.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 53, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ @@ -42,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -56,20 +56,20 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([ 5.00000000e+01, 2.49673488e+00, 1.47014861e-01,\n", - " 2.60554926e+00, -9.96815120e-01, 2.40178914e+00,\n", - " 5.42629997e-02, 3.38317711e-03, 2.93648067e-01,\n", - " -5.10921327e-03, 3.78790947e-02, -2.80879544e-02,\n", - " 1.38914975e-01, -2.60301325e-02, 3.05226127e-02])" + "array([ 5.00000000e+01, -6.69626794e-01, -2.33234202e+00,\n", + " 2.68444605e+00, -8.96436375e-01, 1.81021063e+00,\n", + " -3.27003166e-02, -2.03802375e-01, -5.63064621e-03,\n", + " -6.23905999e-02, 3.71388362e-02, -1.37580839e-02,\n", + " 1.05569439e-01, -1.39756658e-02, 1.91970436e-02])" ] }, - "execution_count": 55, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -80,7 +80,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -115,7 +115,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -135,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -144,7 +144,7 @@ "7.3852783309125538e-16" ] }, - "execution_count": 64, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ @@ -166,101 +166,105 @@ " for j in range(n):\n", " unit_coeffs = np.zeros(n)\n", " unit_coeffs[j] = 1\n", - " unit_mexp = type(mexp)(\n", - " mexp.toy_ctx, mexp.center, mexp.rscale, mexp.order,\n", - " unit_coeffs, derived_from=mexp)\n", + " unit_mexp = mexp.with_coeffs(unit_coeffs)\n", " \n", " result[:, j] = t.multipole_expand(unit_mexp, to_center).coeffs\n", " \n", " return result\n", "\n", - "tmat = build_translation_mat(mexp, np.array([0, 0.5]))" + "new_center = np.array([0, 0.5])\n", + "tmat = build_translation_mat(mexp, new_center)" ] }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[ 1. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 1. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0.5 , 0. , 1. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0. , 0. , 1. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0.5 , 0. , 0. , 1. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0.125 , 0. , 0.5 , 0. , 0. ,\n", - " 1. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 1. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0. , 0. , 0.5 , 0. ,\n", - " 0. , 0. , 1. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0.125 , 0. , 0. , 0.5 ,\n", - " 0. , 0. , 0. , 1. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0.02083333, 0. , 0.125 , 0. , 0. ,\n", - " 0.5 , 0. , 0. , 0. , 1. ,\n", - " 0. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0. , 0. , 0. , 0. ,\n", - " 1. , 0. , 0. , 0. , 0. ],\n", - " [ 0. , 0. , 0. , 0. , 0. ,\n", - " 0. , 0.5 , 0. , 0. , 0. ,\n", - " 0. , 1. , 0. , 0. , 0. ],\n", - " [ 0. , 0. , 0. , 0.125 , 0. ,\n", - " 0. , 0. , 0.5 , 0. , 0. ,\n", - " 0. , 0. , 1. , 0. , 0. ],\n", - " [ 0. , 0.02083333, 0. , 0. , 0.125 ,\n", - " 0. , 0. , 0. , 0.5 , 0. ,\n", - " 0. , 0. , 0. , 1. , 0. ],\n", - " [ 0.00260417, 0. , 0.02083333, 0. , 0. ,\n", - " 0.125 , 0. , 0. , 0. , 0.5 ,\n", - " 0. , 0. , 0. , 0. , 1. ]])" + "<matplotlib.image.AxesImage at 0x7fb83bb70f28>" ] }, - "execution_count": 62, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAP8AAAD8CAYAAAC4nHJkAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4xLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvAOZPmwAADcBJREFUeJzt3X+s3XV9x/Hn29tS1gLSgijQZoVJ\nmoBZBmmw6uLMOn6OUP/wj5K5dWJCzOIGxkVLSGayv+ZcdFtmZhpwYxkBM4TZGBg0VbMsWaultoVa\naCtjUFspk4UKxpay9/4430su13N/fX/dc/08H8nN+fX59vvu99zX/Z7zPd/PeUdmIqk8b5vvAiTN\nD8MvFcrwS4Uy/FKhDL9UKMMvFcrwS4Uy/FKhDL9UqEV9ruz8FWO5etXiOS93cN/SDqqRfvn8nNc4\nlSdjNmN7Df/qVYv57mOr5rzcdRf9RgfVSL98dub2WY/1Zb9UKMMvFapR+CPi+oh4JiIOR8TmtoqS\n1L3a4Y+IMeDLwA3A5cAtEXF5W4VJ6laTPf/VwOHMfDYzTwEPABvaKUtS15qE/2LghQm3j1T3SVoA\nmoR/2GeJv/C1QBFxW0TsiohdL/3kjQark9SmJuE/Akz80H4lcHTyoMzckplrM3PtO84ba7A6SW1q\nEv7vAZdFxCURcQawEdjaTlmSulb7DL/MPB0RnwQeA8aAr2bm/tYqk9SpRqf3ZuYjwCMt1SKpR57h\nJxXK8EuF6nVW38F9S2vN0Hvs6J7a63RGoDSce36pUIZfKpThlwpl+KVCGX6pUIZfKpThlwpl+KVC\nGX6pUIZfKpThlwpl+KVCGX6pUL3O6ju5ahmHP71uzstdd1H9dTojUBrOPb9UKMMvFcrwS4Vq0qtv\nVUR8OyIORMT+iLi9zcIkdavJAb/TwKczc3dEnA08ERHbMvMHLdUmqUO19/yZeSwzd1fXfwocwF59\n0oLRynv+iFgNXAnsbOPfk9S9xuGPiLOArwN3ZOaJIY+/2ajzjVdfa7o6SS1pFP6IWMwg+Pdl5kPD\nxkxs1Dl21rImq5PUoiZH+wO4BziQmV9sryRJfWiy5/8A8PvAb0fEnurnxpbqktSxJl16/wOIFmuR\n1CPP8JMKZfilQkVm9rayc2JFvjfW97a+pupOB3YqsObLztzOiXx5Vm/H3fNLhTL8UqEMv1Qowy8V\nyvBLhTL8UqEMv1Qowy8VyvBLhTL8UqEMv1Qowy8VyvBLheq1UWddh7809+ae4979qR21l607O8/m\noFoI3PNLhTL8UqEMv1SoNpp2jEXE9yPim20UJKkfbez5b2fQp0/SAtK0Y89K4HeBu9spR1Jfmu75\n/xr4DPB/LdQiqUdN2nXdBBzPzCdmGPdmo87XOVl3dZJa1rRd180R8RzwAIO2Xf88edDERp2LWdJg\ndZLaVDv8mXlnZq7MzNXARuBbmfnR1iqT1Ck/55cK1cq5/Zn5HeA7bfxbkvrhnl8qlOGXCtXrlN44\ncwlj714z5+WaTMudj+nATabl2hxUfXHPLxXK8EuFMvxSoQy/VCjDLxXK8EuFMvxSoQy/VCjDLxXK\n8EuFMvxSoQy/VCjDLxUqMrO3lZ0TK/K9sb639ZXE5qAC2JnbOZEvx2zGuueXCmX4pUIZfqlQTdt1\nnRsRD0bE0xFxICLe11ZhkrrV9Gu8/gb4t8z8SEScASxtoSZJPagd/og4B/gg8IcAmXkKONVOWZK6\n1uRl/6XAS8A/RMT3I+LuiFjWUl2SOtYk/IuAq4C/z8wrgdeAzZMH2ahTGk1Nwn8EOJKZO6vbDzL4\nY/AWNuqURlOTRp0/Bl6IiPEv4l8P/KCVqiR1runR/j8G7quO9D8LfKx5SZL60Cj8mbkHWNtSLZJ6\n5Bl+UqEMv1SoXht1LjR1m3w2aSxal81BNVfu+aVCGX6pUIZfKpThlwpl+KVCGX6pUIZfKpThlwpl\n+KVCGX6pUIZfKpThlwpl+KVCLYhGnWNXrJl50BTe2P9M7WXrqjsbEOZnRmBdNgcdPTbqlDQjwy8V\nyvBLhWraqPNTEbE/Ip6KiPsj4sy2CpPUrdrhj4iLgT8B1mbme4AxYGNbhUnqVtOX/YuAX4mIRQw6\n9B5tXpKkPjTp2PMj4K+A54FjwCuZ+XhbhUnqVpOX/cuBDcAlwEXAsoj46JBxNuqURlCTl/2/A/xX\nZr6Uma8DDwHvnzzIRp3SaGoS/ueBdRGxNCKCQaPOA+2UJalrTd7z72TQlns38GT1b21pqS5JHWva\nqPNzwOdaqkVSjzzDTyqU4ZcK1e+U3redl+uW3DDn5fJk/Y8IS5kOvJCmAoPNQbvilF5JMzL8UqEM\nv1Qowy8VyvBLhTL8UqEMv1Qowy8VyvBLhTL8UqEMv1Qowy8VyvBLhVoQjTqlcTYHnZ6z+iTNyPBL\nhTL8UqFmDH9EfDUijkfEUxPuWxER2yLiUHW5vNsyJbVtNnv+fwSun3TfZmB7Zl4GbK9uS1pAZgx/\nZv478PKkuzcA91bX7wU+3HJdkjpW9z3/OzPzGEB1eUF7JUnqQ6OmHbMREbcBtwGcydKuVydpluru\n+V+MiAsBqsvjUw20Uac0muqGfyuwqbq+CfhGO+VI6stsPuq7H/hPYE1EHImIjwN/AVwTEYeAa6rb\nkhaQGd/zZ+YtUzzkSfrSAuYZflKhDL9UqM4/6lM/6jb4hIXV5LPJtFybg76Ve36pUIZfKpThlwpl\n+KVCGX6pUIZfKpThlwpl+KVCGX6pUIZfKpThlwpl+KVCGX6pUDbqnMbYFWtqLffG/mdarqRbdWcE\nLqTZgE0spOagNuqUNCPDLxXK8EuFqtuo8wsR8XRE7IuIhyPi3G7LlNS2uo06twHvycxfBw4Cd7Zc\nl6SO1WrUmZmPZ+bp6uYOYGUHtUnqUBvv+W8FHm3h35HUo0bf3hsRdwGngfumGWOjTmkE1Q5/RGwC\nbgLW5zRnCmXmFmALDE7yqbs+Se2qFf6IuB74LPBbmfmzdkuS1Ie6jTr/Djgb2BYReyLiKx3XKall\ndRt13tNBLZJ65Bl+UqEMv1SoBTGlN5Ysqb3OPHmy9rJ11Z0KDAtrOnApzUGb6Ls5qFN6Jc3I8EuF\nMvxSoQy/VCjDLxXK8EuFMvxSoQy/VCjDLxXK8EuFMvxSoQy/VCjDLxVqQczqa6KUGYELaTYg2Bx0\nJnVnA1593Qvs2vtzZ/VJmprhlwpl+KVC1WrUOeGxP42IjIjzuylPUlfqNuokIlYB1wDPt1yTpB7U\natRZ+RLwGcAuPNICVOs9f0TcDPwoM/e2XI+knsy5XVdELAXuAq6d5XgbdUojqM6e/9eAS4C9EfEc\nsBLYHRHvGjY4M7dk5trMXLuY+ifcSGrXnPf8mfkkcMH47eoPwNrM/J8W65LUsbqNOiUtcHUbdU58\nfHVr1UjqjWf4SYUy/FKhep3SGxEvAf89xcPnA6N00HDU6oHRq8l6pjcf9fxqZr5jNgN7Df90ImJX\nZq6d7zrGjVo9MHo1Wc/0Rq2eyXzZLxXK8EuFGqXwb5nvAiYZtXpg9GqynumNWj1vMTLv+SX1a5T2\n/JJ61Hv4I+L6iHgmIg5HxOYhjy+JiK9Vj++MiNUd1rIqIr4dEQciYn9E3D5kzIci4pWI2FP9/FlX\n9UxY53MR8WS1vl1DHo+I+NtqG+2LiKs6rGXNhP/7nog4ERF3TBrT6TYa9m1SEbEiIrZFxKHqcvkU\ny26qxhyKiE0d1vOFiHi6ej4ejohzp1h22ue2V5nZ2w8wBvwQuBQ4A9gLXD5pzB8BX6mubwS+1mE9\nFwJXVdfPBg4OqedDwDd73k7PAedP8/iNwKNAAOuAnT0+fz9m8Flyb9sI+CBwFfDUhPv+EthcXd8M\nfH7IciuAZ6vL5dX15R3Vcy2wqLr++WH1zOa57fOn7z3/1cDhzHw2M08BDwAbJo3ZANxbXX8QWB8R\ns/oe8rnKzGOZubu6/lPgAHBxF+tq2Qbgn3JgB3BuRFzYw3rXAz/MzKlO1OpEDv82qYm/J/cCHx6y\n6HXAtsx8OTP/F9jGkK+ka6OezHw8M09XN3cwmOo+0voO/8XACxNuH+EXw/bmmGpjvgKc13Vh1duL\nK4GdQx5+X0TsjYhHI+KKrmth8NVoj0fEE9WXoUw2m+3YhY3A/VM81vc2emdmHoPBH3EmTDOfYL62\n060MXpkNM9Nz25s5z+dvaNgefPLHDbMZ06qIOAv4OnBHZp6Y9PBuBi9zX42IG4F/BS7rsh7gA5l5\nNCIuALZFxNPV3ubNkocs0/U2OgO4GbhzyMPzsY1mYz62013AaeC+KYbM9Nz2pu89/xFg1YTbK4Gj\nU42JiEXA2xn+BaKtiIjFDIJ/X2Y+NPnxzDyRma9W1x8BFnf9VeWZebS6PA48zODt0kSz2Y5tuwHY\nnZkvTn5gPrYR8OL4W53q8viQMb1up+qA4k3A72X1Bn+yWTy3vek7/N8DLouIS6o9yUZg66QxW4Hx\no7IfAb411YZsqjqWcA9wIDO/OMWYd40fc4iIqxlss590UU+1jmURcfb4dQYHkib3TNgK/EF11H8d\n8Mr4S+AO3cIUL/n73kaVib8nm4BvDBnzGHBtRCyvPg24trqvdRFxPfBZ4ObM/NkUY2bz3Pan7yOM\nDI5UH2Rw1P+u6r4/Z7DRAM4E/gU4DHwXuLTDWn6TwcvAfcCe6udG4BPAJ6oxnwT2M/hkYgfw/o63\nz6XVuvZW6x3fRhNrCuDL1TZ8ksHXqHVZ01IGYX77hPt620YM/ugcA15nsDf/OIPjQNuBQ9Xlimrs\nWuDuCcveWv0uHQY+1mE9hxkcXxj/PRr/xOoi4JHpntv5+vEMP6lQnuEnFcrwS4Uy/FKhDL9UKMMv\nFcrwS4Uy/FKhDL9UqP8H8zJzDMuV3ZMAAAAASUVORK5CYII=\n", + "text/plain": [ + "<matplotlib.figure.Figure at 0x7fb83be18dd8>" + ] + }, + "metadata": {}, + "output_type": "display_data" } ], "source": [ - "tmat" + "plt.imshow(tmat)" ] }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<matplotlib.image.AxesImage at 0x7f981a252748>" + "(15, 9)" ] }, - "execution_count": 63, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" - }, + } + ], + "source": [ + "nullsp.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "if 1:\n", + " reduction_mat = nullsp.T\n", + " expansion_mat = nullsp" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def plot_coeffs(expn, coeffs, **kwargs):\n", + " x = [cid[0] for cid in expn.get_coefficient_identifiers()]\n", + " y = [cid[1] for cid in expn.get_coefficient_identifiers()]\n", + " plt.scatter(x, y, c=coeffs, **kwargs)\n", + " plt.colorbar()\n", + "\n", + " for cid, coeff in zip(expn.get_coefficient_identifiers(), coeffs):\n", + " plt.text(cid[0], cid[1]+0.2, \"%.1f\" % coeff)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\nuVULyvkAAAAASUVORK5CYII=\n", "text/plain": [ - "<matplotlib.figure.Figure at 0x7f981a4e8780>" + "<matplotlib.figure.Figure at 0x7fb83bb10b38>" ] }, "metadata": {}, @@ -268,7 +272,88 @@ } ], "source": [ - "plt.imshow(tmat)" + "proj_mexp = mexp.with_coeffs(expansion_mat @ reduction_mat @ mexp.coeffs)\n", + "\n", + "proj_resid = proj_mexp.coeffs - mexp.coeffs\n", + "\n", + "plot_coeffs(mpole_expn, np.log10(1e-15+np.abs(proj_resid)), vmin=-15, vmax=2)" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.24344978758e-14\n" + ] + } + ], + "source": [ + "print(t.l_inf(proj_mexp - mexp, 1.2, center=[3,0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1.06581410364e-14\n" + ] + } + ], + "source": [ + "trans_unproj = t.multipole_expand(mexp, new_center)\n", + "trans_proj = t.multipole_expand(proj_mexp, new_center)\n", + "\n", + "print(t.l_inf(trans_unproj - trans_proj, 1.2, center=[3,0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0.00000000e+00 1.11022302e-16 0.00000000e+00 -2.24732834e+00\n", + " 2.22044605e-16 -2.24732834e+00 1.91654814e-02 -9.90567683e-01\n", + " 1.91654814e-02 -9.90567683e-01 -5.35500227e-02 2.34496156e-02\n", + " -3.03526052e-01 2.34496156e-02 -2.49976029e-01]\n" + ] + } + ], + "source": [ + "print(trans_proj.coeffs - trans_unproj.coeffs)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "9.4262983793905305e-15" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "la.norm(reduction_mat @ (trans_proj.coeffs - trans_unproj.coeffs))" ] }, { diff --git a/sumpy/toys.py b/sumpy/toys.py index bf153fd060164e90ed1c764f9493bc4f1fd9fe36..5177d869e99c62ebd5035037ae00a532411d00ff 100644 --- a/sumpy/toys.py +++ b/sumpy/toys.py @@ -445,6 +445,11 @@ class ExpansionPotentialSource(PotentialSource): self.expn_style = expn_style self.text_kwargs = text_kwargs + def with_coeffs(self, coeffs): + return type(self)(self.toy_ctx, self.center, self.rscale, self.order, + coeffs, self.derived_from, radius=self.radius, + expn_style=self.expn_style, text_kwargs=self.text_kwargs) + class MultipoleExpansion(ExpansionPotentialSource): def eval(self, targets):