{ "cells": [ { "cell_type": "markdown", "id": "4fde2871-5b1c-4688-a33d-dcaa05f11be8", "metadata": {}, "source": [ "# Overview of python functions from laplace.selfinteractions" ] }, { "cell_type": "markdown", "id": "a9e0379a-bc38-4ac4-a94c-e500c04ff67f", "metadata": {}, "source": [ "Overview of python functions from `biosspheres.laplace.selfinteractions`." ] }, { "cell_type": "code", "execution_count": 1, "id": "a5e96dcb-5458-4621-837f-76026f8c6232", "metadata": {}, "outputs": [], "source": [ "import biosspheres.laplace.selfinteractions as selfinteractions" ] }, { "cell_type": "code", "execution_count": 2, "id": "5697bae2-4e3e-4125-a379-cbc08d7a9c15", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import scipy.sparse\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "id": "1ca34bb6-8bbc-42c0-98a7-db55bc11c726", "metadata": {}, "source": [ "## Preliminaries" ] }, { "cell_type": "markdown", "id": "6678dd5e-3a41-484d-9c2f-71697935f913", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Geometry" ] }, { "cell_type": "markdown", "id": "0fcaf5ee-5ff5-46ce-bc8b-41e0e148712d", "metadata": {}, "source": [ "$N$ disjoint spheres in $\\mathbb{R}^3$:\n", "- Position vectors of the sphere centers: $\\mathbf{p_j} \\in \\mathbb{R}^3$, with $j \\in \\{1,...,N\\}$. \n", "- Radii: $\\tilde{r}_j\\in \\mathbb{R}^+$, with $j \\in \\{1,...,N\\}$.\n", "- Interior of sphere $j$: $\\Omega_j:=\\{ \\mathbf{x} \\in \\mathbb{R}^3:||\\mathbf{x}-\\mathbf{p_j}||_2<\\tilde{r}_j \\}$.\n", "- Boundary of sphere $j$: $\\Gamma_j:=\\partial \\Omega_j$.\n", "- Exterior medium, $\\Omega_0$: defined as $\\mathbb{R}^3$ without the spheres and their boundaries. " ] }, { "cell_type": "markdown", "id": "d3343d4d-0051-4014-8758-24ca956a1a57", "metadata": {}, "source": [ "### Free space fundamental solution for the Laplace equation" ] }, { "cell_type": "markdown", "id": "01b2f83f-3a12-417b-be62-309257a8108a", "metadata": {}, "source": [ "The free space fundamental solution of the Laplace equation, which satisfies the radiation condition is:\n", "$$g\\left(\\mathbf{r},\\mathbf{r'}\\right):= \\frac{1}{4\\pi ||\\mathbf{r}-\\mathbf{r}'||_2}, \\quad \\text{with } \\mathbf{r}\\not = \\mathbf{r'}, \\quad \\text{and } -\\Delta g \\left(\\mathbf{r},\\mathbf{r'}\\right)=\\delta \\left(\\mathbf{r}-\\mathbf{r'}\\right).$$" ] }, { "cell_type": "markdown", "id": "e115f064-4c82-43dd-88bf-60fca4498076", "metadata": {}, "source": [ "### Layer operators" ] }, { "cell_type": "markdown", "id": "07d9cc0d-3d3a-4516-95e6-af3388a2e62b", "metadata": {}, "source": [ "Single and double layer operators defined for smooth densities:\n", "$$DL_{0j} \\left(\\psi\\right)\\left(\\mathbf{r}\\right):=\\int_{\\Gamma_j} \\psi\\left(\\mathbf{r}'\\right) \\nabla g\\left(\\mathbf{r},\\mathbf{r'}\\right) \\cdot \\widehat{\\mathbf{n}}_{0j} \\ dS',$$\n", "$$SL_{0j} \\left(\\psi\\right)\\left(\\mathbf{r}\\right):=\\int_{\\Gamma_j} {\\psi\\left(\\mathbf{r}'\\right) g\\left(\\mathbf{r},\\mathbf{r'}\\right) dS'},$$\n", "$$DL_j \\left(\\psi\\right)\\left(\\mathbf{r}\\right):=\\int_{\\Gamma_j} {\\psi\\left(\\mathbf{r}'\\right) \\nabla g\\left(\\mathbf{r},\\mathbf{r'}\\right) \\cdot \\widehat{\\mathbf{n}}_{j} \\ dS'},$$\n", "$$SL_j \\left(\\psi\\right)\\left(\\mathbf{r}\\right):=\\int_{\\Gamma_j} {\\psi\\left(\\mathbf{r}' \\right) g\\left(\\mathbf{r},\\mathbf{r'}\\right) dS'}$$\n", "\n", "with the gradient being taken with respect to $\\mathbf{r}'$, $\\widehat{\\mathbf{n}}_j$ being the exterior normal vector of $\\Omega_j$, and $\\widehat{\\mathbf{n}}_j=-\\widehat{\\mathbf{n}}_{0j}$.\n", "\n", "These operators are linear and continuous in the following Sobolev spaces:\n", "$$DL_{0j}: H^{\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^1_{loc} \\left(\\mathbb{R}^3 \\setminus \\cup_{j=1}^{N}\\Gamma_j\\right),$$\n", "$$SL_{0j}: H^{-\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^1_{loc} \\left(\\mathbb{R}^3 \\setminus \\cup_{j=1}^{N}\\Gamma_j\\right) , $$\n", "$$DL_{j}: H^{\\frac{1}{2}}(\\Gamma_j)\\rightarrow H^1_{loc} \\left(\\mathbb{R}^3 \\setminus \\cup_{j=1}^{N}\\Gamma_j\\right),$$\n", "$$SL_{j}: H^{-\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^1_{loc}\\left(\\mathbb{R}^3 \\setminus \\cup_{j=1}^{N}\\Gamma_j\\right).$$" ] }, { "cell_type": "markdown", "id": "248c240c-6d9c-426a-9de9-8842648dacd8", "metadata": {}, "source": [ "### Boundary integral operators" ] }, { "cell_type": "markdown", "id": "9efc74e7-4a08-4906-919b-dbcfdc7e9aa4", "metadata": {}, "source": [ "For $u\\in C^\\infty(\\overline\\Omega)$, Dirichlet and Neumann traces operators are defined as \n", "$$\\gamma_d u := u|_{\\Gamma},\\qquad \\gamma_n u := \\nabla u|_{\\Gamma} \\cdot \\widehat{n},$$\n", "where $\\widehat{n}$ is the exterior unit normal.\n", "\n", "By density arguments, the definition of Dirichlet and Neumann traces operator can be extended to $u_j \\in H^1_{loc}(\\Omega_j)$, with $j \\{0, ..., N \\}$. We extend the notation as follows\n", "\n", "$$\\gamma_d^{0j} u_0 := u_0|_{\\Gamma_j},$$\n", "$$\\gamma_d^{j} u_j := u_j|_{\\Gamma_j},$$\n", "$$\\gamma_n^{0j} u_0 := \\nabla u_0|_{\\Gamma_j} \\cdot \\widehat{n}_{0j},$$\n", "$$\\gamma_n^{j} u_j := \\nabla u_j|_{\\Gamma_j}\\cdot \\widehat{n}_{j},$$\n", "where $\\widehat{n}_{j}$ is the exterior normal of $\\Omega_j$, with $j\\in \\{ 1, ..., N\\}$ and $\\widehat{n}_{0j}=-\\widehat{n}_{j}$.\n", "\n", "Now, we recall the definition of the boundary integral operators:\n", "$$\\begin{aligned}\n", "\tV_{i,j}^0 &:= \\frac{1}{2} \\left( \\gamma_d^{i} SL_{0j} + \\gamma_d^{0i} SL_{0j} \\right) ,\n", "\t& V_{j}&:= \\frac{1}{2} \\left( \\gamma_d^{0j} SL_{j} + \\gamma_d^{j} SL_{j} \\right) ,\\\\\n", "\tK_{i,j}^0&:= \\frac{1}{2} \\left(\\gamma_d^{i} DL_{0j} + \\gamma_d^{0i} DL_{0j} \\right) ,\n", "\t&K_{j}&:= \\frac{1}{2} \\left(\\gamma_d^{0j} DL_{j} + \\gamma_d^{j} DL_{j} \\right),\\\\\n", "\tK^{*0}_{i,j}&:= \\frac{1}{2} \\left( - \\gamma_n ^{i} SL_{0j} + \\gamma_n ^{0i} SL_{0j} \\right),\n", "\t & K^{*}_{j} &:= \\frac{1}{2} \\left( -\\gamma_n ^{0j} SL_{j} + \\gamma_n ^{j} SL_{j} \\right), \\\\\n", "\tW_{i,j}^0 &:= -\\frac{1}{2} \\left( - \\gamma_n^{i} DL_{0j} + \\gamma_n^{0i} DL_{0j} \\right) ,\n", "\t& W_{j} &:=- \\frac{1}{2} \\left( -\\gamma_n^{0j} DL_{j} + \\gamma_n^{j} DL_{j} \\right).\n", "\\end{aligned}$$\n", "\n", "These operators are linear and continuous in the following Sobolev spaces: \n", "$$\\begin{aligned}\n", "\tV_{{i},j}^0 &: H^{-\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{\\frac{1}{2}}(\\Gamma_i),\n", "\t&V_{j}&: H^{-\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{\\frac{1}{2}}(\\Gamma_j),\\\\\n", "\tW_{{i},j}^0&: H^{\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{-\\frac{1}{2}}(\\Gamma_i),\n", "\t&W_{j}&: H^{\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{-\\frac{1}{2}}(\\Gamma_j) ,\\\\\n", "\tK_{{i},j}^0&: H^{\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{\\frac{1}{2}}(\\Gamma_i),\n", "\t&K_{j}&: H^{\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{\\frac{1}{2}}(\\Gamma_j) ,\\\\\n", "\tK^{*0}_{{i},j}&: H^{-\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{-\\frac{1}{2}}(\\Gamma_i),\n", "\t&K^*_{j}&: H^{-\\frac{1}{2}}(\\Gamma_j) \\rightarrow H^{-\\frac{1}{2}}(\\Gamma_j).\n", "\\end{aligned}$$\n", "\n", "Since the domains are smooth, the jump relations for the potentials across a closed boundary yield\n", "$$\\begin{aligned}\n", "\tV_{{i},j}^0 &= \\gamma_d^{0{i}} SL_{0j},\n", "\t& V_{j}&= \\gamma_d^{j} SL_{j},\\\\\n", "\tW_{{i},j}^0 &=- \\gamma_n^{0{i}} DL_{0j},\n", "\t& W_{j} &=- \\gamma_n^{j} DL_{j}, \\\\\n", "\t K_{{i},j}^0&= \\gamma_d^{0{i}} DL_{0j}, i \\not=j,\n", "\t & K^{*0}_{{i},j} &= \\gamma_n ^{0{i}} SL_{0j}, i \\not=j,\n", "\\end{aligned}$$\n", "and\n", "$$\\begin{aligned}\n", "\tK_{j,j}^0(\\psi) &= \\frac{1}{2}\\psi +\\gamma_d^{0j} {DL_{0j}(\\psi)} ,\n", "\t&K_{j}(\\psi) &= \\frac{1}{2} \\psi +\\gamma_d^{j} {DL_{j}(\\psi)} ,\\\\\n", "\t K^{*0}_{j,j}(\\psi) &= -\\frac{1}{2} \\psi + \\gamma_n^{0j} {SL_{0j}(\\psi)},\n", "\t&K^*_{j}(\\psi) &= -\\frac{1}{2} \\psi + \\gamma_n^j {SL_{j}(\\psi)}.\n", "\\end{aligned}$$" ] }, { "cell_type": "markdown", "id": "967bb620-e26e-4523-a1fb-ff243b89db3d", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Calderón operators" ] }, { "cell_type": "markdown", "id": "1315373a-858e-441a-9b4f-7787fd08717f", "metadata": {}, "source": [ "$$A_{i,j}^0 = \\begin{bmatrix} - K^0_{i,j} & V^0_{i,j} \\\\\n", "W^0_{i,j} & K^{*0}_{i,j}\\end{bmatrix}, \\quad A_{j,j}= \\begin{bmatrix} - K_{j,j} & V_{j,j} \\\\\n", "W_{j,j} & K^{*}_{j,j}\\end{bmatrix}. $$" ] }, { "cell_type": "markdown", "id": "3838f4e9-fd30-4f1b-9bc7-6584652d8656", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Spherical coordinate system" ] }, { "cell_type": "markdown", "id": "d4c26fbe-38b3-4e8d-83e1-4cbb363a6332", "metadata": {}, "source": [ "A vector is written as $\\mathbf{r}=\\left(r,\\varphi,\\theta\\right)^t$, with $r \\in [0,\\infty)$, $\\varphi \\in [0,2\\pi)$ and $\\theta \\in [0,\\pi]$, which in Cartesian coordinates is equivalent to $\\mathbf{r}=r\\left(\\sin \\theta \\cos \\varphi,\\sin \\theta \\sin \\varphi,\\cos \\theta\\right)^t$. The unitary vectors of the spherical coordinate system can be written in Cartesian coordinates as\n", "$$\\begin{aligned}\n", " &\\widehat{\\mathbf{e}}_r= (\\sin \\theta \\cos \\varphi , \\sin \\theta \\sin \\varphi , \\cos \\theta )^t, \\\\\n", " &\\widehat{\\mathbf{e}}_\\theta=(\\cos \\theta \\cos \\varphi , \\cos \\theta \\sin \\varphi , -\\sin \\theta )^t, \\\\\n", " &\\widehat{\\mathbf{e}}_{\\varphi}=(-\\sin \\varphi , \\cos \\varphi , 0 )^t.\n", "\\end{aligned}$$\n", "\n", "Also, the gradient operator in spherical coordinates:\n", "$$\\begin{aligned}\n", " \\nabla f&=\\frac{\\partial f}{\\partial r} \\widehat{\\mathbf{e}}_r+\\frac{1}{r} \\frac{\\partial f}{\\partial \\theta} \\widehat{\\mathbf{e}}_\\theta+\\frac{1}{r \\sin \\theta} \\frac{\\partial f}{\\partial \\varphi} \\widehat{\\mathbf{e}}_{\\varphi}\n", "\\end{aligned}$$" ] }, { "cell_type": "markdown", "id": "db7aaba4-7856-4a26-9414-15bf1a05a999", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Legendre functions" ] }, { "cell_type": "markdown", "id": "a3fbf1d7-4e84-49c8-b066-ecdba7389cf9", "metadata": {}, "source": [ " $P_l^m$ are the associated Legendre functions of degree $l$ and order $m$ defined as:\n", "$$P_{l}^m\\left(x\\right) := (-1)^m \\left( 1- x^2\\right)^{\\frac{m}{2}} \\frac{d^m}{dx^m}P_l(x), \\quad P_{l}\\left(x\\right) := \\frac{1}{2^ll!}\\frac{d^l}{dx^l}(x^2-1)^l.$$\n", "\n", "Here, the term $(-1)^m$ is the Condon-Shortley phase factor." ] }, { "cell_type": "markdown", "id": "6cea7d7b-ee08-4e93-aa39-b30feab6bfe4", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Real spherical harmonics" ] }, { "cell_type": "markdown", "id": "30ecf257-6f8c-4ee0-8ec8-e545c4cf06cf", "metadata": {}, "source": [ "Real spherical harmonics of degree $l$ and order $m$ are defined using spherical coordinates:\n", "$$\\begin{aligned}\n", "\t\t Y_{l,m}\\left(\\theta,\\varphi\\right) &:= \\sqrt{ (2-\\delta_{m,0}) \\frac{\\left(2l+1\\right)\\left(l-m\\right)!}{4 \\pi \\left(l+m\\right)!}} P_l^{m} \\left(\\cos\\theta\\right) \\cos m \\varphi ,\\\\\n", "\t\tY_{l,-m}\\left(\\theta,\\varphi\\right) &:= \\sqrt{ (2-\\delta_{m,0})\\frac{\\left(2l+1\\right)\\left(l-m\\right)!}{4 \\pi \\left(l+m\\right)!}} P_l^{m} \\left(\\cos\\theta\\right) \\sin m \\varphi ,\n", "\\end{aligned}$$\n", "with $l\\in \\mathbb{N}_0$, $m\\in \\mathbb{Z}$ such that $0\\leq m\\leq l$. If $m=0$, then $\\delta_{m,0}=1$, and it is zero otherwise." ] }, { "cell_type": "markdown", "id": "e4ecaddf-7dc0-40c5-bc57-de4979760df0", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Orthonormality of spherical harmonics" ] }, { "cell_type": "markdown", "id": "a8de46ab-af7e-4c89-8fff-f6e26a8fdc5e", "metadata": {}, "source": [ "Spherical harmonics are dense in $C(\\mathbb{S}^2)$, with $\\mathbb{S}^2$ the surface of the unit sphere, and form a complete orthonormal system in $L^2(\\mathbb{S}^2)$ with respect to the internal product defined by:\n", "$$\\left( \\psi , \\xi \\right)_{L^2(\\mathbb{S}^2)} = \\int_{0}^{2\\pi}\\int_{0}^{\\pi} \\psi\\left(\\theta,\\varphi\\right) \\xi\\left(\\theta,\\varphi\\right)\\sin\\left(\\theta\\right) d\\theta d\\varphi.$$\n", "\n", "They also are orthogonal in $H^1(\\mathbb{S}^2)$." ] }, { "cell_type": "markdown", "id": "7dbaaa65-3dcc-4c82-b34a-4c3ce4e7f865", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Reference systems" ] }, { "cell_type": "markdown", "id": "15aace8a-b256-4647-a74a-1e05447ede88", "metadata": {}, "source": [ "Let be $j\\in \\{1,...,N\\}$. We define the reference system $j$ as the one centered at $\\mathbf{p_j}$ with the same orientation that the reference system centered in the origin. Furthermore, we denote by $Y_{l,m,j}$ the spherical harmonic $Y_{l,m}$ centered in the origin of the reference system $j$. Thus, if $\\left( r_j, \\varphi_j, \\theta_j \\right)$ are the vector spherical coordinates of $\\mathbf{r_j}$ in the reference system $j$, we have that $Y_{l,m,j}\\left(\\mathbf{r}_j\\right)=Y_{l,m}\\left(\\theta_j, \\varphi_j\\right)$." ] }, { "cell_type": "markdown", "id": "63127c13-b6a9-46e0-8ff2-f72d8d73be25", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Some spherical harmonics expansions" ] }, { "cell_type": "markdown", "id": "d17bcf45-f106-4552-9262-acdc9da1f6b4", "metadata": {}, "source": [ "#### Real spherical harmonics and Laplace free space fundamental solution" ] }, { "cell_type": "markdown", "id": "4a23d645-1df2-41ed-9111-29fd6543b0ba", "metadata": {}, "source": [ "Let $\\mathbf{r}$, $\\mathbf{r}'$ be vectors, whose spherical coordinates in the reference system $j$ are $\\left(r_j,\\theta_j, \\varphi_j \\right)$ and $\\left(r_j',\\theta_j', \\varphi_j' \\right)$, respectively. For $r_j>r_j'$ we have\n", "$$g\\left(\\mathbf{r}, \\mathbf{r}'\\right) = \\sum_{l=0}^{\\infty} \\frac{1}{2l+1} \\frac{r_j^{'l}}{r_j^{l+1}}\\sum_{m=-l}^l Y_{l,m,j}\\left(\\mathbf{r}\\right) Y_{l,m,j}\\left(\\mathbf{r}'\\right).$$\n", "This series and its term by term first derivatives with respect to $r_j$ or $r_j'$ are absolutely and uniformly convergent on compact subsets with $r_j>r_j'$." ] }, { "cell_type": "markdown", "id": "2055b9f7-b351-4d90-a8be-a5c9fe46f300", "metadata": {}, "source": [ "Let be $j\\in \\{1,\\ldots,N\\}$, and $\\tilde{r}_j$ the radius of $\\Omega_j$.\n", "- Let $\\mathbf{r} \\in \\Omega_0$ and $\\mathbf{r}=(r,\\theta,\\varphi )$ be expressed in the $j$th spherical coordinate system, then\n", "$$\\begin{aligned}\n", " DL_{0j} ( Y_{l,m,j}) (\\mathbf{r}) &= -\\frac{l}{2l+1} \\left( \\frac{\\tilde{r}_j}{r} \\right)^{l+1} Y_{l,m}(\\theta, \\varphi ),\\\\\n", " SL_{0j} ( Y_{l,m,j}) (\\mathbf{r}) &= \\frac{\\tilde{r}_j}{2l+1} \\left( \\frac{\\tilde{r}_j}{r} \\right)^{l+1} Y_{l,m}(\\theta, \\varphi ).\n", "\\end{aligned}$$\n", "- Let $\\mathbf{r} \\in \\Omega_j$ and $\\mathbf{r}=(r,\\theta,\\varphi )$ expressed in the $j$th spherical coordinate system, then\n", "$$\\begin{aligned}\n", " DL_{j} ( Y_{l,m,j}) (\\mathbf{r}) &= -\\frac{l+1}{2l+1} \\left( \\frac{r}{\\tilde{r}_j} \\right)^{l} Y_{l,m}(\\theta, \\varphi ),\\\\\n", " SL_{j} ( Y_{l,m,j}) (\\mathbf{r}) &= \\frac{\\tilde{r}_j}{2l+1} \\left( \\frac{r}{\\tilde{r}_j} \\right)^{l} Y_{l,m}(\\theta, \\varphi ).\n", "\\end{aligned}$$" ] }, { "cell_type": "markdown", "id": "2613b768-fe71-4147-a574-1d2233d0b16c", "metadata": {}, "source": [ "The diagonal forms of the BIOs are:\n", "$$\\begin{aligned}\n", "\tV_{j,j}^0\\left( Y_{l,m,j} \\right) &= \\frac{1}{2l+1} \\tilde{r}_j Y_{l,m,j}, & V_{j}\\left( Y_{l,m,j} \\right)&= \\frac{1}{2l+1} \\tilde{r}_j Y_{l,m,j}, \\\\\n", "\tK_{j,j}^0\\left( Y_{l,m,j} \\right) &= \\frac{1}{2(2l+1)}Y_{l,m,j}, &\tK_{j}\\left( Y_{l,m,j} \\right) &= -\\frac{1}{2(2l+1)} Y_{l,m,j},\\\\\n", "\tK^{*0}_{j,j}\\left( Y_{l,m,j} \\right) &= \\frac{1}{2(2l+1)} Y_{l,m,j}, & K^*_{j}\\left( Y_{l,m,j} \\right) &= -\\frac{1}{2(2l+1)} Y_{l,m,j},\\\\\n", "\tW_{j,j}^0\\left( Y_{l,m,j} \\right) &= \\frac{l(l+1)}{2l+1} \\frac{1}{\\tilde{r}_j} Y_{l,m,j}, & \tW_{j}\\left( Y_{l,m,j} \\right)&= \\frac{l(l+1)}{2l+1} \\frac{1}{\\tilde{r}_j} Y_{l,m,j}.\n", "\\end{aligned}$$" ] }, { "cell_type": "markdown", "id": "ff9a0d7f-a3fd-422f-9a03-31f41f64a5eb", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `v_jj_azimuthal_symmetry`" ] }, { "cell_type": "markdown", "id": "a475410c-b013-4ecc-9456-e2a78bb40ba9", "metadata": {}, "source": [ "This function returns a numpy array, which we will call `v`. Its length is `big_l + 1`. Each entry contains\n", "$$v[l] = ( V_{j,j}^0 Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})} = ( V_{j,j} Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})} = \\frac{\\tilde{r}_j^3}{2 l + 1}$$\n", "where $\\mathbb{S_j}$ is the surface of the sphere $j$ and $r_j$ its radius." ] }, { "cell_type": "markdown", "id": "e484dc90-415f-4fa8-8e56-fb57d9e1fcdf", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 3, "id": "e43f5612-b3de-48db-84a5-a7d783066e26", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array with the boundary integral operator V_{j,j}\n", " with Laplace kernel evaluated and tested with spherical harmonics of\n", " order 0.\n", "\n", " Notes\n", " -----\n", " v[l] = ( V_{j,j} Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r).\n", " = r**3 / (2 l + 1)\n", " for each l such that 0 <= l <= big_l, and with\n", " ( ., .)_L^2(surface sphere radius r): inner product where indicated.\n", " Y_l,0: spherical harmonic degree l, order 0.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", "\n", " Returns\n", " -------\n", " v : np.ndarray\n", " of floats, Length (big_l+1). See the section notes for the\n", " ordering of the array.\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.v_jj_azimuthal_symmetry.__doc__)" ] }, { "cell_type": "markdown", "id": "4843a7ca-8ebb-4a25-bd96-c6b063819a9f", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "b2efa2ee-6ff8-45d0-889d-17e841015825", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 4, "id": "414edb2b-1012-4b81-8329-9e7950ea27e8", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 1.3" ] }, { "cell_type": "markdown", "id": "42f6a212", "metadata": {}, "source": [ "Calling of the function:" ] }, { "cell_type": "code", "execution_count": 5, "id": "fd3b5c7f-bca2-4358-8aaa-2eecd018e6f5", "metadata": {}, "outputs": [], "source": [ "v = selfinteractions.v_jj_azimuthal_symmetry(big_l, r)" ] }, { "cell_type": "markdown", "id": "6b22a919", "metadata": {}, "source": [ "Plot of the values:" ] }, { "cell_type": "code", "execution_count": 6, "id": "92517904-a6e4-4967-b593-0a23d75ff61c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'l')" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(\n", " v,\n", " marker='x'\n", ")\n", "plt.title('V')\n", "plt.xlabel('l')" ] }, { "cell_type": "markdown", "id": "c8e942e8-0955-437e-9123-1b1f166d0141", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `k_0_jj_azimuthal_symmetry`" ] }, { "cell_type": "markdown", "id": "767e0225", "metadata": {}, "source": [ "This function returns a numpy array, which we will call `k_0`. Its length is `big_l + 1`. Each entry contains\n", "$$\\begin{aligned}\n", "k_0[l] &= ( K_{j,j}^0 Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})} = ( K_{j,j}^{0*} Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})}\\\\\n", "&= \\frac{\\tilde{r}_j^2}{2(2 l + 1)}\n", "\\end{aligned}$$\n", "where $\\mathbb{S_j}$ is the surface of the sphere $j$ and $r_j$ its radius." ] }, { "cell_type": "markdown", "id": "dc27d30d-16a8-4fd2-b28a-69482bc36480", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 7, "id": "67eedbf2-153d-4dd7-bbb8-f5141e535e1c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array with the boundary integral operator K_{j,j}^0,\n", " with normals from out to in of the sphere, with Laplace kernel\n", " evaluated and tested with spherical harmonics of order 0.\n", "\n", " Notes\n", " -----\n", " k_0_jj[l] =\n", " ( K_{j,j}^0 Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r).\n", " = r**2 / (2*(2l + 1))\n", " for each l such that 0 <= l <= big_l, and with\n", " ( ., .)_L^2(surface sphere radius r): inner product where indicated.\n", " Y_l,0: spherical harmonic degree l, order 0.\n", "\n", " Notice that in this specific case\n", " ( K_{j,j}^0 Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r)\n", " = ( K_{j,j}^{*0} Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r)\n", " where K_{j,j}^{*0} has normals from out to in of the sphere, and\n", " with Laplace kernel.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", "\n", " Returns\n", " -------\n", " k_0_jj : np.ndarray\n", " of floats, length (big_l+1). See the section notes for the\n", " ordering of the array.\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.k_0_jj_azimuthal_symmetry.__doc__)" ] }, { "cell_type": "markdown", "id": "23b9ac31-a213-4e08-befd-d0eb0bd674e1", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "1bda91ba", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 8, "id": "1198d4ca-95ed-44a6-b81f-084d9053ef2a", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 1.3" ] }, { "cell_type": "markdown", "id": "062f6ccb", "metadata": {}, "source": [ "Calling of the function:" ] }, { "cell_type": "code", "execution_count": 9, "id": "56ec4676-b4f6-4967-97f0-e3a47c8d86ee", "metadata": {}, "outputs": [], "source": [ "k_0 = selfinteractions.k_0_jj_azimuthal_symmetry(big_l, r)" ] }, { "cell_type": "markdown", "id": "8e9aed4d", "metadata": {}, "source": [ "Plotting the values:" ] }, { "cell_type": "code", "execution_count": 10, "id": "4a33c5d5-3ea3-400f-9037-3e446e7507c0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'l')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(\n", " k_0,\n", " marker='x'\n", ")\n", "plt.title('K')\n", "plt.xlabel('l')" ] }, { "cell_type": "markdown", "id": "e474381f-ec32-434b-91cb-9f179ecf28c5", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `k_1_jj_azimuthal_symmetry`" ] }, { "cell_type": "markdown", "id": "c2b5aea0", "metadata": {}, "source": [ "This function returns a numpy array, which we will call `k_j`. Its length is `big_l + 1`. Each entry contains\n", "$$\\begin{aligned}\n", "k_j[l] &= ( K_{j,j} Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})} = ( K_{j,j}^* Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})}\\\\ &= -\\frac{\\tilde{r}_j^2}{2(2 l + 1)}\n", "\\end{aligned}$$\n", "where $\\mathbb{S_j}$ is the surface of the sphere $j$ and $r_j$ its radius." ] }, { "cell_type": "markdown", "id": "199b1a9e-b9fb-4f1f-9793-67e99379b3d7", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 11, "id": "72c925e4-500b-4b8c-8254-cfb9ab7a1c64", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array with the boundary integral operator K_{j,j},\n", " with normals from in to out of the sphere, with Laplace kernel\n", " evaluated and tested with spherical harmonics of order 0.\n", "\n", " Notes\n", " -----\n", " k_jj[l] = ( K_{j,j} Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r).\n", " = -r**2 / (2*(2l + 1))\n", " for each l such that 0 <= l <= big_l, and with\n", " ( ., .)_L^2(surface sphere radius r): inner product where indicated.\n", " Y_l,0: spherical harmonic degree l, order 0.\n", "\n", " Notice that in this specific case\n", " ( K_{j,j} Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r)\n", " = ( K_{j,j}^{*} Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r)\n", " where K_{j,j}^{*} has normals from in to out of the sphere, and with\n", " Laplace kernel.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", "\n", " Returns\n", " -------\n", " k_jj : np.ndarray\n", " of floats, length (big_l+1). See the section notes for the\n", " ordering of the array.\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.k_1_jj_azimuthal_symmetry.__doc__)" ] }, { "cell_type": "markdown", "id": "16053da8-4fee-4232-86c3-4f91b722a71c", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "998f520e", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 12, "id": "4062f0da-6735-443f-b030-757542f7a5f3", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 1.3" ] }, { "cell_type": "markdown", "id": "8c2e68ae", "metadata": {}, "source": [ "Calling of the function:" ] }, { "cell_type": "code", "execution_count": 13, "id": "0d5d9ac1-4c4b-411b-9db7-df1a92cb2be1", "metadata": {}, "outputs": [], "source": [ "k_1 = selfinteractions.k_1_jj_azimuthal_symmetry(big_l, r)" ] }, { "cell_type": "markdown", "id": "8bd7d3ea", "metadata": {}, "source": [ "Plotting the values:" ] }, { "cell_type": "code", "execution_count": 14, "id": "95b46e3c-14ba-4b37-9134-8820ca59485a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'l')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(\n", " k_1,\n", " marker='x'\n", ")\n", "plt.title('K')\n", "plt.xlabel('l')" ] }, { "cell_type": "markdown", "id": "a36d80f9-bd47-44a4-b1db-15f3180e1fc7", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `w_jj_azimuthal_symmetry`" ] }, { "cell_type": "markdown", "id": "7f47e4db", "metadata": {}, "source": [ "This function returns a numpy array, which we will call `w`. Its length is `big_l + 1`. Each entry contains\n", "$$w[l] = ( W_{j,j}^0 Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})} = ( W_{j,j} Y_{l,0} , Y_{l,0} )_{L^2(\\mathbb{S_j})} =\\tilde{r}_j \\frac{l(l+1)}{2l + 1}.$$" ] }, { "cell_type": "markdown", "id": "08c0d7a8-fb33-4960-a79a-143d062965ed", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 15, "id": "2b0186aa-a73d-4d76-916c-6efc644fef47", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array with the boundary integral operator W_{j,j}\n", " with Laplace kernel evaluated and tested with spherical harmonics of\n", " order 0.\n", "\n", " Notes\n", " -----\n", " w[l] = ( W_{j,j} Y_l,0 ; Y_l,0 )_L^2(surface sphere radius r).\n", " = r * l(l+1) / (2l + 1)\n", " for each l such that 0 <= l <= big_l, and with\n", " ( ., .)_L^2(surface sphere radius r): inner product where indicated.\n", " Y_l,0: spherical harmonic degree l, order 0.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", "\n", " Returns\n", " -------\n", " w : np.ndarray\n", " of floats, length (big_l+1). See the section notes for the\n", " ordering of the array.\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.w_jj_azimuthal_symmetry.__doc__)" ] }, { "cell_type": "markdown", "id": "be76a6a3-374d-420d-b446-d5cd48d7219e", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "1c8c49de", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 16, "id": "a89808b7-e307-44ac-9836-29f2da7e0ff9", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 1.3" ] }, { "cell_type": "markdown", "id": "04c1155a", "metadata": {}, "source": [ "Calling of the function:" ] }, { "cell_type": "code", "execution_count": 17, "id": "aea94f60-830e-406f-945a-f1dde320955d", "metadata": {}, "outputs": [], "source": [ "w = selfinteractions.w_jj_azimuthal_symmetry(big_l, r)" ] }, { "cell_type": "markdown", "id": "b75afd13", "metadata": {}, "source": [ "Plotting of the values:" ] }, { "cell_type": "code", "execution_count": 18, "id": "48baf47b-10f0-4f8c-8827-24fe0aabfe9f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 0, 'l')" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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ahaXLCOXWCyWCsuGYVy2TqQ+eeKJJ9i9ezdfffWV2VGcVufOnUlOTubs2bOsWrWK8ePHk5iYqEJSTTIzM/njH//I5s2b8fb2NjuOUxsxYkT5f/fo0YOYmBjat2/PBx98QGxsbK1mccky0qxZM6xW62VHQXJzcy87WiJSX0yePJn169ezdetWQkJCzI7jtDw9PenQoQMAvXv3ZseOHbz55pu8++67JidzDrt27SI3N5fo6OjydXa7na1btzJv3jxsNhtWq9XEhM6rYcOG9OjRg0OHDtX6a7vkmBFPT0+io6OJj4+vsD4+Pp7+/fublEqkagzD4IknnmD16tX85z//ISwszOxILsUwDGw2m9kxnMbQoUNJTU0lOTm5/NG7d2/+67/+i+TkZBWRGmSz2di/fz8tW7as9dd2ySMjALGxsTz88MP07t2bmJgYFixYQEZGBhMnTjQ7mlM5d+4chw8fLl9OT08nOTmZpk2b0rp1axOTOY9Jkybx0UcfsW7dOnx9fcuP+Pn7++Pj42NyOucyc+ZMRowYQWhoKIWFhSxbtoyEhAQ2bdpkdjSn4evre9l4p4YNGxIQEKBxUNVs+vTpjBo1itatW5Obm8vLL79MQUEB48ePr/UsLltGxo0bx6lTp3jppZfIzs6me/fubNy4kTZt2pgdzans3LmTIUOGlC9fOg85fvx43n//fZNSOZdLl6cPHjy4wvpFixYxYcKE2g/kxE6cOMHDDz9MdnY2/v7+REREsGnTJoYNG2Z2NJFKO3bsGA899BB5eXk0b96cfv368e2335ryPeiy84yIiIhI3eCSY0ZERESk7lAZEREREVOpjIiIiIipVEZERETEVCojIiIiYiqVERERETGVyoiIiIiYSmVEREw1ePBgpk6danYMETGRyoiIiIiYSmVERERETKUyIiIiIqZSGRERERFTqYyIiIiIqVRGRERExFQqIyIiImIqlRERERExlcqIiIiImEplRERERExlMQzDMDuEiIiIuC4dGRERERFTqYyIiIiIqVRGRERExFQqIyIiImIqlRERERExlcqIiIiImEplREREREylMiIiIiKmUhkRERERU6mMiIiIiKlURkRERMRUKiMiIiJiqv8P0SxFSUKZECMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure()\n", "plt.plot(\n", " w,\n", " marker='x'\n", ")\n", "plt.title('W')\n", "plt.xlabel('l')" ] }, { "cell_type": "markdown", "id": "c513fb0e-6309-4e1b-b1e7-9e460a7f324c", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `bio_jj`" ] }, { "cell_type": "markdown", "id": "74848364-4029-4be8-9362-35838b3ad29d", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 19, "id": "9fa5c214-e08f-4a48-8b46-b584c78f67c1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array with the corresponding boundary integral\n", " operator from the function bio_azimuthal with Laplace kernel\n", " evaluated and tested with spherical harmonics of all orders.\n", "\n", " Notes\n", " -----\n", " D[l*(2l+1) + m] =\n", " (D_{j,j} Y_l,m ; Y_l,m )_L^2(surface sphere radius r).\n", " which in this case is equal to\n", " = D[l*(2l+1)]\n", " for each l such that 0 <= l <= big_l, and with\n", " ( ., .)_L^2(surface sphere radius r): inner product where indicated.\n", " D: boundary integral operator corresponding to the function\n", " bio_azimuthal\n", " Y_l,m: spherical harmonic degree l, order m.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", " bio_azimuthal : Callable[[int, float], np.ndarray]\n", " python function for computing the operator for m = 0. Must be\n", " one of the functions written before this one.\n", "\n", " Returns\n", " -------\n", " op: np.ndarray\n", " of floats, length (big_l+1)**2. See the section notes for the\n", " ordering of the array.\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.bio_jj.__doc__)" ] }, { "cell_type": "markdown", "id": "c2a9c92b-a295-43e2-aa32-684d81c9746f", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "9b2f5484", "metadata": {}, "source": [ "Definition of the parameters:" ] }, { "cell_type": "code", "execution_count": 20, "id": "0c6cb9f6-0c34-4ef9-b8ce-023ec628222a", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 1.3\n", "operator = selfinteractions.w_jj_azimuthal_symmetry" ] }, { "cell_type": "code", "execution_count": 21, "id": "e7bc3e60-a2d6-423e-8606-c67254ae6d28", "metadata": {}, "outputs": [], "source": [ "full = selfinteractions.bio_jj(big_l, r, operator)" ] }, { "cell_type": "code", "execution_count": 22, "id": "cc24ac01-0d74-42ae-bb7d-2b5354081f97", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0.86666667 0.86666667 0.86666667 1.56 1.56\n", " 1.56 1.56 1.56 2.22857143 2.22857143 2.22857143\n", " 2.22857143 2.22857143 2.22857143 2.22857143 2.88888889 2.88888889\n", " 2.88888889 2.88888889 2.88888889 2.88888889 2.88888889 2.88888889\n", " 2.88888889 3.54545455 3.54545455 3.54545455 3.54545455 3.54545455\n", " 3.54545455 3.54545455 3.54545455 3.54545455 3.54545455 3.54545455]\n" ] } ], "source": [ "print(full)" ] }, { "cell_type": "markdown", "id": "591cdf44-5ec9-4606-aee0-60123e0723e2", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `a_0j_matrix`" ] }, { "cell_type": "markdown", "id": "aafc5568-1127-4e67-a53c-04947255e608", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 23, "id": "23edc061-5c29-43ed-852a-f626de550734", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array that represents the following matrix boundary\n", " integral operator\n", " A_{j,j}^0 = [ -K_{j,j}^0 , V_{j,j}^0 ]\n", " [ W_{j,j}^0 , K*_{j,j}^0 ]\n", " with Helmholtz kernel evaluated and tested with spherical harmonics\n", " of order 0 if azimuthal = True, or all orders if azimuthal = False.\n", "\n", " Each block is a diagonal matrix.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", " azimuthal : bool\n", " Default True.\n", "\n", " Returns\n", " -------\n", " matrix_0j : np.ndarray\n", " of floats.\n", " If azimuthal = True\n", " Shape (2*(big_l+1), 2*(big_l+1))\n", " Else\n", " Shape (2*(big_l+1)**2, 2*(big_l+1)**2)\n", "\n", " See Also\n", " --------\n", " a_0j_linear_operator\n", " v_jj_azimuthal_symmetry\n", " k_0_jj_azimuthal_symmetry\n", " w_jj_azimuthal_symmetry\n", " bio_jj\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.a_0j_matrix.__doc__)" ] }, { "cell_type": "markdown", "id": "33c82c50-c718-4a63-b74b-dced057f5fe2", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "247a2fdc", "metadata": {}, "source": [ "Definition of the parameters:" ] }, { "cell_type": "code", "execution_count": 24, "id": "d059550e-33c6-409d-aea3-9f2af474f227", "metadata": {}, "outputs": [], "source": [ "big_l = 3\n", "r = 1.3" ] }, { "cell_type": "markdown", "id": "f29c5324", "metadata": {}, "source": [ "Calling of the function with `azimuthal = True`:" ] }, { "cell_type": "code", "execution_count": 25, "id": "9a37218b-9921-424d-b2e6-eabdc4572b29", "metadata": {}, "outputs": [], "source": [ "a_0j = selfinteractions.a_0j_matrix(big_l, r) # azimuthal = True" ] }, { "cell_type": "markdown", "id": "196588e1", "metadata": {}, "source": [ "Plotting of the values:" ] }, { "cell_type": "code", "execution_count": 26, "id": "09b21f99-db91-483b-b50d-41ee4b77b904", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=plt.figaspect(1), dpi=68., layout='constrained')\n", "plt.imshow(a_0j)\n", "plt.colorbar(shrink=0.75)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "b9a4a370", "metadata": {}, "source": [ "Calling of the function with `azimuthal = False`:" ] }, { "cell_type": "code", "execution_count": 27, "id": "7b035278-0c21-449f-b8ce-14881fae18e3", "metadata": {}, "outputs": [], "source": [ "a_0j = selfinteractions.a_0j_matrix(big_l, r, azimuthal=False)" ] }, { "cell_type": "markdown", "id": "23ffc726", "metadata": {}, "source": [ "Plotting of the values:" ] }, { "cell_type": "code", "execution_count": 28, "id": "fdea63a8-cb21-485c-9309-ff8f6524821a", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=plt.figaspect(1), dpi=68., layout='constrained')\n", "plt.imshow(a_0j)\n", "plt.colorbar(shrink=0.75)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "13edcb92-8746-4d17-83fe-1b091860d00f", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `a_j_matrix`" ] }, { "cell_type": "markdown", "id": "5d54cbdf-9ae1-467a-9822-7756e9c63ccf", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 29, "id": "c36a10f2-647e-414c-85b8-dabe2ad8a7bf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a numpy array that represents the following matrix boundary\n", " integral operator\n", " A_{j,j}^0 = [ -K_{j,j} , V_{j,j} ]\n", " [ W_{j,j} , K*_{j,j} ]\n", " with Helmholtz kernel evaluated and tested with spherical harmonics\n", " of order 0 if azimuthal = True, or all orders if azimuthal = False.\n", "\n", " Each block is a diagonal matrix.\n", "\n", " Parameters\n", " ----------\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", " azimuthal : bool\n", " Default True.\n", "\n", " Returns\n", " -------\n", " matrix_j : np.ndarray\n", " of floats.\n", " If azimuthal = True\n", " Shape (2*(big_l+1), 2*(big_l+1))\n", " Else\n", " Shape (2*(big_l+1)**2, 2*(big_l+1)**2)\n", "\n", " See Also\n", " --------\n", " a_j_linear_operator\n", " v_jj_azimuthal_symmetry\n", " k_1_jj_azimuthal_symmetry\n", " w_jj_azimuthal_symmetry\n", " bio_jj\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.a_j_matrix.__doc__)" ] }, { "cell_type": "markdown", "id": "c8755e25-f7f1-42a5-acd1-2a3db2dec51b", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "deecd6eb", "metadata": {}, "source": [ "Definition of the parameters:" ] }, { "cell_type": "code", "execution_count": 30, "id": "c3e0b5ae-637d-401d-b273-7468d60fa4b9", "metadata": {}, "outputs": [], "source": [ "big_l = 3\n", "r = 1.3" ] }, { "cell_type": "markdown", "id": "502a96db", "metadata": {}, "source": [ "Calling of the function with `azimuthal = True`:" ] }, { "cell_type": "code", "execution_count": 31, "id": "95fd0c9e-17cb-4822-8f6b-3fc2e7d4551c", "metadata": {}, "outputs": [], "source": [ "a_j = selfinteractions.a_j_matrix(big_l, r) # azimuthal = True" ] }, { "cell_type": "markdown", "id": "26676cda", "metadata": {}, "source": [ "Plotting of the values:" ] }, { "cell_type": "code", "execution_count": 32, "id": "4230708e-d7c2-4b59-9765-b3a47d94a8e0", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAU0AAAEaCAYAAACVewWLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAAp1AAAKdQFKJd39AAAYq0lEQVR4nO3dfWxU17nv8d9kCiae2lNmOn45LgolagRX6eUlAg+2GSaGmyJHIhGhXFlFDRMFFdFTkaRqhAClEm4VdGgbReqpjhDSEKmKSVvp5vBfclphTTSJHUtQKCJWxUuAONcOjAfHdEIAe50/KHPxhdh7e8ZrXvz9SFuyvTfzPE7Qw7P2WnttjzHGCADgyAOFTgAASglFEwBcoGgCgAsUTQBwgaIJAC58LZ8f5p3r16xQMJ8f6crsqwULPeP9zwWfFjT+yXP/UtD4M1n17Bv65JNPCp2GNXktmrNCQdW+vC2fH+lK/V+8BYs90/3lN/9e0PirX/pxQePPZLP7/7PQKVjF8BwAXKBoAoALFE0AcIGiCQAuUDQBwIW8zp4DwGSeWvd1pa+OOr4+UPc9vf3229OXkEsUTQBWDV0d1dG3Gxxf37ppaBqzcY+iCcAqI6NRM1boNKaMognAKiPplpwPz4sNRROAdaMlvPc5RROAVUZGYyrdojnpkqPOzk6Fw2GFw2F1dnbayAlAGTOSRmUcH8Vmwk5zeHhYHR0d6u3tlSQtX75cbW1t8vv9VpIDUJ7KttPs7u5WS0uLfD6ffD6fmpub1dPTYys3AGXI6PY9TadHsZmw00ylUgoEAtnvA4GAUqnUuGvi8bji8bgkafTzkWlIEUC5Kd0FR5MUzWAwqHQ6nf0+nU4rGBy/yXAsFlMsFpMkzXlkwTSkCKCcmCK9V+nUhMPzcDisZDKpTCajTCajZDKpxsZGW7kBKEPGSKMujmIzYafp9/u1e/durVmzRsYY7dmzh0kgADkr2+G5JLW3t6u9vd1GLgBmACOPRuUpdBpTxtZwAKwbM86PyVy8eFGtra2KRCJasWKFjhw5cs81+VxvzhNBAKy6vbg9f51mVVWVDh8+rJqaGn322WdasWKF1q9fnz2f7/XmdJoArLpTNJ0ek5k7d65qamokST6fTx7P+D+T7/XmdJoArBsz+b+naYzRtm3btGvXrnE/d7Le3A06TQBWGRdd5qg8GhwcVCQSUSQSyT5Icz87duxQQ0ODtm7dOu7nTtabu0GnCcAqI+mm8Tq+vra2VolEYsJrdu7cKWOM9u3bd8+5cDisn/70p8pkMpKkZDKp/fv3u8r5bnSaAKzK9z3N7u5u7d+/XydPnlQ0GlU0GtW1a9cUjUYljV9v3tramvN6czpNAFYZ49GoyV+/Fg6HNTp6707wXV1d2a/zud6cognAurESHuRSNAFYVepPBFE0AVh1ez9NOk1J0uyrUv1fnM+K5VumtnD/IyoHS3kLgtytfunHBY0/0Fy47XDqkqXbNRXKGJ0mADhze3hOpwkAjjA8BwBXPMyeA4BTtztN7mkCgEPc0wQAx4yRxrinCQDOMHsOAC5xTxMAHDLi2XMAcMzI42o/zWJD0QRglfvF7YV7RPZ+KJoArHI/EXTvXpmFNGnmGzZsUH19vTZv3mwjHwDlztx+sZrTo9hMWjRff/31nF+uDgB33Ok0nR7FZtKM5s2bZyMPADPImHnA8VFscr6nGY/Hs6/VvHl9JOeEAJS3Oy9WK1U5F81YLKZYLCZJqq5ZkHNCAMqdpyg7SKeYPQdgVdl3mi+++KISiYQ+/fRTrV27VgcPHtT8+fMtpAagHJly7zRfe+01G3kAmCkMO7cDgGO3nz0v4+E5AOSTkYdOEwDcKMYnfZyiaAKwik2IAcAFI+kWW8MBgEPGw87tAOCUEfc0AcCVUl7cXrqZAyhJdx6jdHpMZrI9fysqKhSNRhWNRrV3796c86fTBGDV7cco8zc8f/3113X27FkdPHjwvudDoZC6urryFq+simbl4FjBYt+oLuw9mtmfF9d7VGyrSxbuv//ww4UdsPnPFu7v/VTlc3g+b948nT179ivPDw0NKRqNqrKyUq+++qoWL16cU7yyKpoAip/bxygHBwcViUQkjd+K0qkLFy4oFArp2LFj2rRpk/r6+uTxTP0fWYomALtcLjmqra1VIpGYcrhQKCRJWrZsmaqrqzUwMKD6+vopfx5FE4BVt5cc2bmlMTIyosrKSnm9Xl26dEmXL19WTU1NTp9J0QRgXT4ngu635++WLVvU1dWlU6dOafv27aqqqtKNGzd04MABeb25PY1E0QRglZEnr1vD3W/P3zuz5StXrtTx48fzFkuiaAIoAJ4IAgCHjCntJ4IomgAsy+/idtsomgCs4nUXAOCCkXRrjOE5ADhjGJ4DgGOlvp/mpD3yxYsX1draqkgkohUrVujIkSM28gJQxsb+uVbTyVFsJu00q6qqdPjwYdXU1Oizzz7TihUrtH79ehu5AShDpd5pTlo0586dm/3a5/PltDsIAMyYJUfGGG3btk27du2aznwAlLnbi9tnQNHcsWOHGhoatHXr1nE/j8fjisfjkqSb10fymx2AslT2RXPnzp0yxmjfvn33nLt7U9DqmgX5zQ5AWTIlXDQnnT3v7u7W/v37dfLkyezLia5du2YjNwBlyLiYOS/J2fNwOKzR0VEbuQCYIdwMz4vt2SEWtwOwy5T28JyiCcAqt+s0c9tnPf8omgCso9MEAIfMTFncDgB5YeTqFb7FhqIJwCojhucA4ArDcwBwwZhCZzB1FE0AVhnjYXgOAG5QNAHABe5pQrM/L+xNmpuVhf1LOCtTwjepcuQ/O1bQ+P/4l8I+nT273931t2fPpyUVKyiaAKxjeA4ATjERBADulPDonKIJwK5SfyKo2Pb3BDATGBfHJDZs2KD6+npt3rz5vuc7OzsVDocVDofV2dmZc+p0mgCsy2en+frrr+vs2bM6ePDgPeeGh4fV0dGh3t5eSdLy5cvV1tYmv98/5Xh0mgDsMreXHDk9JjNv3ryvPNfd3a2Wlhb5fD75fD41Nzerp6cnp/QpmgCsu/MopZNjcHBQkUhEkUgk+7pwp1KplAKBQPb7QCCgVCqVU+4MzwFYZeSRGXM+PK+trVUikZhSrGAwqHQ6nf0+nU4rGAxO6bPuoNMEYJebSaAc1yaFw2Elk0llMhllMhklk0k1Njbm9Jl0mgCsy+dE0IsvvqhEIqFPP/1Ua9eu1cGDB7VlyxZ1dXXJ7/dr9+7dWrNmjYwx2rNnT06TQBJFE0Ah5HF1+2uvvXbPz7q6urJft7e3q729PW/xJhyeX7lyRU1NTYpGo3rsscf0xhtv5C0wgJnLzURQsZmw05w7d67ee+89eb1eDQ8Pa+HChXr22Wdt5QagHOXhXmUhTVg0vd7/95r2kZERLV26dNoTAjATFF8H6dSks+cDAwOKRCJasmSJ1q1bd8/5eDyeXUN18/rItCQJoMxYmj2fDpNOBNXV1SmRSOjzzz9XU1OTnnjiCS1cuDB7PhaLKRaLSZKqaxZMX6YAykcRFkOnJuw0v/zyy+zXlZWVevDBBzVnzpxpTwpAOfNIxsVRZCbsNI8dO6aXX35ZX/va13T9+nU999xzmj9/vqXUAJQlh8+UF6sJi+bKlSv13nvv2coFwExRrkUTAKZFEQ67naJoArDOQ6cJAA4V6VIipyiaAOxzsTVcsaFoArCPThMAHGJ4DgAuMXsOAM4xew4AbpRw0eQdQQDgAp0mAOsYnqPgZmUK+7ew6q3ugsYf+d/hgsYvJN+nY4VOwZ0i3b3IKYomAPvoNAHABYomADjjEfc0AcA5nggCAJcomgDgHMNzAHCDJUcA4JCRPCW2tPRuFE0A9jE8BwDnuKcJAE6V+JIjdjkCYJ9xcUyis7NT4XBY4XBYnZ2d95yvqKhQNBpVNBrV3r17c07dUaf5xRdfaNGiRdq8ebN+8Ytf5BwUwMyVzyeChoeH1dHRod7eXknS8uXL1dbWJr/fn70mFAqpq6srPwHlsNP81a9+paVLl+YtKADkQ3d3t1paWuTz+eTz+dTc3Kyenp5x1wwNDSkajaqtrU0nTpzIOeaknWZ/f796enq0ceNGnTlzJueAAODmnubg4KAikYgkKRaLKRaLZc+lUikFAoHs94FAQKlUatyfv3DhgkKhkI4dO6ZNmzapr69PHs/U14lOWjR37dqljo6Or6zQ8Xhc8XhcknTz+siUEwEwQxh3w/Oa2lolEon7ngsGg0qn09nv0+m0gsHguGtCoZAkadmyZaqurtbAwIDq6+vd5/1PEw7Pe3p65PV6Jxyax2IxJRIJJRIJzZpTNeVEAMwgeZoICofDSiaTymQyymQySiaTamxszJ4fGRnR6OioJOnSpUu6fPmyampqckp9wk6zp6dHZ86c0bp169Tf369MJqOFCxdq8+bNOQUFMMPlaSLI7/dr9+7dWrNmjYwx2rNnj/x+v6LRqLq6unTq1Clt375dVVVVunHjhg4cOCCv15tTTI8xxlH6hw4d0pkzZyacPa+uWaD/sebHOSWE0sTrLmau2f3/+ZXD5/upfOhhPfTsvzq+PtT1f1x9/nRzvLh9y5Yt05gGgBmjxBe380QQAOt4jBIA3KBoAoALFE0AcMbDfpoA4BKdJgA4x0QQALhB0QQAh1w+e15sKJoA7KNoAoALFE0AcK5033peZkXz//6vWwWLXf9fZfWf0rVCb5jh679esNj/aJhTsNgli04TAJzxMBEEAC5RNAHABYomADjH8BwAnGITYgBwh04TAFxgazgAcIrhOQC4RNEEAGc84p4mALhT7kWzoqJCK1eulCS1trbqlVdemdakAJQxI3lM6VZNR0UzFAqpq6trmlMBMGOUbs3UA04uGhoaUjQaVVtbm06cODHdOQEoc3c27XByFBtHneaFCxcUCoV07Ngxbdq0SX19ffJ4bu+IF4/HFY/HJUk3r49MX6YAykcRFkOnHHWaoVBIkrRs2TJVV1drYGAgey4WiymRSCiRSGjWnKrpyRJA+XDRZRZjpzlp0RwZGdHo6Kgk6dKlS7p8+bJqamqmPTEAZcy4OIrMpMPzU6dOafv27aqqqtKNGzd04MABeb1eG7kBKEOlvk5z0k5z5cqVOn78uBKJhLq7u/XEE0/YyAtAOctjp9nZ2alwOKxwOKzOzk7X591icTsAu/J4r3J4eFgdHR3q7e2VJC1fvlxtbW3y+/2Ozk+Fo4kgAMgfIxkXxwS6u7vV0tIin88nn8+n5uZm9fT0OD4/FRRNANa5mT0fHBxUJBJRJBLJLm+8I5VKKRAIZL8PBAJKpVKOz08Fw3MAdhnJM+r88traWiUSifueCwaDSqfT2e/T6bSCwaDj81NBpwnAvjxNBIXDYSWTSWUyGWUyGSWTSTU2Njo+PxV0mgCsyueSI7/fr927d2vNmjUyxmjPnj3y+/2KRqPq6ur6yvO5oGgCsC+Puxy1t7ervb193M/u3mDofudzQdEEYFeRPh7pFEUTgH0UTQBwjk4TANwo953bS0X9fxXu11n58ocFiy1JH/zbioLGL7R/NMwpWOyKYReLDqfBl/4S20CHe5oA4BJFEwCcc9NpFlt9pWgCsMtIGiu2UugcRROAfaVbMymaAOxy+xhlsdVXiiYAyybfJ7OYUTQB2GUkz1ihk5g6iiYA6zx0mgDgkJFEpwkAztFpAoAbpVszKZoACqCcO83Tp0/rZz/7mTKZjGbPnq133nnHRl4AypSnnDfsuHnzpn7yk5/oj3/847jXYALA1JX2Os0J30bZ3d0tn8+n559/XqtXr9ahQ4cspQWgnHnGnB/FZsJOs7+/X729vTp58qQqKysViUTU1NSkRx55JHtNPB7PvsD95vWR6c0WQHko104zEAiosbFRoVBIPp9P0WhUJ06cGHdNLBZTIpFQIpHQrDlV05osgDLg5p3nRVhbJyya4XBY586d0/Xr1zU2Nqbe3t5xXSYATIXHGMdHsZlweF5dXa2f//znWrt2rW7duqWnn35aixcvtpUbgHJVhMXQqUmXHD3zzDN65plnbOQCYCbgMUoAcKM4h91OUTQB2EfRBACHjKRRiiYAOHL7dRcUTQBwqLQfo6RoArDLqKSL5oSL2wFgWhjj/MjRb37zGzU1NWnlypU6evToPec//vhj+f1+RaNRRaNRHThwYMLPo9MEYJ+ldZp///vf9Yc//EHJZFJXrlzR448/rr/97W/yer3jrvvud7+rrq4uR59JpwnALmPvMcqjR49q/fr18nq9qq2tVUNDg86ePXvPdR999JEikYg2btyojz/+eMLPpGgCsMzF0NwYDQ4OKhKJKBKJZHdUcyqVSo3bCzgQCCiVSo27pr6+XufPn1cikdBzzz2nH/7whxN+JsNzAPaNOe8ga2trlUgkvvL8kiVL7vnZ3LlzdfToUQWDQQ0NDWV/nk6nFQwGx11bUVGhiooKSVJbW5t+9KMfTZgPRTNPPvi3FQWN//5r/1HQ+E0vbito/EL60u+d/KJpNOsfJfYgd55nz//6179+5bnW1lY9++yzevnll5VKpdTf36+HH3543DXDw8Py+/2SpOPHj+ub3/zmhPEomgDss7Tk6Dvf+Y42btyoVatWyRij3/72t/J6vRoYGNALL7ygw4cP689//rN++ctf6utf/7ok6eDBgxN+JkUTgH0W12m+9NJLeumll8b9rK6uTocPH5bkfic3iiYAu4xxdU+z2FA0AdhnSuw+7F0omgDsK+HHKCmaAOwyRhql0wQA5+g0AcAFiiYAOGSMNMbwHACco9MEABcomgDgULkvbj9//rxisVj2+2QyqePHj+vRRx+d1sQAlC9Tzovbv/3tb2d3NO7r69P3v/99CiaA3JRzp3m3eDw+rusEANfy9O6fQnFcNEdHR/XWW2/pww8/HPfzeDye3U355vWR/GYHoDzNhCVH7777rhYvXqyamppxP4/FYtnus7pmQX6zA1CeZkKneejQIYbmAHJmjJEp4U7T0YvVrl69qg8++EBPPvnkdOcDYCaw+N7zfHPUaX7jG9/QxYsXpzsXADOB0cyZPQeA3Bk2IQYAx4xkRkcLncWUUTQBWGZkGJ4DgAsMzwHAmdVPNWtoaNDx9YFAYBqzcY+iCcCqt99+u9Ap5MTROk0AwG0UTQBwgaIJAC5QNAHABYomALjgMSZ/T8R/61vf0oIFU98ebnBwULW1tflKh/glErvQ8Wfy756P+OfOndMnn3ySx4yKnCkiq1atIv4MjF3o+DP5dy+G+KWG4TkAuFBURbPQmxzP5Pj87oUz0+OXmrze0wSAcldUnSYAFDuKJgC4UDRFs7OzU+FwWOFwWJ2dnVZjb9iwQfX19dq8ebPVuJJ08eJFtba2KhKJaMWKFTpy5IjV+FeuXFFTU5Oi0agee+wxvfHGG1bjS9IXX3yh+fPna8+ePdZjV1RUKBqNKhqNau/evdbjnz59Wk8++aQef/xxfe9737Ma+/z589nfPRqNatasWTp16pTVHEpSoafvjTHm6tWrZtGiRebatWvm2rVrZtGiRebq1avW4l+8eNEcPXrU/OAHP7AW846hoSEzODhojDFmcHDQPPTQQ1bj37p1y9y6dcsYc/v/Q11dndX4xhizd+9e8/TTT5vdu3dbj93Q0GA95h03btwwra2tJpVKFSyHOz766CPz6KOPFjqNklAUnWZ3d7daWlrk8/nk8/nU3Nysnp4ea/HnzZtnLdb/b+7cudl3yft8Pnk8HqvxvV6vvF6vJGlkZERLly61Gr+/v189PT166qmnrMa9Y2hoSNFoVG1tbTpx4oTV2N3d3fL5fHr++ee1evVqHTp0yGr8u8XjcWbRHSqK/TRTqdS4jUYDgYBSqVQBM7LPGKNt27Zp165d1mMPDAxo06ZNOn36tF555RWrsXft2qWOjg7rBeuOCxcuKBQK6dixY9q0aZP6+vqs/cPV39+v3t5enTx5UpWVlYpEImpqatIjjzxiJf4do6Ojeuutt/Thhx9ajVuqiqLTDAaDSqfT2e/T6bSCwWABM7Jvx44damho0NatW63HrqurUyKR0Llz53TgwAH19fVZidvT0yOv12u9u71bKBSSJC1btkzV1dUaGBiwFjsQCKixsVGhUEg+n0/RaLQg/3i8++67Wrx4cXbEg4kVRdEMh8NKJpPKZDLKZDJKJpNqbGwsdFrW7Ny5U8YY7du3z3rsL7/8Mvt1ZWWlHnzwQc2ZM8dK7J6eHp05c0br1q3Tr3/9a3V2dur3v/+9ldjS7dsRo/98K+KlS5d0+fJlq4UjHA7r3Llzun79usbGxtTb22u9y5SkQ4cOMTR3o9A3Ve948803TTgcNo2NjebNN9+0GvuFF14wy5YtM3V1dWbNmjXm/Pnz1mJ/8MEH5oEHHjCRSMSsXr3arF692oyMjFiL//7775uWlhYTjUZNOBw2v/vd76zFvls8Hrc+EfT++++bJUuWmFWrVpnGxkbzzjvvWI1vjDF/+tOfTHNzs2lsbDSvvvqq9fjpdNrMmzfP3Lhxw3rsUsUTQQDgQlEMzwGgVFA0AcAFiiYAuEDRBAAXKJoA4AJFEwBcoGgCgAv/DQwopv3LOvtrAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=plt.figaspect(1), dpi=68., layout='constrained')\n", "plt.imshow(a_j)\n", "plt.colorbar(shrink=0.75)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "8cb088b4", "metadata": {}, "source": [ "Calling of the function with `azimuthal = False`:" ] }, { "cell_type": "code", "execution_count": 33, "id": "a2e5aeaf-be64-49df-96e3-2b2dddea5516", "metadata": {}, "outputs": [], "source": [ "a_j = selfinteractions.a_j_matrix(big_l, r, azimuthal=False)" ] }, { "cell_type": "markdown", "id": "8fac2f2c", "metadata": {}, "source": [ "Plotting of the values:" ] }, { "cell_type": "code", "execution_count": 34, "id": "44668b28-adcd-4992-a7b0-bd2bb1b76c0d", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(figsize=plt.figaspect(1), dpi=68., layout='constrained')\n", "plt.imshow(a_j)\n", "plt.colorbar(shrink=0.75)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "c9aeb365-9bb1-4d0b-98f6-90855aed30c9", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `a_0j_linear_operator`" ] }, { "cell_type": "markdown", "id": "00b03212-7654-475b-b89a-405b043a9134", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 35, "id": "8462dc43-9ef9-4970-b4cc-2f20c5ecba98", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a scipy linear operator equivalent to the given by\n", " a_0j_matrix.\n", "\n", " Parameters\n", " ----------\n", " azimuthal\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", " azimuthal : bool\n", " Default True.\n", "\n", " Returns\n", " -------\n", " linear_operator : sparse.linalg.LinearOperator\n", " a scipy linear operator.\n", "\n", " See Also\n", " --------\n", " a_0j_matrix\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.a_0j_linear_operator.__doc__)" ] }, { "cell_type": "markdown", "id": "49122d81-61d3-47dc-a1dc-dc1c4efc695e", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Examples" ] }, { "cell_type": "markdown", "id": "e1fde430-4de3-4587-b56f-c1926885a620", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Simpler example" ] }, { "cell_type": "markdown", "id": "e5309851", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 36, "id": "0b53be07-0f3a-4f53-a264-f8b33d19bec7", "metadata": {}, "outputs": [], "source": [ "r = 2.5\n", "big_l = 2" ] }, { "cell_type": "markdown", "id": "298a8d67", "metadata": {}, "source": [ "Calling of the function with `azimuthal = True`:" ] }, { "cell_type": "code", "execution_count": 37, "id": "0b4791a2-7d3e-41d0-9f83-8edfa8b9c8bc", "metadata": {}, "outputs": [], "source": [ "a_0j = selfinteractions.a_0j_linear_operator(big_l, r) # azimuthal = True" ] }, { "cell_type": "markdown", "id": "5e91049c", "metadata": {}, "source": [ "Calling of the function with `azimuthal = False`:" ] }, { "cell_type": "code", "execution_count": 38, "id": "cfe0eae3-1e8f-40a7-804b-e2062ad973d0", "metadata": {}, "outputs": [], "source": [ "a_0j = selfinteractions.a_0j_matrix(big_l, r, azimuthal = False)" ] }, { "cell_type": "markdown", "id": "5b6c7e2c-a849-4c5a-ab8e-9b02595a4617", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Comparing with the matrix version" ] }, { "cell_type": "markdown", "id": "9fc5733a", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 39, "id": "9e780c54-66a7-4856-8c8e-2bc3a62ffe7d", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 2.5" ] }, { "cell_type": "markdown", "id": "a32c5832-11ba-4e0a-9963-6e12a3587a65", "metadata": {}, "source": [ "Initialization of a random vector as right hand side:" ] }, { "cell_type": "code", "execution_count": 40, "id": "01491f43-d5df-4eb4-9a83-b2a73b8d1fe8", "metadata": {}, "outputs": [], "source": [ "num = big_l + 1\n", "b = np.random.random((2*num))" ] }, { "cell_type": "markdown", "id": "38e7f269", "metadata": {}, "source": [ "Calling of the functions to be compared" ] }, { "cell_type": "code", "execution_count": 41, "id": "ee7e1fb8-13d9-416a-8ab9-1639e29c02b0", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_0j_linear_operator(big_l, r) # azimuthal = True\n", "matrix = selfinteractions.a_0j_matrix(big_l, r) # azimuthal = True" ] }, { "cell_type": "markdown", "id": "9d1a7210", "metadata": {}, "source": [ "Solving the iterative system:" ] }, { "cell_type": "code", "execution_count": 42, "id": "868bede0-7769-4973-8799-fd14f10d3c57", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "norms = []\n", "\n", "def callback_function(pr_norm):\n", " norms.append(pr_norm)\n", " return 0.\n", "\n", "solution, info = scipy.sparse.linalg.gmres(\n", " linear_operator, b,\n", " rtol=10**(-9),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "f4f898bc", "metadata": {}, "source": [ "Solving the direct system:" ] }, { "cell_type": "code", "execution_count": 43, "id": "b2278f8c-dba7-4e1f-b899-3ffc5fee17c3", "metadata": {}, "outputs": [], "source": [ "solution2 = np.linalg.solve(matrix, b)" ] }, { "cell_type": "markdown", "id": "f8838cad", "metadata": {}, "source": [ "Difference between solutions:" ] }, { "cell_type": "code", "execution_count": 44, "id": "98c9653e-1da1-471d-afc9-fbd086d225c0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.528924144620228e-16\n" ] } ], "source": [ "print(np.linalg.norm(solution2 - solution))" ] }, { "cell_type": "markdown", "id": "22f78866-d44d-4193-9552-7a4f80c3caeb", "metadata": {}, "source": [ "Which means that solving the numpy array from `a_0j_matrix` and the linear operator from `a_0j_linear_operator` can be used to solve the same linear system." ] }, { "cell_type": "markdown", "id": "f85f5f6a-bf7b-4286-b22e-2b2aae27cff8", "metadata": {}, "source": [ "Let us see what happens with `azimuthal=False`." ] }, { "cell_type": "markdown", "id": "d0fd12df", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 45, "id": "ec7bed26-6263-4d8a-a03d-3d4d5775c715", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 2.5" ] }, { "cell_type": "markdown", "id": "ffc21f84", "metadata": {}, "source": [ "Initialization of a random vector as right hand side:" ] }, { "cell_type": "code", "execution_count": 46, "id": "079dfbb5-90d5-49dd-9e01-7b7502b3865a", "metadata": {}, "outputs": [], "source": [ "num = (big_l + 1) ** 2\n", "b = np.random.random((2*num))" ] }, { "cell_type": "markdown", "id": "92f0fe7a", "metadata": {}, "source": [ "Calling of the functions to be compared" ] }, { "cell_type": "code", "execution_count": 47, "id": "f403b374-e0c2-434e-a767-38832f85cd2d", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_0j_linear_operator(big_l, r, False)\n", "matrix = selfinteractions.a_0j_matrix(big_l, r, False)" ] }, { "cell_type": "markdown", "id": "5b599431", "metadata": {}, "source": [ "Solving the iterative system:" ] }, { "cell_type": "code", "execution_count": 48, "id": "b24d2cf6-533b-4521-aa05-a11a9e5ab5c2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "norms = []\n", "\n", "def callback_function(pr_norm):\n", " norms.append(pr_norm)\n", " return 0.\n", "\n", "solution, info = scipy.sparse.linalg.gmres(\n", " linear_operator, b,\n", " rtol=10**(-9),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "7adef177", "metadata": {}, "source": [ "Solving the direct system:" ] }, { "cell_type": "code", "execution_count": 49, "id": "e1226154-ca90-4c97-8956-04e79b486ef9", "metadata": {}, "outputs": [], "source": [ "solution2 = np.linalg.solve(matrix, b)" ] }, { "cell_type": "markdown", "id": "404b3026", "metadata": {}, "source": [ "Difference between solutions:" ] }, { "cell_type": "code", "execution_count": 50, "id": "975047cd-7dcf-42fe-94f6-269d44b120e8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.607103545959576e-16\n" ] } ], "source": [ "print(np.linalg.norm(solution2 - solution))" ] }, { "cell_type": "markdown", "id": "288a63d3-e69e-4115-bc0e-94ed7a570c07", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Comparing the azimuthal version against the no azimuthal" ] }, { "cell_type": "markdown", "id": "e275f865-8a4f-4db7-8a66-6c146a2373fc", "metadata": {}, "source": [ "For a right hand with azimuthal symmetry when extended by 0 to explicitly compute the result without considering the symmetry, the result should be the same with the azimuthal and the not azimuth versions." ] }, { "cell_type": "markdown", "id": "1c27aec0", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 51, "id": "1a8da442-4214-4cdf-8611-5c0db372e64a", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 2.3" ] }, { "cell_type": "markdown", "id": "768bb636", "metadata": {}, "source": [ "Initialization of a random vector as right hand side, and its extension by zero:" ] }, { "cell_type": "code", "execution_count": 52, "id": "ac425c56-44c7-41b0-85ac-63a7ccca9330", "metadata": {}, "outputs": [], "source": [ "import biosspheres.miscella.extensions as extensions\n", "num = (big_l + 1)\n", "b = np.random.random((2 * num))\n", "b_2_1 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, b[0:num])\n", "b_2_2 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, b[num:2 * num])\n", "b2 = np.concatenate((b_2_1, b_2_2))" ] }, { "cell_type": "markdown", "id": "1954c7d4", "metadata": {}, "source": [ "Calling of the function with `azimuthal=False`:" ] }, { "cell_type": "code", "execution_count": 53, "id": "fed8bd58-20c4-4fc7-948c-9acfd88a5009", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_0j_linear_operator(big_l, r, False)" ] }, { "cell_type": "markdown", "id": "5623d0a9", "metadata": {}, "source": [ "Solving the iterative system:" ] }, { "cell_type": "code", "execution_count": 54, "id": "05d44a12-505d-4acd-8212-dd4fe12a4032", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "norms = []\n", "\n", "def callback_function(pr_norm):\n", " norms.append(pr_norm)\n", " return 0.\n", "\n", "num = (big_l + 1)**2\n", "solution, info = scipy.sparse.linalg.gmres(linear_operator, b2,\n", " rtol=10**(-13),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "014a2c9b", "metadata": {}, "source": [ "Calling of the function with `azimuthal=True`:" ] }, { "cell_type": "code", "execution_count": 55, "id": "e973bd22-54dc-4e72-92d4-75678ec85405", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_0j_linear_operator(big_l, r) # azimuthal = False" ] }, { "cell_type": "markdown", "id": "b04b428b", "metadata": {}, "source": [ "Solving the iterative system:" ] }, { "cell_type": "code", "execution_count": 56, "id": "1dc92a0e-5a4c-4fd2-9d8a-9c1d321990d0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "num = (big_l + 1)\n", "norms = []\n", "\n", "solution2, info = scipy.sparse.linalg.gmres(\n", " linear_operator,\n", " b,\n", " rtol=10**(-13),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "574c804d", "metadata": {}, "source": [ "Comparison of the solutions:" ] }, { "cell_type": "code", "execution_count": 57, "id": "bf7c3f23-cb51-44b8-97bd-0a47683ef6a2", "metadata": {}, "outputs": [], "source": [ "solution2_1 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, solution2[0:num])\n", "solution2_2 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, solution2[num:2 * num])\n", "solution2 = np.concatenate((solution2_1, solution2_2))" ] }, { "cell_type": "code", "execution_count": 58, "id": "538c3235-1053-455b-aed4-282d96ca90d7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.014976168611859e-16\n" ] } ], "source": [ "print(np.linalg.norm(solution2 - solution))" ] }, { "cell_type": "markdown", "id": "393b0e94-c762-4f1d-8ba5-8471ba7249ed", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `a_j_linear_operator`" ] }, { "cell_type": "markdown", "id": "1ff2d219-9992-4a2b-8cb5-cca1756add64", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Docstring" ] }, { "cell_type": "code", "execution_count": 59, "id": "40a36299-96d9-4a1e-9d74-4e6f282f5e1b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " Returns a scipy linear operator equivalent to the given by\n", " a_j_matrix.\n", "\n", " Parameters\n", " ----------\n", " azimuthal\n", " big_l : int\n", " >= 0, max degree.\n", " r : float\n", " > 0, radius.\n", " azimuthal : bool\n", " Default True.\n", "\n", " Returns\n", " -------\n", " linear_operator : sparse.linalg.LinearOperator\n", " a scipy linear operator.\n", "\n", " See Also\n", " --------\n", " a_j_matrix\n", "\n", " \n" ] } ], "source": [ "print(selfinteractions.a_j_linear_operator.__doc__)" ] }, { "cell_type": "markdown", "id": "0a751464-6708-4966-9ad7-0d5feb9bd789", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "99217d76-2981-41e6-88ac-eace0af6e42b", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Simpler example" ] }, { "cell_type": "markdown", "id": "a0c0e11d", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 60, "id": "b474212f-14a6-462f-87c6-712b74a52341", "metadata": {}, "outputs": [], "source": [ "r = 2.5\n", "big_l = 2" ] }, { "cell_type": "markdown", "id": "81925fd2", "metadata": {}, "source": [ "Calling of the function with `azimuthal = True`:" ] }, { "cell_type": "code", "execution_count": 61, "id": "3d4a5777-0b4c-4b4e-b819-22093b1ecb31", "metadata": {}, "outputs": [], "source": [ "a_0j = selfinteractions.a_0j_linear_operator(big_l, r) # azimuthal = True" ] }, { "cell_type": "markdown", "id": "a63a1f66", "metadata": {}, "source": [ "Calling of the function with `azimuthal = False`:" ] }, { "cell_type": "code", "execution_count": 62, "id": "f717bb14-0642-466a-9cb1-ce16d9e4db82", "metadata": {}, "outputs": [], "source": [ "a_0j = selfinteractions.a_0j_matrix(big_l, r, azimuthal = False)" ] }, { "cell_type": "markdown", "id": "3fa1de94-1116-4cf7-a976-22ffb33fbab9", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Comparing with the matrix version" ] }, { "cell_type": "markdown", "id": "4ee7db5e", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 63, "id": "4aa7cf7b-9ea0-4205-b001-39a957b9ddf9", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 2.5" ] }, { "cell_type": "markdown", "id": "f6eadfb9-baa5-4d4d-a4d3-ac5e20ce604d", "metadata": {}, "source": [ "Initialization of a random vector as right hand side:" ] }, { "cell_type": "code", "execution_count": 64, "id": "99588fcb-5072-409a-966b-52a5ab563ebc", "metadata": {}, "outputs": [], "source": [ "num = big_l + 1\n", "b = np.random.random((2*num))" ] }, { "cell_type": "markdown", "id": "de95a2c2", "metadata": {}, "source": [ "Calling of the functions to be compared" ] }, { "cell_type": "code", "execution_count": 65, "id": "09543049-6703-44f5-a8fb-ecd8f502c6a8", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_j_linear_operator(big_l, r) # azimuthal = True\n", "matrix = selfinteractions.a_j_matrix(big_l, r) # azimuthal = True" ] }, { "cell_type": "markdown", "id": "fac7b797", "metadata": {}, "source": [ "Solving of the iterative system:" ] }, { "cell_type": "code", "execution_count": 66, "id": "350ce24e-8060-42d8-bf30-34b072d3f8ad", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "norms = []\n", "\n", "def callback_function(pr_norm):\n", " norms.append(pr_norm)\n", " return 0.\n", "\n", "solution, info = scipy.sparse.linalg.gmres(\n", " linear_operator, b,\n", " rtol=10**(-9),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "bc99488c", "metadata": {}, "source": [ "Solving of the direct system:" ] }, { "cell_type": "code", "execution_count": 67, "id": "6fedecc6-b954-4c5d-8095-526da7cf889f", "metadata": {}, "outputs": [], "source": [ "solution2 = np.linalg.solve(matrix, b)" ] }, { "cell_type": "markdown", "id": "953a6a3b", "metadata": {}, "source": [ "Difference between solutions:" ] }, { "cell_type": "code", "execution_count": 68, "id": "4d16dced-2d36-4248-8785-4c9f5c5c00b1", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.105814259841454e-16\n" ] } ], "source": [ "print(np.linalg.norm(solution2 - solution))" ] }, { "cell_type": "markdown", "id": "dfbc1cf1-c602-4376-a4a9-60ccd31b2837", "metadata": {}, "source": [ "Which means that solving the numpy array from `a_j_matrix` and the linear operator from `a_j_linear_operator` can be used to solve the same linear system." ] }, { "cell_type": "markdown", "id": "befaceaa-e957-47a5-a6a4-e1c8b11acc8f", "metadata": {}, "source": [ "Let us see what happens with `azimuthal=False`." ] }, { "cell_type": "markdown", "id": "99afe4c6", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 69, "id": "8ba29641-a50e-4109-955c-52ad3478fcca", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 2.5" ] }, { "cell_type": "markdown", "id": "4c1b3741", "metadata": {}, "source": [ "Initialization of a random vector as right hand side:" ] }, { "cell_type": "code", "execution_count": 70, "id": "28d37721-98a5-44e6-b7a4-ed49e06114d4", "metadata": {}, "outputs": [], "source": [ "num = (big_l + 1) ** 2\n", "b = np.random.random((2*num))" ] }, { "cell_type": "markdown", "id": "529b08ec", "metadata": {}, "source": [ "Calling of the functions to be compared" ] }, { "cell_type": "code", "execution_count": 71, "id": "50423891-da8a-49bf-8d10-6d572cd02573", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_j_linear_operator(big_l, r, False)\n", "matrix = selfinteractions.a_j_matrix(big_l, r, False)" ] }, { "cell_type": "markdown", "id": "8e5a5e63", "metadata": {}, "source": [ "Solving of the iterative system:" ] }, { "cell_type": "code", "execution_count": 72, "id": "c22dcddf-a94d-4878-8b52-c2188663716c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "norms = []\n", "\n", "def callback_function(pr_norm):\n", " norms.append(pr_norm)\n", " return 0.\n", "\n", "solution, info = scipy.sparse.linalg.gmres(\n", " linear_operator, b,\n", " rtol=10**(-9),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "5e1ecf73", "metadata": {}, "source": [ "Solving of the direct system:" ] }, { "cell_type": "code", "execution_count": 73, "id": "6c12492e-f484-4efa-ba0f-885c4bb6cf38", "metadata": {}, "outputs": [], "source": [ "solution2 = np.linalg.solve(matrix, b)" ] }, { "cell_type": "markdown", "id": "6d7c3422", "metadata": {}, "source": [ "Difference between solutions:" ] }, { "cell_type": "code", "execution_count": 74, "id": "6bf23007-1adf-4bc2-ad52-422408fd0994", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.588362622561678e-16\n" ] } ], "source": [ "print(np.linalg.norm(solution2 - solution))" ] }, { "cell_type": "markdown", "id": "877a287f-9cdb-43e7-896b-4fb809f80647", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "#### Comparing the azimuthal version against the no azimuthal" ] }, { "cell_type": "markdown", "id": "6cdf014a-d460-45a5-9946-bbb9e277fdee", "metadata": {}, "source": [ "For a right hand with azimuthal symmetry when extended by 0 to explicitly compute the result without considering the symmetry, the result should be the same with the azimuthal and the not azimuthal versions." ] }, { "cell_type": "markdown", "id": "8c7af0ab", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 75, "id": "618b4f85-55f3-45b7-82ce-8f5ec23e9dd4", "metadata": {}, "outputs": [], "source": [ "big_l = 5\n", "r = 2.3" ] }, { "cell_type": "markdown", "id": "b80af83d", "metadata": {}, "source": [ "Initialization of a random vector as right hand side, and its extension by zero:" ] }, { "cell_type": "code", "execution_count": 76, "id": "ed20c428-c40a-4204-aa77-85b7f157ce28", "metadata": {}, "outputs": [], "source": [ "import biosspheres.miscella.extensions as extensions\n", "num = (big_l + 1)\n", "b = np.random.random((2 * num))\n", "b_2_1 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, b[0:num])\n", "b_2_2 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, b[num:2 * num])\n", "b2 = np.concatenate((b_2_1, b_2_2))" ] }, { "cell_type": "markdown", "id": "f90f49e3", "metadata": {}, "source": [ "Calling of the function with `azimuthal=False`:" ] }, { "cell_type": "code", "execution_count": 77, "id": "3d9b3f2a-362e-406d-be78-18d9c9ec1341", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_j_linear_operator(big_l, r, False)" ] }, { "cell_type": "markdown", "id": "c5c6f356", "metadata": {}, "source": [ "Solving of the iterative system:" ] }, { "cell_type": "code", "execution_count": 78, "id": "5664ebf7-2cda-4781-a42e-962053e2dd87", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "norms = []\n", "\n", "def callback_function(pr_norm):\n", " norms.append(pr_norm)\n", " return 0.\n", "\n", "num = (big_l + 1)**2\n", "solution, info = scipy.sparse.linalg.gmres(linear_operator, b2,\n", " rtol=10**(-13),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm')\n", "print(info)" ] }, { "cell_type": "markdown", "id": "5cbf685f", "metadata": {}, "source": [ "Calling of the function with `azimuthal=True`:" ] }, { "cell_type": "code", "execution_count": 79, "id": "909348ef-a0d0-40ff-b994-66325c0f719a", "metadata": {}, "outputs": [], "source": [ "linear_operator = selfinteractions.a_j_linear_operator(big_l, r) # azimuthal = False" ] }, { "cell_type": "markdown", "id": "043397f2", "metadata": {}, "source": [ "Solving of the iterative system:" ] }, { "cell_type": "code", "execution_count": 80, "id": "e9871f6d-5fbb-4071-9df7-8ff9f03e59e0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "num = (big_l + 1)\n", "norms = []\n", "\n", "solution2, info = scipy.sparse.linalg.gmres(\n", " linear_operator,\n", " b,\n", " rtol=10**(-13),\n", " restart=(2 * num)**3,\n", " callback=callback_function,\n", " callback_type='pr_norm',\n", ")\n", "print(info)" ] }, { "cell_type": "markdown", "id": "e41de566", "metadata": {}, "source": [ "Comparison of the solutions:" ] }, { "cell_type": "code", "execution_count": 81, "id": "c6d9f728-6380-4456-a6bd-9e04eb13a772", "metadata": {}, "outputs": [], "source": [ "solution2_1 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, solution2[0:num])\n", "solution2_2 = extensions.azimuthal_trace_to_general_with_zeros(\n", " big_l, solution2[num:2 * num])\n", "solution2 = np.concatenate((solution2_1, solution2_2))" ] }, { "cell_type": "code", "execution_count": 82, "id": "cf12485f-f935-4f6a-bd99-f9e9c749702d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6.799253034645712e-17\n" ] } ], "source": [ "print(np.linalg.norm(solution2 - solution))" ] }, { "cell_type": "markdown", "id": "ebce6e7b-0d03-40c8-9ed0-053ff1e87690", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `a_0_a_n_sparse_matrices`" ] }, { "cell_type": "markdown", "id": "1b9147e5-e108-4d1f-95e2-cb44ec6fcf02", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "5e821f09", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 83, "id": "3a8a42e3-f3c0-4f36-9877-155cfc3c01ea", "metadata": {}, "outputs": [], "source": [ "n = 2\n", "big_l = 5\n", "r = 1.3\n", "radii = np.ones(n) * r" ] }, { "cell_type": "code", "execution_count": 84, "id": "8b766e3d-4a15-479b-bc05-96d233841850", "metadata": {}, "outputs": [], "source": [ "sparse_big_a_0_self, sparse_big_a_n = selfinteractions.a_0_a_n_sparse_matrices(n, big_l, radii) ## azimuthal = False" ] }, { "cell_type": "code", "execution_count": 85, "id": "54c53e8a-add9-49f3-b787-0846a3a863e2", "metadata": {}, "outputs": [], "source": [ "sparse_big_a_0_self, sparse_big_a_n = selfinteractions.a_0_a_n_sparse_matrices(n, big_l, radii, azimuthal=True) ## azimuthal = False" ] }, { "cell_type": "markdown", "id": "fc061097-e646-45b3-b10c-598f68398c1e", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "## `reduced_a_sparse_matrix`" ] }, { "cell_type": "markdown", "id": "87203a1d-7ca1-47f3-95fa-9d8eb6a86d93", "metadata": { "jp-MarkdownHeadingCollapsed": true }, "source": [ "### Example" ] }, { "cell_type": "markdown", "id": "16c2bfc5", "metadata": {}, "source": [ "Definition of parameters:" ] }, { "cell_type": "code", "execution_count": 86, "id": "ff15155c-aec9-450b-9fce-4f88b57af9bb", "metadata": {}, "outputs": [], "source": [ "n = 2\n", "big_l = 5\n", "r = 1.3\n", "radii = np.ones(n) * r\n", "pi0 = 0.5\n", "pii = np.ones(n) * pi0" ] }, { "cell_type": "code", "execution_count": 87, "id": "a0165b2a-a421-4391-b204-2246323d3ee7", "metadata": {}, "outputs": [], "source": [ "reduced_a = selfinteractions.reduced_a_sparse_matrix(n, big_l, radii, pii) # azimuthal = False" ] }, { "cell_type": "code", "execution_count": 88, "id": "c62b47ae-87e2-44b0-a469-6f3f4a5050d5", "metadata": {}, "outputs": [], "source": [ "reduced_a = selfinteractions.reduced_a_sparse_matrix(n, big_l, radii, pii, azimuthal=True)" ] }, { "cell_type": "code", "execution_count": null, "id": "f60d4da4-59a2-4b62-b2d0-755d23e3a194", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.18" } }, "nbformat": 4, "nbformat_minor": 5 }