HajimeKawahara/exojax

View on GitHub
documents/tutorials/hjerting.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The Voigt-Hjerting is defined as\n",
    "\n",
    "$ H(x,a) = \\frac{a}{\\pi} \\int_{-\\infty}^{\\infty} \\frac{e^{-y^2}}{(x-y)^2 + a^2} dy.$\n",
    "\n",
    "In exojax, hjert is the Voigt-Hjerting function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-16T23:30:10.469999Z",
     "iopub.status.busy": "2024-01-16T23:30:10.469380Z",
     "iopub.status.idle": "2024-01-16T23:30:12.854085Z",
     "shell.execute_reply": "2024-01-16T23:30:12.853671Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2024-10-02 10:26:59.239642: W external/xla/xla/service/gpu/nvptx_compiler.cc:765] The NVIDIA driver's CUDA version is 12.2 which is older than the ptxas CUDA version (12.6.20). Because the driver is older than the ptxas version, XLA is disabling parallel compilation, which may slow down compilation. You should update your NVIDIA driver or use the NVIDIA-provided CUDA forward compatibility packages.\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Array(0.3047442, dtype=float32)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from exojax.spec import hjert\n",
    "hjert(1.0,1.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can differentiate the Voigt-Hjerting function by $x$. $\\partial_x H(x,a)$ is given by"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-16T23:30:12.877610Z",
     "iopub.status.busy": "2024-01-16T23:30:12.877451Z",
     "iopub.status.idle": "2024-01-16T23:30:13.271833Z",
     "shell.execute_reply": "2024-01-16T23:30:13.271394Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Array(-0.19305044, dtype=float32, weak_type=True)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from jax import grad\n",
    "dhjert_dx=grad(hjert,argnums=0)\n",
    "dhjert_dx(1.0,1.0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "hjert is compatible to JAX. So, when you want to use array as input, you need to wrap it by jax.vmap. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2024-01-16T23:30:13.273558Z",
     "iopub.status.busy": "2024-01-16T23:30:13.273394Z",
     "iopub.status.idle": "2024-01-16T23:30:14.742807Z",
     "shell.execute_reply": "2024-01-16T23:30:14.742365Z"
    },
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f99da68bcd0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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+eWXeHt717dEERERcWEOG/PSo0cPxo4dy7Rp04iPj2fVqlXcd999TJw4sWamUWpqKt27dyc+Ph4wgsvo0aMpLi7mrbfeoqCggPT0dNLT06murnZUqSIiIuJEHLrOywcffMB9993HxRdfjNVq5brrruOll16q+XxlZSW7d++mpKQEgISEhJqZSJ07d671XgcPHiQ6OtqR5YqIiIgT0PYAIiIiYromsc6LiIiIiCMovIiIiIhTUXgRERERp6LwIiIiIk5F4UVEREScikOnSpvh2OQpbdAoIiLiPI793q7LJGiXCy+FhYUA2qBRRETECRUWFhIUFHTaa1xunRebzUZaWhoBAQFYLBazyzFdQUEBUVFRpKSkaN0bB9LXuXHo69x49LVuHPo6H2e32yksLCQiIgKr9fSjWlyu5cVqtdK2bVuzy2hyAgMDm/0/jMagr3Pj0Ne58ehr3Tj0dTacqcXlGA3YFREREaei8CIiIiJOReHFxXl5eTFz5ky8vLzMLsWl6evcOPR1bjz6WjcOfZ3PjssN2BURERHXppYXERERcSoKLyIiIuJUFF5ERETEqSi8iIiIiFNReGmGysvLiYuLw2KxsHnzZrPLcSmJiYlMnTqVDh064OPjQ6dOnZg5cyYVFRVml+YSXn75ZaKjo/H29mbw4MHEx8ebXZJLmTVrFgMHDiQgIIDWrVtz9dVXs3v3brPLcnnPPfccFouFhx56yOxSnIbCSzP0l7/8hYiICLPLcEm7du3CZrPx2muvsX37dv71r38xb948Hn30UbNLc3qLFi1i+vTpzJw5k4SEBPr06cOYMWPIzMw0uzSXsXz5cu69917Wrl3Ljz/+SGVlJaNHj6a4uNjs0lzW+vXree211+jdu7fZpTgVTZVuZr777jumT5/Op59+Ss+ePdm0aRNxcXFml+XSXnjhBV599VUOHDhgdilObfDgwQwcOJD//Oc/gLGPWVRUFPfffz+PPPKIydW5pqysLFq3bs3y5csZPny42eW4nKKiIvr168crr7zCM888Q1xcHC+++KLZZTkFtbw0IxkZGUybNo333nsPX19fs8tpNvLz82nZsqXZZTi1iooKNm7cyKhRo2rOWa1WRo0axZo1a0yszLXl5+cD6PvXQe69917GjRtX6/ta6sblNmaUk7Pb7dx2223cddddDBgwgMTERLNLahb27dvH3LlzmT17ttmlOLXs7Gyqq6sJCwurdT4sLIxdu3aZVJVrs9lsPPTQQwwbNozY2Fizy3E5CxcuJCEhgfXr15tdilNSy4uTe+SRR7BYLKd97Nq1i7lz51JYWMiMGTPMLtkp1fXr/HupqamMHTuW66+/nmnTpplUucjZuffee9m2bRsLFy40uxSXk5KSwoMPPsgHH3yAt7e32eU4JY15cXJZWVnk5OSc9pqOHTtyww038NVXX2GxWGrOV1dX4+bmxuTJk3n33XcdXapTq+vX2dPTE4C0tDRGjhzJkCFDmD9/Plar/p9wLioqKvD19eWTTz7h6quvrjl/6623kpeXxxdffGFecS7ovvvu44svvmDFihV06NDB7HJczueff84111yDm5tbzbnq6mosFgtWq5Xy8vJan5MTKbw0E8nJyRQUFNR8nJaWxpgxY/jkk08YPHgwbdu2NbE615KamsqFF15I//79ef/99/VDqIEMHjyYQYMGMXfuXMDo1mjXrh333XefBuw2ELvdzv3338/ixYtZtmwZXbp0Mbskl1RYWEhSUlKtc1OmTKF79+48/PDD6qarA415aSbatWtX62N/f38AOnXqpODSgFJTUxk5ciTt27dn9uzZZGVl1XwuPDzcxMqc3/Tp07n11lsZMGAAgwYN4sUXX6S4uJgpU6aYXZrLuPfee/nwww/54osvCAgIID09HYCgoCB8fHxMrs51BAQEnBBQ/Pz8aNWqlYJLHSm8iDSgH3/8kX379rFv374TQqEaOc/NhAkTyMrK4oknniA9PZ24uDiWLFlywiBeOXuvvvoqACNHjqx1/p133uG2225r/IJETkHdRiIiIuJUNIpQREREnIrCi4iIiDgVhRcRERFxKgovIiIi4lQUXkRERMSpKLyIiIiIU1F4EREREaei8CIiIiJOReFFREREnIrCi4iIiDgVhRcRERFxKgovIiIi4lT+H1lZ43p1C4fnAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import jax.numpy as jnp\n",
    "from jax import vmap\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# input vector\n",
    "x = jnp.linspace(-5, 5, 100)\n",
    "\n",
    "# vectorized hjert H(x,a)\n",
    "vhjert = vmap(hjert, (0, None), 0)\n",
    "\n",
    "# vectroized dH(x,a)/dx\n",
    "vdhjert_dx = vmap(dhjert_dx, (0, None), 0)\n",
    "\n",
    "plt.plot(x, vhjert(x, 1.0), label=\"$H(x,a)$\")\n",
    "plt.plot(x, vdhjert_dx(x, 1.0), label=\"$\\\\partial_x H(x,a)$\")\n",
    "plt.legend()"
   ]
  }
 ],
 "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.19"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}