{ "cells": [ { "cell_type": "markdown", "id": "1db361e8-c46f-4538-ab59-0fdc873abcee", "metadata": {}, "source": [ "# Animation of two-axis tracker shading\n", "\n", "```{post} 2022-11-09\n", ":tags: open science, pvlib, solar\n", ":author: Adam R. Jensen\n", ":image: 1\n", "```\n", "In this blog post I'll show how to create an animation demonstrating self-shading of a two-axis tracker within a solar collector field.\n", "\n", "Spoiler, the animation looks like this:\n", "\n", "![gif demonstrating shading during one day](../images/shading_demonstration.gif \"shading\")\n", "\n", "Shading of two-axis trackers can be simulated using the free and open-source python package [twoaxistracking](https://twoaxistracking.readthedocs.io/). I developed the package as part of my PhD as there were no free tools available that could achieve this. The package is documented in two journal articles: [10.1016/j.solener.2022.02.023](https://doi.org/10.1016/j.solener.2022.02.023) and [10.1016/j.mex.2022.101876](https://doi.org/10.1016/j.mex.2022.101876).\n", "\n", "First, load the necessary pacakges" ] }, { "cell_type": "code", "execution_count": 1, "id": "824444cd-ff77-4340-856e-77571b4a329b", "metadata": { "tags": [] }, "outputs": [], "source": [ "import twoaxistracking\n", "from shapely import geometry\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import matplotlib.patches as mpatches\n", "import pvlib\n", "import imageio\n", "import glob" ] }, { "cell_type": "markdown", "id": "069339c3-0852-47f3-89cb-07d93eea0564", "metadata": {}, "source": [ "## Define collector geometry\n", "\n", "The collector is defined by two geometries: the *total collector area*t, which corresponds to the outer edges of the collectors (gross area), and the *active collector area*, which corresponds to the parts of the collector responsible for power production." ] }, { "cell_type": "code", "execution_count": 3, "id": "38adc9e7-0757-47f8-a261-7f4ecdfc3f2c", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "total_collector_geometry = geometry.box(-1, -0.5, 1, 0.5)\n", "total_collector_geometry" ] }, { "cell_type": "code", "execution_count": 4, "id": "f64126f0-ec0b-48e7-a1d5-0bed8df4b4c3", "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "active_collector_geometry = geometry.MultiPolygon([\n", " geometry.box(-0.95, -0.45, -0.55, -0.05),\n", " geometry.box(-0.45, -0.45, -0.05, -0.05),\n", " geometry.box(0.05, -0.45, 0.45, -0.05),\n", " geometry.box(0.55, -0.45, 0.95, -0.05),\n", " geometry.box(-0.95, 0.05, -0.55, 0.45),\n", " geometry.box(-0.45, 0.05, -0.05, 0.45),\n", " geometry.box(0.05, 0.05, 0.45, 0.45),\n", " geometry.box(0.55, 0.05, 0.95, 0.45)])\n", "\n", "active_collector_geometry" ] }, { "cell_type": "markdown", "id": "96599f3c-61c8-42ad-966a-f88fc52ae3e6", "metadata": {}, "source": [ "## Define field layout\n", "\n", "The field layout used for this demonstration is a hexagonal field layout located on a sloped ground with a tilt of 5 degrees." ] }, { "cell_type": "code", "execution_count": 5, "id": "19cf7367-5493-4fde-89a2-b90123375889", "metadata": {}, "outputs": [ { "data": { "image/png": "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/zA9elg+Poeq8uWXX/L6xNfZ8fdOGl7dmKiWMQSEBpCblUvakVQOLTxAzskcRg4bwYjhI1xGW6oMuKNHFtqspp77tmuVrU1XvbwfKOwZPF1Vp1vsS5KqRpmPBUgseF6ozENAUIEktYg8CWSo6msisgqIBfKAr4EX1InBKRBUFJHfVPV8EfEHflTVSyz11YIh+w240NwORUR8gV9U9XwrNzgdnE7N/ri4OKZOn8r6LRsML3d/f2JjYxnQbwADBgzwakqTk5PDd999x4effcixE8fIyMggKjKa81q2Yvg9w2nRooVXfd+1axdTpk3h599+IelUIkFBQVSrUo1bB9xKv379HAbAtUpWVhZfffUVn339GSfiT5Cdk01UVDRtL2jD8GHDi7iIeML27duZPG0y23du59SpUwQHB1Ozek3uvPVOevfuXaF1+N3BHUMW1qymnvfOQJdl1vd81WV7IrIMx46njwOzChsuEUlU1SK/FKUYstqqekhEwjEM2UeqOttJPzaqansR+QEYDhwFNqpqI5cvsKC+RUPWWVVPms9jgFVniyFLTk5m9uzZfL94DidPJpCXn0dUVBTtL+7M0KH3Urt2bY/7paqsW7eO996bzP69f5OckkxYWCi1atXn9juG0r17d7ejBBUmISGB99+fyaqV8zl50piWRkdHc3nHngwZMtSrKEGqyooVK5g9axpxcXtJTU0lPCyMevUbc+dd99KpUyevjnAdPXqUd9+dxrq1y4zgI+JDTEwM3br348477ywREf2/gnuGrIZeMMm1IVvbY5zHCrEishPju39ERGpifO+bFytzs1nmHvP5NLPcp8XK3Qm0VVWHi6MiMgTD2J0HfACEAU+q6jQrfbXicPYyRvDMlRjT8k44WPSrbPz111+88carfP75Z3S9PJTb+vlSvYofvr5wMukki1f8zXmtXqdr186Mvv8xOnbsaLntnJwcZs6cyZTJr5GWeoKhtwUwoIc/4WE+pKWn8NeeOB59eCUj0oIYdu8DDBt2bxHH0NL47bffeOP1l/nm22+5uns4d13vS9VYX0Qg/mQC332/k2bNXuR/va/igTH/R5s2bSy3nZGRwbRp05g65XX8fVMZepsft14dQHiYDympKWzfsZ9hdy/B1z+Ke4c/xJAhQ9w6CrR+/XrefONllny/lBv6hDP0Jl9io33Jz4cTCfF8veBlnn32/7j++usZM+YxWrZsabnt/xoi4Fu+ChfzgIHAK+bfbx2UWQK8VGiBvwfwmIj4AVGqGm9OE6/GcKovgYj4AMnmGtsPgKVRWJE2rHiXm9a4nfl0o6p658lZxrg7Ilu0aBF33D6A4XcGc/dtYdSq4diep6Tm89HXKbz8djqj73+chx56pNRRSHJyMv2v/x85GX/w6KggunUMwcenZB1VZcPPmYyfnMH+w1WZv2C500jghfn444954P57GHNPKINuDqNKrOMp1cnEPGZ/kcq4yem89PKbDBpUeiDa48ePc02f7sRGHmLs8GAuvzjI4etVVVatzeDVdzLJymvEN98usbQ29c47b/PSi4/z6MgQbr8hjMgIx30/diKX9z5O5a0Z6Ux/90OuvfbaUts+W3BnRBbevIa2mXybyzKrr5zgzYgsFvgCqAfsBwao6kkRaQsMU9UhZrlBwP+Z1V5U1fdFJBTDKPljaBkuA8aoqkOfGhHZ7E1sAaeGTERaqOoOEXF41klVf/b0pmWNO4Zs4cKFDLprAF+/F82lba2tZ8UdyuF/tyVy060P8MQTTzstl56eTtcul3JhiyO8/WIkfn6lT71UlZffSuaDL/1Zt/4Xl9PB2bNn8cT/jWL+R9G0amFtFLRzVzb/u+0kYx99hWHDnGvwJyYm0uGy1lzbK53nxkZYmjbm5ysPP5fMqvXR/PDjJpfRkV5/fTxTJ7/Awo9jaFTfmuDjll8z6XtnIm9PfJ/+/ftbqlPZcceQRTSvru2mupa1X9H1jcoSfOQVjE2Jz4G0gvyCJa1S67swZNNVdag5pSyOqmpXD/pbLlg1ZH/++SedOrbn21lRXNLGvUX5I8dy6dAnnvET3uOGG25wWOamG/vir+v44K1It9ePnhqXzIp1NVnz0xaH62br16+n7zVXsvzLWFo2d0/VYdfebK64Np5PPv2OLl26lLiuqlzZrQMXNNvNa89EutW2qnLvI6c4cvJ8vpvvcObAwoULGXr3jaz5tgr16rinWvvL75lcdUsiS77/gYsuusitupURdw3ZxdOcx20AWNblzcpiyBydqdOyXOwPUtXM0vLOJFYN2aBBt9K4+lIeGx3l0X2Wrk7j4ReC+PW3XSUM1Z9//knXLu3Ys6EGgYHuL+CrKu16neTlcZ+UON8IcE2fblzdeRtDbnXP0BTwyZxkPvi6IcuWrytx7ccff2To4Gv4fVUVh9Pg0sjNVZpeeow536x0uB53ycXn8ci9CfTt5b7GP8Db755iw/ZL+fSzbzyqX5lwx5BFNq+ul0y/2WWZ7zu/VVkMmVd2xso3bq3FvApNYmIic+fOZfCtnn2ZAK7sFEJ21kl++umnEtcmT36LQTeFeGTEwHBgHXaHH5MnlQxWsm/fPtauXc8t13oujd3/6nC2bfudHTt2lLg2edIEht0R4JERA/DzE+65PZjJk98ocW3Lli0cObyfq7uHetQ2wMAbw1i85HuOHq1QS7NnHgE/yXeZKhFe2RlX4eBqiEgbIFhELhKR1mbqDJSNROhp5P33Z9K7WzjVqniuLyYiDLs9gMmTJhTJT01N5eOPP+Lu2zz/sgLcfG04a9b8xP79RY/9TJ06idv6hxES4rmrRkCAMOjmUCZPfqtI/tGjR1m85Htuv8FzAw8w6JZQ5syZU0StFmDy5De45/ZgfH09d9WIjPCl/9XhzJhhyY/zP4OU/xGlcqes7Iyrb0ZP4DWMowKvAxPMNIZ/dygqDQvnf8FN/bxX9r752lDmL1hcJG/t2rWc1yLE7fWf4oSG+HB1j3AWLy7a/qKFc7ipn/dqpzdfG8TCBUV30JctW0a3jhFERXrnUFqtih+Xto0oEcdz4YIF3HSt9797N1/rz4L5X3jdztmEAH4++S5TJaCwnZlQKD2AG3bG6TdbVWcBs0Tk+tOpPyYiz2Ao0hbo5/yfqi70tt2EkwnUrOa993eVWF/S07PJycn5R70hISGBGtXLxrO8RtX8f5xbC0hISKJmNe/P6deo6sfJYhr8CQkJ1KxWNr/cNapSpO+qSsLJFGpU9T7QSo2qfpw8meR1O2cblWHU5YqysjNODZmI3KaqHwENRKSEuJOqvu7pTS3whqo6jmzrITk5uZbcIUpDRPDz8yliyHJycvDzLZsPlL+flojHWFZ99/eH7OyiB8dzcnLw8yujvvtTou95efll2Hf3JYnOZkS0sq2DOcXbwZKrqWXBgk8YEO4gVSqio6JITHJf36o4GRnGB6fwmcro6GgSLUfgc03iKd8S8jnR0RFl0vfEpHxioouuhRl9L5sYNImnpEjfRYTIyBCSTnn/ZUtMyicmxrMd27MZH8l3mf4ruIo0Ps38+6yjVM79GilGrLuZLsTchorIZhHZfOJE6SqurdtexrIfvf9F/351Oq0vOqeI+8UFF1zAhi3JpKV798HJz1eW/pBVwl+qdeu2LPvBe2+X71enl2i7TZs2rPgxnTwvoxdlZeXzw7qUku23Pp+lP1jXcnPG0tWZXNT6Yq/bOZsQzqpdS68o9adYRMaJSIQYOtrLReSEiLg+F1F6m8tEZJuD1Bcjckpj4ELgCMbCXwlUdbqqtlXVtlYOR997732890ka2dnefWGnzMpl+IixRfLq1atHhw6X8elcy/JJDlmxJoOg4Fg6dOhQJP/e4WOYMjvLq2AlqsrU2TkMH/FQkfwLL7yQ2nXqs2BZmpOa1pizMI1Wrc6jefMiZ4q5d/hDTJ1tXRzREXl5yrQPMxk+3LHa7n+Vs2HXsgARCRGRJ0XkXfN5U3e0D63MKXqoajLGoc99QBPgYU86W4CqXqmqrRykb1X1mKrmmbJB72KoTnpNixYtOPfcVsxZ6Hm4sb/3ZLN1W5bD4zLDRzzElFk5XhmbKbOyGT7i4RLOtpdffjmBQbGsWJPhcdvrt2SSmh5M9+7dS1wbPmIsU2Z5Z2wMI1nyY3HNNdew94Dy2x/WVWqLs2BZGrXr1Kd1a0uRwf4ziIC/T57LVIl4H8gCLjWfHwJesFrZiiEr2BD4H/ClqpbRapBjzAPqBVwLbCurtu9/4HGeHp9Owkn3/8G5ucoDT6cw9J5hBAWVjOTdo0cPsnIief8zzwzl96vSWLc5h9tuKznYFRFG3/9/PPZiukfT18zMfMY+l8ao+8Y6PP50ww03sH1nPvOWeNb3z75J4dDRAIfh1/z8/Bgx8gEefCbVo9HwqeQ8nnjFOLRvUxIf1GWqRDRW1XFADoCqpmPMni1hNYrSDqANsFyMgL3leTxpnIj8buqgdcHwJykT+vTpw7XXD6LvnYkknbJuzPLylHsfSSKXljz9tOMfCR8fH+Z+s5gnXsng28XuGYT1WzK4Y9Qpvvr6O6dyPoMGDeK8C3sxYGjSPxsOVsjKyufWEUnUbdiJkSNHOSwTFBTE3G8WcfeDKaxe69561pKVadz/ZBrfzluCn5/jTfCxYx8lNLI1gx5IIifH+pcrJTWf6wcncUXXAf+ZYCLuICh+PnkuUyUiW0SCwbC+ItIYY4RmCSvBRx7FCNPUVlVzME6m9/Wsr6Wjqrer6nmqer6qXqOqR8qy/VdemUCbiwfQqV8CW34t3R7vi8vhusGJHDjWnK++XuAw8k8BzZs357v5SxnxWCavTT5Feimjp+xs5f3PTtF3YBIfzPrCpca/iDD93VnEVu/MlQNO8sfO0v/HO3dlc9UtifgGXcIHs1xr/Ldr147PPv+GG+9JZuqsU2Rlue57RkY+E2ec4q7705j7zSKXGv++vr589vm3JGeeT587Etm9L9tp2QJ+3Z5Fl+sSaNisN2+/PcUrEcezGV/UZapEPAMsBuqKyMcYwU7GuqxRCCuL/f7AbcDnIvIVMBhIcF2r4uLj48Pbb09h1P0vc8PQLC7930lmfZFcZJSTl6csWp7GNQOTaN8rnpYX3MGChSschl4rTrt27Vjz02bW/HIeDdodYczTp9i5K7vI2lncoRyeHneKhu2P8NE39Vm8ZBW9e5ceOtTf358PP/qS6waMpcdNKXS9PpEv5qUUmbLl5ChzF6bS46ZEulyfxJVXjeKLL+c5nA4Xp1u3bixf8RNzlzamQbujPP7yKfbF/bvTq6rs2pvN2OeSaNDuCIvXNGfV6vUlNiccERISwjffLuGSjndzWZ+T9L41ie++TyU399++Z2Xl88mcZDr1S6TPHWkMHPwkM2bMPmtkrMuas2lEpqrfA9cBdwKfYgycVrnTgMsEzMCIoNLVTO8DM0qrdzpTmzZt1BNyc3N13rx52qtnR/X19dGIiECNjgpWX18fbX1Rc50xY4ampaV51Laq6t69e/XRRx/S6tUiNSDAV6vEhmhQkJ9GRoboiBF36/bt2z1uOzs7W7/44gu9olNb9fX10cjIII2KDFJfXx+97NIL9OOPP9bMzEyP29+xY4eOHj1co6NDNTDQT6vEhhh/q4TrQw+N1l27dnncdnp6us6aNUvbtztXfXxEoyKDNCIiUH19ffTKbpfqnDlzNCcnx+P2KzMYgX0sfe6rt4zWB7cOcJncae9MJuA7jMBGoZ7UtyLj86uqXlBa3pmkLIKP5Ofnk5ycTG5uLlFRUU7XezwlMzOT5ORkwsLCCA4OLtOpUl5eHqdOGXswkZGRZTqCUVUyMjJISUkhIiKizONF5ubmcurUKXx8fIiMjPQqhsHZgDsyPjXPjdaBn3ZzWebVC76uLDI+VwA3YmwqbgI+A+arRRkfK9/WPBFprKq7zRs2wgjvdFbh4+NTrgEvgoKCLE3vPMHXt+RpgLJCRAgJCSEkpHwET/z8/IiN9f4s5n8VX84Op1dVXQ2sNqO0dcU4bz0TsHTI2IohexhYKSJ7MLZD6wOug+nZ2NiUO0LlPzReGHPXsg/GyKw1/wYHLpVSDZmqLheRpkCBy/ZOVfXcu9HGxqZMEBR/OTsmRyLyBYbz+2LgHWC1mrF0rVCqIRORIIyAmZdj+Hj8KCJTrc5dbWxsyg/fcjxPacaw/RxogHGqZ4AaIduKl1sMXAKsUdWrC+U3xFjrigW2ALerqjPfm/eAm9VJlKXSsLKyOhs4F5iIYSnPBT705GY2NjZlh4gxInOVvORRYLmqNsXw63IWz3Y8cLuD/FcxJLmaAIkYrlvFXoMUBDEKBfqKyHWFk9WOWlkja6WqhaOkrhSRP6zewMbGpnww1sjKdbG/L9DZfDwLWAU8UryQufzUuXCeGNvyXYGCME+zMJxepxSrfgWwAmNtrETTwBwrHbViyH4WkUtUdb3ZwYsB73wdbGxsvMbiGlkVESn8fZ2uqlaDH1TXf0/WHAWqu9G9WCBJVQvUCA4CtYsXUtWCQLHPqWqRkHDm1NQSVgxZG2CtiBwwn9cDdorI70Y/9HyrN7OxsSlbLLhfxLvyIxORZUANB5eKnNJXVRUp1y3SrzF2KgvzFYb9KRUrhqyXuz2ysbEpf8pi11JVr3TavsgxEampqkdMVZrjbjSdAESJiJ85KquDIc1T/B4tMNbdI4utiUUAlh0vrbhf7C+tjI2NzelHKN9dS2AeMBB4xfz7revi/2KO4FYC/TF2Lp3Vb46hdRhF0XWyFAynWEuU7TkcGxub00bBrmU58grwhYgMBvYDA4z7SltgmKoOMZ//CLQAwkTkIDBYVZdgbAx8JiIvAL9guFgUQVW/Bb4VkUtVdZ2nHbUNmY1NJcanHI8oqWoCUOIwp6puBoYUet7RSf09WFd4/kVERmBMM/+ZUqrqICuVXfqRiYivOTy0sbGpYPigBEiey1SJ+BBj06EnsBpjTc1yEAyXhsz0ss0XETsOl41NBeQsCgfXRFWfBNLUCNr7P8By2CwrU8tU4HcRWYqhDguAqt7nbk9tbGzKDjFHZGcJBQqeSSLSCsNvrZrVylYM2Rwsetfa2NicPoTyXSM7zUw3Y9g+ibFbGgY8ZbWyFfeLWaa8Rj1V3elxN21sbMoUY0TmXRi/ioKqzjAfrgYauVvfivpFH+A1IABoKCIXYhwnKBn7y8bG5rRSyUK+lUBExri6rqqvW2nHytTyGYwt1FVmw1tNlVgbG5sziIiWt0Ps6SC8LBqxYshyVPVUMY35Sv/u2dhUdgTwr+Sq86r6bFm0Y0WPbLuI3AL4ikhTEZkIrC2Lm9vY2HiDMSJzlSoLItJMRJaLyDbz+fki8oTV+lYM2SgMb9ss4BMgGRjtSWdtbGzKDgH8Jd9lqkS8CzyG6Yahqr8BN1mtbGVqebOqPk4hWQ8ReQXnapE2NjanAUHPmihKQIiqbiy2hGV5S9aKIbteRDJV9WMAEXkHKNvghjY2Nm5TMCI7S4gXkcYYqrCISH/giOsq/2LJkAHzRCQfQ5ssSVVLaG/b2NicXgTwreTuF4UYAUwHWojIIWAvcKvVyk4NmRlBpYAhwDfAT8CzIhKjqic96q6NjU2ZYIzIzg5DZiplXCkioRhr9+kYa2SW9BBdjci2YAzzpNDf/5lJ8cD71sbGpizRSj8iE5EIjNFYbQzhxWXm8weB34CPrbTj1JCpqmXhfxsbm9OPCPhL6eUqOB9ihIpbh6EI+zjGoOlaVd1qtRErR5RGAB+rapL5PBpjJ3Oy+322sbEpKwTBl0pvyRqp6nkAIjIDY4G/nrsBwK34kd1dYMQAzEjDlrW0bWxsygdjjUxcpkpAgXxPgf7hQXeNGFgzZL5SyLlDRHwxDpB7jIjcICLbRSTf1P8ufO0xEdklIjtFpKc397GxOdvxQVymSsAFIpJsphTg/ILHIpJstREr7heLgc9FZJr5/B4zzxu2AdcB0wpnikhLjJ2Kc4FawDIRaWZaahsbm0IYZy2tjEUqLqrqWxbtWHkXHgFWAveaaTkw1pubquqfTrTN+gKfqWqWGXV4F9aDF9jY/KcQBF9xnbxqXyRGRJaKyN/m32gn5RaLSJKIzC+W/4GI7BWRrWa60KsOuaBUQ6aq+ao6RVX7m2laOY6QagNxhZ47DLMOICJDRWSziGw+ceJEOXXHxqbiIoAfvi6TlzwKLFfVphgDGGfHEscDtzu59rCqXmimrd52yBmlGjJT8eIrEflDRPYUJAv1lonINgepb1l0XFWnq2pbVW1btWrVsmjSxqaSIfiKj8vkJX2BWebjWUA/R4VUdTluRDwqD6yskb0PPA28AXQB7sLaSM5pKHYXHALqFnruMMy6jY0N/Pxb1hL/mrurlFIsSEQ2F3o+XVWnW7xFdVUtOO94FKjudifhRRF5CnNEp6pZHrRRKlYMWbCqLhcRUdX9wDMisgU3AgO4wTzgExF5HWOxvymwsRzuY2NT6VHVXt62ISLLMOJJFufxwk9UVUXcPg/1GIYBDMA4R/kI8Jwn/SwNK4YsS0R8gL9FZCTGCCnMm5uKyLXARKAqsEBEtqpqT1XdLiJfAH9gSHiMsHcsbWzKD1czJxE5JiI1VfWIiNQEjrvZdsFoLktE3gce8qKrLhFV10ZWRNoBfwJRwPNABDBeVdeXV6fcRUROUPJwaRUg/gx0x13sfpY9laWvjvpZX1UrxKKviIwHElT1FRF5FIhRVYceCyLSGXhIVa8ulFdgBAVjaSpTVctFx9ClITOdX19V1XKzpOWFiGxW1ballzyz2P0seypLXyt6P0UkFvgCqIcxUBigqidNJ/ZhqjrELPcj0AJjppYADFbVJSKyAmPWJcBWs05qefTVlYyPn6rmisjl5XFjGxubio2qJgDdHORvxpD2Knje0Un9ruXXu6K4WiPbCLQGfhGRecCXQFrBRVW1o4/b2NhUCKws9gdhDBe7UlSfrKIbMqtbzGcau59lT2Xpa2XpZ4XH6RqZiBwEXqeosGIBajUCsI2NjU1542pE5ouxeOfowFbllqW0sbE5q3A1IvtZVVuf5v7Y2NjYuI2ro0aVQsyoOJVR60xEnhGRQ4VUAnqf6T4VRkR6me/ZLtOfqEIiIvtE5HfzPdxceo3Th4jMFJHjYkbSNvMsqUvYlI4rQ1Zi27WSUKB19kPhzGJaZ72AyaafXEXhjUIqAQvPdGcKMN+jScBVQEvgZvO9rKh0Md/Diuaf9QHG564wVtUlbErBqSGrrOHebK2zMqc9sEtV96hqNvAZxntp4waq+gNQ/DtlSV3CpnQqt7yke1jWOjtDjBSR38wpSEWaYlT0960wCnwvIltEZOiZ7owFykJdwgZrfmQVDlcn9lX129PdHyuUojIwBeMcq5p/JwCDTl/vzhouV9VDIlINWCoiO8yRUIXHQ3UJG5NKacgqo9aZ1T6LyLvA/FILnj4qjUacqh4y/x4XkbkY0+KKbMi8Upew+Zf/0tRyHnCTiASKSEMqkNaZ+SEu4FqMDYuKwiagqYg0FJEAjA2TeWe4TyUQkVARCS94DPSgYr2PjpgHDDQfD8SItG3jAZVyROaKSqp1Ns4MzKDAPoxIVRUCUzhgJLAEw0l6pqpuP8PdckR1YK6hGIMf8Imqehvtq8wQkU+BzkAV89TM08ArwBciMhhTXeLM9bByU6oemY2NjU1F5780tbSxsTlLsQ2ZjY1Npcc2ZDY2NpUe25DZ2NhUemxDZmNjU+mptIZMRGILqUUcLaYeEeBhm/tEpLSAp6cNERkmIneYj+8UkVqFrs0oq8PbItLPDKJaJohIlIgML6v2yupepsrIQ+bj50TEE8fq4m1eWFitRESu8VQhRESqikiFcRmpTJwV7hci8gyQqqqvFcrzU9VcN9vZB7RVVbdCiXlyL3cRkVUY4bbKXJ5GRNYC17j7ul201wCYr6qtyqK9srqXo8+JgzK+7vgXisidGJ+ZkVbrlNLe+8AMVf2pLNr7r1BpR2SOEJEPRGSqiGzAcDJtLyLrROQXEVkrIs3Ncr4i8pqIbDMPao8q1k6wiCwSkbtNj/GZIrLRbKevWeZOEZknRsir5cXqNxCRHSLysYj8KSJfiUiIea2b2c7vZruBZv4rIvKH2Z/XzLxnROQhEekPtAU+NkecwSKySky9NRG52Wxvm4i8WqgfqSLyooj8KiLrRaTEoWQRaQZkFRgxc1TwtYhsMlMHM9/Ze3mu+d5sNfveFMPRs7GZN77Y/XxFZK8YRIlInoh0Mq/9ICJNXbznbt3LrPO4iPwlImuA5sU+K/3Nx/tE5FUR+Rm4QUR6mK/1ZxH5UkTCzHLtzNf+q9mPSIzI2Tea97/R/Fy8U+hzsMLs63IRqVfo3m+bbe0p6IfJN8CtxV+HTSmoaqVPwDMYUYw/wDin6GvmRwB+5uMrga/Nx/cCXxW6FmP+3Qc0AJYBd5h5LwG3mY+jgL+AUOBODCWIGAf9aYDhpd/BfD7T7F8QhpJEMzN/NnA/EAvs5N8RclTh12U+XoXxy0/h50At4ADGSQY/YAXQzyyjQB/z8TjgCQd9vQuYUOj5JxiHr8GIZ/hnKe/lROBW83EAEGy+/m0u/l+LMXThrsY4AvU4EAjsLeU9d+teQBvgdyDE7P+uQu/nB0D/Qv/3sebjKhjnM0PN548AT5n32wO0K/x+mJ+Ddwrd85/nwHfAQPPxIOCbQvf+EmMg0RJDJqmgfm3g9zP9naps6aw7ogR8qf9ODSKBWeYvtwL+Zv6VwFQ1p4NaVHvtW2Ccqn5sPu8BXCPm2gqGMapnPl6qznXb4vTf6cFHwH3AUowv619m/ixgBPAOkAm8JyLzce/QeDtglaqeABCRj4FOGL/s2YXa2gJ0d1C/JnCi0PMrgZYi/wgER5gjEmfv5TrgcRGpA8xR1b8L1XXGj2YfGwIvA3cDqzGMGjh/z929V0dgrqqmA4gR1tAZn5t/L8EwLj+ZbQeY920OHFHVTQCqmmy26er+l2KIfAJ8iPFjUsA3qpoP/FFspHwc48fJxg3OqqmlSVqhx88DK9VYP+mD8YUojZ+AXvLvJ1SA6/Vf9dZ6qvqng3sVp/jio9PFSNOgtscYJV6NMWIpC3LU/JkH8nB8tjaDou+LD3BJoddbW43o0A7fS1X9BLjGbGehiJQIympOb7eKyFYz6wcMI9MeWIgx6uqMYeDAyXtu5V5eUPC/FIwfqIJ7t1TVwWV4nwKyCj0ubA2DMF6fjRucjYasMJH8KzlzZ6H8pcA9IuIHhnZ6oWtPAYkY8s5gHJYeVWDYROQii/euJyKXmo9vAdZgTB8biEgTM/92YHXBiEcNiesHgAsctJcChDvI3whcISJVxJClvhljdGOVP4EmhZ5/D/yzZijGYXZw8l6KSCNgj6q+jTGaPb94X1X18QLDUKjPlwH5qpoJbMU4KF8guePwPbdyr2L8APQTY00xHMMAl8Z6oEPB/8hcr2uG8b+rKSLtzPxw8/Pj6v5rMdRCwFj3+tFJucI0o+KrdlQ4znZDNg54WUR+oehoZAbGutJvIvIrhqEpzGggWETGYYxE/M2y283nVtgJjBCRP4FoYIr5pb0L+FJEfgfygakYX4T5IvIbhsEb46C9D4Cp5sgmuCBTDYXRR4GVwK/AFnVPXPIH4KJCI9D7gLbmAvUfwDAz39l7OQDYZo62WgGzVTUBY2q2zdECvKpmYawVrjezfjTfg9/N587ec7fupao/Y0wZfwUW8e/U1SnmFP1O4FPz/7EOaKGGzPeNwETzM7MUY/S0EmMqvlVEbizW3CjgLrOd2zE+V6XRBVhgoZxNIc4K94uKhpxG94OyQETeAr5T1WVnui//dUTkB6Cvqiae6b5UJs72EZmNNV7C2NmzOYOISFXgdduIuY89IrOxsan02CMyGxubSo9tyGxsbCo9tiGzsbGp9NiGzMbGptJjGzIbG5tKz/8DMYJSO1GYSOwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "tracker_field = twoaxistracking.TrackerField(\n", " total_collector_geometry=total_collector_geometry,\n", " active_collector_geometry=active_collector_geometry,\n", " neighbor_order=2, # recommended neighbor order\n", " gcr=0.3,\n", " aspect_ratio=3**0.5/2,\n", " offset=-0.5,\n", " rotation=90, # counterclockwise rotation\n", " slope_azimuth=180, # degrees east of north\n", " slope_tilt=5, # field tilt in degrees\n", ")\n", "\n", "_ = tracker_field.plot_field_layout()" ] }, { "cell_type": "markdown", "id": "affa5b26-be2a-4f36-aab2-0b7f987e6214", "metadata": {}, "source": [ "## Calculate solar position\n", "\n", "The solar position is easily calculated using [pvlib](https://pvlib-python.readthedocs.io/)." ] }, { "cell_type": "code", "execution_count": 6, "id": "79400386-9b15-4324-88ec-45ae886a5928", "metadata": {}, "outputs": [], "source": [ "location = pvlib.location.Location(latitude=54.97870, longitude=12.2669)\n", "\n", "# Generate series of timestamps for one day\n", "timestamps = pd.date_range(start='2021-03-28 05:00', end='2021-03-28 17:45', freq='1min')\n", "\n", "# Calculate solar position\n", "solpos = location.get_solarposition(timestamps)" ] }, { "cell_type": "markdown", "id": "fa6d82de-c9ec-4156-a56c-19092970f43e", "metadata": {}, "source": [ "## Define plot function\n", "\n", "The following function defines the custom plot, which shows the shading conditions (example below). The main plot (left) shows the unshaded (green) and shaded (red) areas of the reference collector, as well as the projected shadows of the neighboring collectors.\n", "\n", "The solar elevation angle and the shaded fraction are plotted continuously on the left.\n", "\n", "![example plot of shading conditions](../images/twoaxistracking_example_plot.png \"shading example\")" ] }, { "cell_type": "code", "execution_count": 7, "id": "5541f0e8-d15a-4f98-9ac4-33a9eabfc958", "metadata": {}, "outputs": [], "source": [ "def plot_shading_conditions(shading_fractions, active_collector_geometry, unshaded_geometry,\n", " shading_geometries, min_tracker_spacing, save_path=None):\n", " # Create plot\n", " fig = plt.figure(figsize=(8, 3.5))\n", " ax0 = plt.subplot(121)\n", " ax1 = plt.subplot(222)\n", " ax2 = plt.subplot(224)\n", "\n", " # Create path collections\n", " active_patches = twoaxistracking.plotting._polygons_to_patch_collection(\n", " active_collector_geometry, facecolor='red', linewidth=1, alpha=0.5)\n", " unshaded_patches = twoaxistracking.plotting._polygons_to_patch_collection(\n", " unshaded_geometry, facecolor='green', linewidth=1)\n", " shading_patches = twoaxistracking.plotting._polygons_to_patch_collection(\n", " shading_geometries, facecolor='black', linewidth=0.5, alpha=0.35)\n", "\n", " # Plot path collections\n", " ax0.add_collection(active_patches, autolim=True)\n", " ax0.add_collection(shading_patches, autolim=True)\n", " ax0.add_collection(unshaded_patches, autolim=True)\n", "\n", " # Set limits and ticks for the main plot\n", " ax0.set_xlim(-min_tracker_spacing, min_tracker_spacing)\n", " ax0.set_ylim(-min_tracker_spacing, min_tracker_spacing)\n", " ax0.set_xticks([])\n", " ax0.set_yticks([])\n", "\n", " # Create legend for the main plot\n", " green_patch = mpatches.Patch(color='green', label='Unshaded area')\n", " black_patch = mpatches.Patch(color='black', alpha=0.35, label='Shading areas')\n", " red_patch = mpatches.Patch(color='red', label='Shaded area')\n", " ax0.legend(handles=[green_patch, black_patch, red_patch],\n", " frameon=False, handlelength=1)\n", "\n", " # Plot solar elevation\n", " ax1.plot(solpos.index[:len(shading_fractions)], solpos['elevation'].iloc[:len(shading_fractions)])\n", " ax1.set_xlim(solpos.index[0], solpos.index[-1])\n", " ax1.set_ylim(0, 45)\n", " ax1.set_yticks([0, 15, 30, 45])\n", " ax1.set_ylabel('Solar elevation')\n", "\n", " # Plot shading fraction\n", " ax2.plot(solpos.index[:len(shading_fractions)], shading_fractions)\n", " ax2.set_xlim(solpos.index[0], solpos.index[-1])\n", " ax2.set_ylim(-0.01, 1.01)\n", " ax2.set_ylabel('Shaded fraction')\n", " ax2.set_yticks([0, 0.25, 0.50, 0.75, 1.00])\n", "\n", " # Format xticks\n", " xticks = pd.date_range(start=solpos.index[0].round('1h'),\n", " end=solpos.index[-1], freq='3h')\n", " ax1.set_xticks(xticks)\n", " ax2.set_xticks(xticks)\n", " ax1.set_xticklabels([]) # Only have x-tick labels on bottom plot\n", " ax2.set_xticklabels(xticks.strftime('%H:%M'))\n", "\n", " # Make figure pretty\n", " fig.align_ylabels()\n", " fig.tight_layout(w_pad=2.0)\n", "\n", " # Save figure\n", " if save_path is None:\n", " plt.show()\n", " else:\n", " fig.savefig(save_path, bbox_inches='tight')\n", " plt.close()" ] }, { "cell_type": "markdown", "id": "4926ea82-07d5-45c5-a48a-5e1f728081d7", "metadata": {}, "source": [ "## Generate one plot for each timestep\n", "\n", "In order to create an animation, the individual plots first need to be generated. In the code block below, a unique plot for each timestep (solar position) is generated and saved." ] }, { "cell_type": "code", "execution_count": 8, "id": "f86eaf2d-78b9-4581-bba8-6d40d8f0c1bc", "metadata": {}, "outputs": [], "source": [ "shading_fractions = []\n", "\n", "for index, row in solpos.iterrows():\n", " # Calculate shading fraction and shading geometries\n", " sf, geometries = twoaxistracking.shaded_fraction(\n", " row['elevation'],\n", " row['azimuth'],\n", " tracker_field.total_collector_geometry,\n", " tracker_field.active_collector_geometry,\n", " tracker_field.min_tracker_spacing,\n", " tracker_field.tracker_distance,\n", " tracker_field.relative_azimuth,\n", " tracker_field.relative_slope,\n", " tracker_field.slope_azimuth,\n", " tracker_field.slope_tilt,\n", " max_shading_elevation=90,\n", " plot=False,\n", " return_geometries=True)\n", "\n", " # Append shading fraction to list\n", " shading_fractions.append(sf)\n", "\n", " # Generate and save plots\n", " _ = plot_shading_conditions(\n", " shading_fractions=shading_fractions,\n", " active_collector_geometry=tracker_field.active_collector_geometry,\n", " unshaded_geometry=geometries['unshaded_geometry'],\n", " shading_geometries=geometries['shading_geometries'],\n", " min_tracker_spacing=tracker_field.min_tracker_spacing,\n", " save_path=f\"GIF/{index.isoformat().replace(':','-')}.png\")" ] }, { "cell_type": "markdown", "id": "91977563-44bd-4399-bb6b-8873f323adf7", "metadata": {}, "source": [ "## Create GIF\n", "\n", "The last step is to combine all the individual images into a GIF.\n", "\n", "The file size of the GIF can be reduced significantly with hardly any reduction in quality. For example, the generated GIF was reduced from +6 MB to roughly 800 kB using http://gifgifs.com/optimizer/." ] }, { "cell_type": "code", "execution_count": 9, "id": "64e543a9-3f97-4124-bbdb-4ec3b3cbf7f7", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\arajen\\Anaconda3\\envs\\twoaxistracking\\lib\\site-packages\\ipykernel_launcher.py:5: DeprecationWarning: Starting with ImageIO v3 the behavior of this function will switch to that of iio.v3.imread. To keep the current behavior (and make this warning disappear) use `import imageio.v2 as imageio` or call `imageio.v2.imread` directly.\n", " \"\"\"\n" ] } ], "source": [ "# Get filenames of all images\n", "filenames = glob.glob(\"GIF/*\")\n", "\n", "# Load all images and append to list\n", "images = [imageio.imread(filename) for filename in filenames]\n", "\n", "# Save GIF\n", "imageio.mimsave('shading_demonstration.gif', images, duration=0.02)" ] }, { "cell_type": "code", "execution_count": null, "id": "1092a9cc-0686-4b2a-bcd9-586b3f18cedd", "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.10.9" } }, "nbformat": 4, "nbformat_minor": 5 }