Skip to content
Snippets Groups Projects
test_fd_derivation_via_rotation.ipynb 5.48 KiB
Newer Older
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from pystencils.session import *\n",
    "from pystencils.fd.derivation import *"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2D isotropic stencils\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "stencil_2D = ((0, 0),\n",
    "              (0, 1), (0, -1), (-1, 0), (1, 0),\n",
    "              (-1, 1), (1, 1), (-1, -1), (1, -1))\n",
    "f = ps.fields(\"f: [2D]\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "Isotropic_Gradient = list()\n",
    "deriv_x = FiniteDifferenceStencilDerivation((0, ), stencil_2D)\n",
    "\n",
    "deriv_x.assume_symmetric(0, anti_symmetric=True)\n",
    "deriv_x.assume_symmetric(1, anti_symmetric=False)\n",
    "\n",
    "deriv_x.set_weight((0, 0), sp.Integer(0))\n",
    "deriv_x.set_weight((1, 0), sp.Rational(1, 3))\n",
    "deriv_x.set_weight((1, 1), sp.Rational(1, 12))\n",
    "\n",
    "res_x = deriv_x.get_stencil(isotropic=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "Isotropic_Gradient = list()\n",
    "deriv_y = FiniteDifferenceStencilDerivation((1, ), stencil_2D)\n",
    "\n",
    "deriv_y.assume_symmetric(0, anti_symmetric=False)\n",
    "deriv_y.assume_symmetric(1, anti_symmetric=True)\n",
    "\n",
    "deriv_y.set_weight((0, 0), sp.Integer(0))\n",
    "deriv_y.set_weight((0, 1), sp.Rational(1, 3))\n",
    "deriv_y.set_weight((1, 1), sp.Rational(1, 12))\n",
    "\n",
    "res_y = deriv_y.get_stencil(isotropic=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert res_x.apply(f.center) - res_y.rotate_weights_and_apply(f.center, (1, 0)) == 0\n",
    "assert res_y.apply(f.center) - res_x.rotate_weights_and_apply(f.center, (0, 1)) == 0"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3D isotropic stencils"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "stencil_3D = ((0, 0, 0),\n",
    "             (0, 1, 0), (0, -1, 0), (-1, 0, 0), (1, 0, 0), (0, 0, 1), (0, 0, -1),\n",
    "             (-1, 1, 0), (1, 1, 0), (-1, -1, 0), (1, -1, 0),\n",
    "             (0, 1, 1), (0, -1, 1), (-1, 0, 1), (1, 0, 1),\n",
    "             (0, 1, -1), (0, -1, -1), (-1, 0, -1), (1, 0, -1),\n",
    "             (1, 1, 1), (-1, 1, 1), (1, -1, 1), (-1, -1, 1), (1, 1, -1), (-1, 1, -1), (1, -1, -1),\n",
    "             (-1, -1, -1))\n",
    "f = ps.fields(\"f: [3D]\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "deriv_x = FiniteDifferenceStencilDerivation((0, ), stencil_3D)\n",
    "\n",
    "deriv_x.assume_symmetric(0, anti_symmetric=True)\n",
    "deriv_x.assume_symmetric(1, anti_symmetric=False)\n",
    "deriv_x.assume_symmetric(2, anti_symmetric=False)\n",
    "\n",
    "deriv_x.set_weight((0, 0, 0), sp.Integer(0))\n",
    "deriv_x.set_weight((1, 1, 1), sp.Rational(1, 3360))\n",
    "\n",
    "res_x = deriv_x.get_stencil(isotropic=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "deriv_y = FiniteDifferenceStencilDerivation((1, ), stencil_3D)\n",
    "\n",
    "deriv_y.assume_symmetric(0, anti_symmetric=False)\n",
    "deriv_y.assume_symmetric(1, anti_symmetric=True)\n",
    "deriv_y.assume_symmetric(2, anti_symmetric=False)\n",
    "\n",
    "deriv_y.set_weight((0, 0, 0), sp.Integer(0))\n",
    "deriv_y.set_weight((1, 1, 1), sp.Rational(1, 3360))\n",
    "\n",
    "res_y = deriv_y.get_stencil(isotropic=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "deriv_z = FiniteDifferenceStencilDerivation((2, ), stencil_3D)\n",
    "\n",
    "deriv_z.assume_symmetric(0, anti_symmetric=False)\n",
    "deriv_z.assume_symmetric(1, anti_symmetric=False)\n",
    "deriv_z.assume_symmetric(2, anti_symmetric=True)\n",
    "\n",
    "deriv_z.set_weight((0, 0, 0), sp.Integer(0))\n",
    "deriv_z.set_weight((1, 1, 1), sp.Rational(1, 3360))\n",
    "\n",
    "res_z = deriv_z.get_stencil(isotropic=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert res_x.apply(f.center) - res_y.rotate_weights_and_apply(f.center, (1, 0)) == 0\n",
    "assert res_x.apply(f.center) - res_z.rotate_weights_and_apply(f.center, (2, 1)) == 0\n",
    "\n",
    "assert res_y.apply(f.center) - res_x.rotate_weights_and_apply(f.center, (0, 1)) == 0\n",
    "assert res_y.apply(f.center) - res_z.rotate_weights_and_apply(f.center, (0, 2)) == 0\n",
    "\n",
    "assert res_z.apply(f.center) - res_x.rotate_weights_and_apply(f.center, (1, 2)) == 0\n",
    "assert res_z.apply(f.center) - res_y.rotate_weights_and_apply(f.center, (2, 0)) == 0"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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",
Markus Holzer's avatar
Markus Holzer committed
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}