{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Field layout discretization\n", "\n", "This notebook demonstrates how to uniformly discretize the field layout parameters.\n", "\n", "Import necessary packages:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "# The following libraries are not standard and have to be installed separately.\n", "# It is recommended to install shapely using conda.\n", "import pvlib\n", "from shapely import geometry" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Define collector aperture area\n", "\n", "First, it is necessary to define the collector aperture, as this determines the feasible range of ground cover ratios and aspect ratios. \n", "\n", "This example will be based on a square collector aperture, as defined below (other geometries are easily defined using shapely):" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collector area: 1.0\n", "Collector L_min: 1.41\n" ] }, { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Definition of aperture geometry using shapely\n", "collector_geometry = geometry.box(-0.5, -0.5, 0.5, 0.5)\n", "collector_area = collector_geometry.area\n", "\n", "# Calculate the minimum distance between trackers (L_min) - also called D_min\n", "L_min = 2*collector_geometry.hausdorff_distance(geometry.Point(0, 0))\n", "\n", "print(\"Collector area: %2.1f\"% collector_area)\n", "print(\"Collector L_min: %1.2f\"% L_min)\n", "collector_geometry" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Determine discrete simulation layouts\n", "The second step is to define the discrete GCRs to simulate and the step size for the discretization of the aspect ratios, offsets, and rotations.\n", "\n", "The discretization assumes that the parameters are simulated for the entire range, i.e., aspect ratios: [0.866, GCR max ], rotations: [0, 180), and offsets: [-0.5, 0.5]." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Determine range of gcrs\n", "gcr_step = 0.05\n", "gcr_start = 0.1\n", "# The maximum GCR depends on the collector aperture geometry\n", "gcr_max = collector_area / (L_min**2 * np.sqrt(1-(-0.5)**2))\n", "gcrs = np.round(np.hstack([np.arange(gcr_start, gcr_max, gcr_step), gcr_max]), 3)\n", "\n", "# Determine step size for discretization of the aspect ratio, offset, and rotation\n", "aspect_ratio_step = 0.05\n", "offset_step = 0.05\n", "rotation_step = 5\n", "\n", "# Calculate discrete rotations and offsets\n", "rotations = np.arange(0, 180, rotation_step)\n", "offsets = np.arange(-0.5, 0.5+offset_step, offset_step)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\n", "Generate a dataframe of unique feasible discrete layouts:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of unique layouts: 174960\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
gcraspect_ratiooffsetrotation
00.10.866025-0.50
10.10.900000-0.50
20.10.950000-0.50
30.11.000000-0.50
40.11.050000-0.50
\n", "
" ], "text/plain": [ " gcr aspect_ratio offset rotation\n", "0 0.1 0.866025 -0.5 0\n", "1 0.1 0.900000 -0.5 0\n", "2 0.1 0.950000 -0.5 0\n", "3 0.1 1.000000 -0.5 0\n", "4 0.1 1.050000 -0.5 0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "parameters = []\n", "for gcr in gcrs:\n", " for offset in offsets:\n", " for rotation in rotations:\n", " aspect_ratio_max = collector_area/(gcr*L_min**2)\n", " aspect_ratio_min = np.sqrt(1-offset**2)\n", " aspect_ratio_start = np.ceil(aspect_ratio_min/aspect_ratio_step)*aspect_ratio_step\n", " aspect_ratios = np.hstack(\n", " [aspect_ratio_min,\n", " np.arange(aspect_ratio_start, aspect_ratio_max, aspect_ratio_step),\n", " aspect_ratio_max\n", " ])\n", " # Remove duplicate values when aspect_ratio_min==1\n", " aspect_ratios = np.unique(aspect_ratios)\n", " for aspect_ratio in aspect_ratios:\n", " if gcr <= collector_area / (L_min**2 * np.sqrt(1-offset**2)):\n", " parameters.append([gcr, aspect_ratio, offset, rotation])\n", "\n", "layouts = pd.DataFrame(parameters,\n", " columns=['gcr', 'aspect_ratio', 'offset', 'rotation'])\n", "\n", "print(f\"Number of unique layouts: {layouts.shape[0]}\")\n", "layouts.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualization of layout discretization\n", "The following plot illustrates the discrete aspect ratios and offsets for GCR=0.2 and GCR=0.3. Note, each point shown is simulated for the all discrete rotations." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "gcrs_subset = np.array([0.2, 0.3])\n", "\n", "fig, axes = plt.subplots(ncols=len(gcrs_subset), figsize=(4,4), sharey=True)\n", "axes[0].set_yticks(np.arange(0.8, 10, 0.2))\n", "\n", "for i, gcr in enumerate(gcrs_subset):\n", " layouts[(layouts['gcr'] == gcr)].plot.scatter( # & (layouts['offset']<0.5-0.00001)\n", " ax=axes[i], x='offset', y='aspect_ratio', s=1, c='k',\n", " legend=False, zorder=2)\n", "\n", " axes[i].set_xlabel('Offset')\n", " axes[i].set_title(\"GCR: %1.2f\" % gcr)\n", " axes[i].set_xticks([-0.5, 0, 0.5])\n", " axes[i].set_xlim([-0.6, 0.6])\n", " axes[i].set_ylim([0.8, 2.2])\n", " axes[i].tick_params(axis='both', which='major')\n", " x_vals = np.linspace(-0.5, 0.5, 100)\n", " aspect_ratio_max = collector_area/(gcr*L_min**2)\n", " axes[i].fill_between(x_vals, np.sqrt(1-x_vals**2), aspect_ratio_max, facecolor='b', alpha=0.2)\n", "axes[0].set_ylabel('Aspect ratio')\n", "\n", "fig.tight_layout()" ] } ], "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.7.12" } }, "nbformat": 4, "nbformat_minor": 4 }