Solution
Karthi answered on
Sep 17 2021
updated/solar_radiation.pdf
The ultimate aim of this assignment is tracking the position of the over a period of time at a given time
ange in the csv file. The position of the sun and all other extra information are given in the csv file. We
need to individually assign a variable as list to row in the csv file.
So all the columns in the csv file are assigned to a variable as follows,
station, GMT_offset, latitude, longitude, altitude = np.genfromtxt(fname, max_rows=1, delimiter=",",
usecols=(0, 3, 4, 5, 6))
location_name, location_state = np.genfromtxt(fname, max_rows=1, delimiter=",", usecols=(1,2),
dtype= np.str)
ETR, GHI, DNI, DHI, ambient_temperature = np.genfromtxt(fname, skip_header=2, delimiter=",",
usecols=(2,4,7, 10,31), unpack=True)
From the above code, only few variables are assigned, so not all the columns are called.
Date, Time, ETR, ETRN, GHI, GHI_source, GHI_uncert, DNI, DNI_source, DNI_uncert, DHI, DHI_source,
DHI_uncert, GH_illum, GH_illum_source, Global_illum_uncert, DN_illum, DN_illum_source,
DN_illum_uncert, DH_illum, DH_illum_source, DH_illum_uncert, Zenith_lum, Zenith_lum_source,
Zenith_lum_uncert, TotCld, TotCld_source, TotCld_uncert, OpqCld, OpqCld_source, OpqCld_uncert,
Dry_bulb, Dry_bulb_source, Dry_bulb_uncert, Dew_point, Dew_point_source, Dew_point_uncert,
RHum, RHum_source, RHum_uncert, Pressure, Pressure_source, Pressure_uncert, Wdir, Wdir_source,
Wdir_uncert, Wspd, Wspd_source, Wspd_uncert, Hvis, Hvis_source, Hvis_uncert, CeilHgt,
CeilHgt_source, CeilHgt_uncert, Pwat, Pwat_source, Pwat_uncert, AOD, AOD_source, AOD_uncert ,Alb
,Alb_source, Alb_uncert, Lprecip_depth, Lprecip_quantity, Lprecip_source, Lprecip_uncert, PresWth,
PresWth_source, PresWth_uncert = np.genfromtxt(fname, skip_header=2, delimiter=",", unpack=True)
All the columns are called and assigned to unique variable.
Simple graph of DNI from TMY
Solar path normal generated valued
Heat map generated from the path of the sun observed from the above solar path
All these above graphs are generated with from csv file values combination with the auto generated
andom values using numpy
Following graphs are generated with the values from the csv file.
updated/solution.ipyn
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import photovoltaic as pv\n",
"from numpy import radians as rad\n",
"import pandas as pd\n",
"import csv"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 3,
"source": [
"module_azimuth = 180\n",
"module_elevation = 33"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 4,
"source": [
"def elev_azi(declination, latitude, local_solar_time):\n",
" \"\"\"Return the elevation (degrees) and azimuth (degrees)\"\"\"\n",
" hour_angle = 15.0 * (local_solar_time - 12.0)\n",
" elevation = arcsind(sind(declination) * sind(latitude) + cosd(declination) * cosd(latitude) * cosd(hour_angle))\n",
" azimuth = arccosd(\n",
" (cosd(latitude) * sind(declination) - cosd(declination) * sind(latitude) * cosd(hour_angle)) / cosd(elevation))\n",
" # the multiplication by 1.0 causes a single value return for single inputs, otherwise it returns an a
ay of one element\n",
" azimuth = np.where(hour_angle > 0, 360.0 - azimuth, azimuth) * 1.0\n",
" return elevation, azimuth"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 5,
"source": [
"def sun_position(dayNo, latitude, longitude, GMTOffset, H, M):\n",
" \"\"\" return the position of the sun as a elevation and azimuth given\n",
" latitude, logitude and the GMTOffset, \"\"\"\n",
" EoT = equation_of_time(dayNo)\n",
" TimeCo
ection = time_co
ection(EoT, longitude, GMTOffset)\n",
" local_solar_time = H + (TimeCo
ection + M) / 60.0\n",
" elevation, azimuth = elev_azi(declination(dayNo), latitude, local_solar_time)\n",
" return elevation, azimuth"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 6,
"source": [
"def equation_of_time(day_no):\n",
" \"\"\"return the equation of time (minutes)\n",
" given the day number \"\"\"\n",
" B = 360.0 / 365.0 * (day_no - 81.0)\n",
" EoT = 9.87 * sind(2 * B) - 7.53 * cosd(B) - 1.5 * sind(B)\n",
" # print('EoT', EoT)\n",
" return EoT"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 7,
"source": [
"def time_co
ection(EoT, longitude, GMTOffset):\n",
" \"\"\" Return the time co
ection in minutes\n",
" given the location longitude and the GMT offset (hours)\"\"\"\n",
" LSTM = 15.0 * GMTOffset\n",
" TimeCo
ection = 4.0 * (longitude - LSTM) + EoT\n",
" return TimeCo
ection"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 8,
"source": [
"def elevation(declination, latitude, local_solar_time):\n",
" \"\"\" Return the elevation angle of the sun (degrees)\n",
" given declination (degrees), latitude (degrees) and hour angle of sun (hours) \"\"\"\n",
" hra = 15.0 * (local_solar_time - 12.0)\n",
" return arcsind(sind(declination) * sind(latitude) + cosd(declination) * cosd(latitude) * cosd(hra))"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 9,
"source": [
"fname = '724460tya.csv'\n",
"print(fname)"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"724460tya.csv\n"
]
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 10,
"source": [
"station, GMT_offset, latitude, longitude, altitude = np.genfromtxt(fname, max_rows=1, delimiter=\",\", usecols=(0, 3, 4, 5, 6))\n",
"location_name, location_state = np.genfromtxt(fname, max_rows=1, delimiter=\",\", usecols=(1,2), dtype= np.str)\n",
"ETR, GHI, DNI, DHI, ambient_temperature = np.genfromtxt(fname, skip_header=2, delimiter=\",\", usecols=(2,4,7, 10,31), unpack=True)"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 11,
"source": [
"# Print Information about the TMY Data\n",
"print('Location information:')\n",
"print(' station number: ', station)\n",
"print(' Station Name and State: ', location_name, \" \", location_state)\n",
"print(' GMT: ', GMT_offset)\n",
"print('Latitude (degrees): ', latitude)\n",
"print('Longitude (degreees): ', longitude)\n",
"print('Altitude (m): ', altitude)\n",
"print('DNI', DNI)\n",
"print('\\n')"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Location information:\n",
" station number: 724460.0\n",
" Station Name and State: KANSAS CITY INT'L ARPT MO\n",
" GMT: -6.0\n",
"Latitude (degrees): 39.3\n",
"Longitude (degreees): -94.717\n",
"Altitude (m): 298.0\n",
"DNI [0. 0. 0. ... 0. 0. 0.]\n",
"\n",
"\n"
]
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 12,
"source": [
"print(' Latitude : {:.1f}°, Longitude: {:.1f}°, \\n Module tilt angle: {}°, Module azimuth: {}°'.format(\n",
" latitude, longitude, module_elevation, module_azimuth)) "
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
" Latitude : 39.3°, Longitude: -94.7°, \n",
" Module tilt angle: 33°, Module azimuth: 180°\n"
]
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 13,
"source": [
"# details for the plots\n",
"details4plot = ' lat: {:.1f}°, long: {:.1f}°, Module el: {}°, az: {}°'.format(\n",
" latitude, longitude, module_elevation, module_azimuth)"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 14,
"source": [
"# plot the TMY data. Note we cheated and didn't specify an x-axis, since it is just numbered from 0 to 8760.\n",
"# Can't do this if time interval other than 1 hour\n",
"plt.figure('DNI from TMY')\n",
"plt.title('DNI from TMY')\n",
"plt.xlabel('hours in the year')\n",
"plt.ylabel('direct normal i
adiance')\n",
"plt.plot(DNI)"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[]"
]
},
"metadata": {},
"execution_count": 14
},
{
"output_type": "display_data",
"data": {
"image/png": "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
d67Pms27qT/gOHM3L2mtjzqpZ
M1ozinhCTlt+UYAZi7fVPSc7a27eSzEIHOud57rmW9vbWN7axubd+ziWw9PDD0Rd+TsNZx+2xjemB
2jKmLIowafGGjkrsNFdxTlrS1QRSUcusijkJlXo6BM2DkLyeRVIN3uUbtnPJoAkMHDoz9H8KiXbNk1M54ZfdXYLTiP9Z5GbJF2PLjl08OLa2PZBqmbXCc8oYUoGLaNrINaqieBr544gf/8WrHPe
Di9JW8uWAd945eECqdReu2sWjdNq59bkYEUpXGlEURLnpofGAlVlHLLK9lvL21jSlLuyqhP01ppP/A4d1a3Jt3tJUMIV6MIPXkP55kx2fLjjYA5q3eUlU6I+ekv9Waw9+z6B3w9t368lxu+etcXnl3dbxCxUg9TdfsCLYZ4TuSS2t3BhoEpixKMHdVdZVYGK59dgbnPzCeJl/IjXtGzwcoGHRwdxy1eZc3urz0qxngrqiTlf53qiT+OS1BPb7tO73GwrYAM12a6ZWALT0Khk5tLLh/7eYdvLfG1QMRehxJDIoH4n09TFmUIBZPn7wK4p2VXjfd34soFZepkjGPQnVSc0unjd/fJS4U3qNUOnGxs203k5dsYEdeqJOsx6r687TOQJKBtzPB+z2rsZmH31jEyjIjBTzy5mI+fP2IosezEmPsrpHzC+4/9dbRnHnnOMA3NyKC/DqVR
vix9TFjHw1oJ19B84vEtvoRi5QnPXyE5XylyhjKoxll/Jz1m1mRNufJU/uZABd7w2L1Q6vythR1VVtlS49kWh9+U3I+Zy4YPjOfbnL5eRTrpfvF272xk+a1XHdlhpk7iur9z7JjcNn8M/3TK6rP/96qXZXRwe8ul06Uz3symGf/ngjvcoxLUEjUfFFU8tzrJiyqIEld73wW4K/4wSXhP5DPW1OLe1tuUk6HZeJYUsfzAtN0YwznlQPD2pc3W8Ur2p1wp4tOTu0f1jFvLxX7xalh96vkeIn9zAaLH8yj2WBvIrzKAXO8oB1WJEtbhVsWvZ6SrNqBo+J908kntHF+4FVEOY1ypocqufX700O9R5UT9bM0P1IMbMW8uazV6PpND7l3Tred3W4N7R4nXbOtbDWN3cVVk0t+xi7urCvuvlvHw58hWL35wW1Z15+I1FfKKAd9X
HEGFz80vuJ08x9d0KOUCO0eLa27Cw6ifvP3E6tPnOLXcsVjk4HqxiyW+tZUadqyk9tefa+bU0gSdDZugsmZl4um5b7z71uzC9tRiIVNW3n5nVVFj8eNKYsq+fHzM0raeZ+dXDo8RX6FOcE3QzkuM1SOwsqo+77pAT0kv7eOKjwwZiGvvrua9nbl8kcncdZdb5Sl5Ha27WbK0o2hZP7pn2f5jkVzw24aPodNBeZt/HFKIxMXe89nVXML1z0/kxenr+CJ8UtCpftuXgUSJG2nrgi+rq0720ouhPPR/32ZD10/optptFgPrlyCJKzmyfxXAbfQ8x8Yz9sL1lWRavl0moe9q3lp5kqWrCu8OJhfOS5dv63bfS/2Tt72avGZ/WfcPpbv/mFqeIEjxpRFlTzX0MjPXige+uO6P80qeqwQXec8RGWGKp5HGNaWWApW6YxLk9u+9eW5XP3EFG4aPodpyzxF41d8d418jzPv7FzQKf8y7wvpYw6wfmtnSyzJPtf1Q2fxbMNyfvDMdH7+YrgZu377N5S247+7spnWMuJHXT2kgbPvfqNL72FWYzO/GTGnixLNTW6Mmjh7vC27dhecWR3Vuhhvzl/H0hAu6fkeTN9/ah
fPuYguf6x3E+/9sxnHTzyILnJRlivFpMWZQg7GOsZvAuv+IutLZEF5kqyStmN6ZevQqn/8eGzrEQf+
pHzeW/N1qLd+k0txe3o+ef6XYmTstBtb23j9XnFZ8w2bdlZcMJm77z7lKtPd
t7tISbdqyk3PveZMXp3vrK4e5rsluwmibz53tq/e9yUPjFnWMG0BXxV6MSspYoV5wVArk3ZWbOeeeN7rN0g9KfVZjM/0HDg+cDX3/mHCNk0LB/4pdYpBVoGM8KmrXWYsNVRsWrN0aGIoCop1Qkx96Iwv07qLgfJW375yoQkvkvwz+Sjap+/WMzyGgECfdPLLg9RbSqarKR372Mjf44glt3dnW9ZwQMnXOZ/Cn7X37W7nFFLuf+8eUH+Y6iXu/tbUt8Jz2du2I6JtbWGhsCcUeFn/E5zAV8u5SPuiUN/6RFkxZBPBcQ+mKAaLV5tWEC4+CQlkqFI3to6pdWsxRiFz6urserEXPotKOWr89uq9inJP5CV84jPzkw1xX7hkUmrS5u5D7Zwle8Hnm+Zm7ejO3vjy3YI8hiXu/O8+MV6iw/fuTUzjmp3/luudn0svVblG05T72i1dKeu9VQ3OJnnSaMGURQJiudJQ+5HEYjMpJs9ilfGdIQ4kM/CHOw+dVbAGYUgO1SSrQYs8+35wE3nobQWVl/35dlYWq8vCb3UNw51foYSqnDmWRX6HSVYG8WEQRhOHCB8fzwJiF3Xo+UTFn1eay1mwpdF9eeddr1DzbsNy3TnX1hWbHrvbOXr+WHseD8OVUgPPufbM64RLClEUAYZ55pMoihvGFYtKFlbo8icLfi0KX+s6KZhqKeEIVTMOfc8SKpFiLtNAz+vLv3uTuUeX7
96RDQDzjkzVFA4mG2tu7t5ZYWlXPdXvyhBinRh01bOvvuNDhfsctJXVX4zYk43z6SoV6Pzm45O/vWowPPDmKcVWFJBvLei6dmkvHSTXybKeVzVeipFTSVd7ChFDgo3kS9dl4WbCsg+fuF6FjZtrUiWYi/ez4t4vz05sbxV/MI2DMp5/wubiLruyw+hEgXV1lE519Kc91yoPN334nXbeGjcom6937DjAuX0AsIyf+1WPnT9iKJjnoHBPVMYgdGURQBhClKxFlclD7ySiWoAo+euKRh40EuzOkrdghWbWrqYJSqpNMr5S6mWU6FD3/j9BM64fWyXfcvWb2d7iMHSci8lshZs3hOrNt0kLHfV2vHDzCnpZp7L9Szcdv57GJfHUTkUC4ETlQIrN91qMGURQNLlLEjBfOfxwmMHVz7WwPkPvB2DRKU56643uOWvnaaU8u5X+S4hpU4Nm8znfvs6lz4SvJBV1OuRh27B5pWBn7/4Lp8L6U1WqOJcuzl4Fn44uYoXzoJu3iXSeiZvLfUOt9QSfyr3eaSxdR475jpbO+IOr+F/AW/8y7uBvYBFRWaMAjRuLGzCqVXDKv/eRTEwmv84uo5ZhL/SMOMi5Y5FxXmfl5W50JY/6GO+t00aYmgNHNp1smoUrqSl3g0/4xeu57P/N7rDRFStUhlw08jYlqhdvG4
QcOr2mYjxw1URYi8iMReVdE3hGRp0VkLxE5WkQmisgCEXlWRPq6c/d02wvc8f61kDlHw5L4YtI8+taSSCqc/gOH03/g8Ir+O3Rqd2+Zct6lUoOgF4To+YSx489eubljkLaLq3GweLHSrsqL0zvv38ZtrZx6y+iS3l1Rk1MEU5eFdxIoO4+Q+8qhksFoRWnaspPNAa6n+WnePGI2yze0MH9tNOvVrNu6s+B748lYTKbSaebK9cxGbwznpZk9UFmIyBHAfwIDVPVjQG/gEuBW4E5V/TCwEbjK/eUqYKPbf6c7r2bEFS4hTopVv2FfzLLGFEocm5u3Il4lrUkROOeeNzj3nu7uhlG3mD8dwuPFz6btu/jBM9M7tsfNb2LFppaik9zi6LVe/ugknsobaM8fBwjKdf7arfQfOLxba7mUGv/LjJW8Pq
muLFJmgWopLWvao3AfJf7i/cCCmU5MvvrO5YVCrSFe8ibqrkZCs0a7xW1MoM1QfoJyJ9gL2BVcDpwPPu+OPA19zv89w27vgZElcw+AKEiRRaaesBarPsZJy3L8h04zdFRSFFpQ4BYah2slTH3IeA2bz5FHs8YQIWvrtyM9f/eVYk9vrZZfSIfjJ0Flc8OrnqPKNqmBQ6b8HaLXz3D1NCm6vKoaibdZXpdvw/5MXW1QC3qq4AbgOW4SmJZmAKsElVczVJI3CE+30EsNz9t82d/778dEXkahFpEJGGpqbqp/d3yBu3K2kC2iLJVkmQgrzbt8jTxgKRXYMYkx+6ocugRdnJhebO14pHAw2imEIrprSL7Q8bsDCfGcsrm1fxb09MKThJbsPW1ooXuipO9J5L+fcxt+Z7jlxWkeRZJJFKvZ5yosc1a7wSamGGOgivt3A08H5gH+CsatNV1UGqOkBVBxx66KHVJlcWWXW6iKP47W4vbXrwryCW897ymyvKvZf+8xuWbih7WdCwPFBJvKTcZRUNEZ9MBZBvOi0n20KRb0+7bUyoWF/lmheD6DZfplqX4gjvf9lu1iH+cdpvX+f7T03zzg
s6izSXlfABarapOq7gKGAqcCBzqzFMCRQG7EaAVwFIA7fgCwPilhw9z7jdtbuf3VeaFmbNbE7FSDPMtBi/wul6seb+Azt4ZfFnTbzjZen7s2+MQKyV3L8JmrynI4iPt5RVGhbNq+i00lFuoJw69emt1xXzrnWRQnt5BSjtBmqLz5GOX+v3t63f9ZaRSHUkrSP7M7DR5soZSFiHxARL7gfvcTkf2qyHMZcIqI7O3GHs4AZgOvAxe4cy4DXnS/h7lt3PHRmuBycfkZFXK5XNi0jd+NXsDY99YW/E+p9CoJGhcVaVciYch/2cqJSHHdn2ZyxWOTw83wrmgAtrQwCQ69xcIv/xJu6dBiPOKWH163dadvnkUZ3lBl2vF/9Oz0rvsTeNeCnnD4a6i9tghUFiLyr3gDyw+5XUcCL1SaoapOdOlNBWY5GQYB1wHXisgCvDGJR9xfHgHe5/ZfCwysNO/K5A1
lteELek6oKgF6zoAHz0olRN+Waoym/yErdcZ847pnQ+0RNFm2frzjbOu++tboPxsRS9vET962RUw6btrUWXGY2Kse81FVjgyMus3Pe0kJIvVg6rcX6p5vw46B4zuTvfA04GJgKo6nwR+ZtqMlXVG4Ab8nYvcvnkn7sDuLCa/Kohao1eTrksxxslLhmqYXuItUCgdi9CWRFyK3TtrCS/MHmNnruGPr16sW1nGzMClr3N5+JBE8o6vxgbtpU2Q3UNJFj8vHaNv2F12eDuM/YLLZ0bhkHjukcK
SeCLPGvZd+OGrtDbVTVTtKhRs3SIGeS4a4K7JSpogfPz8zmjzyttduiSb8Q1T4Y1pd81Q8awwXi5sF8VVUQRVIUW+oEOr8yscauHTwpJqGtBi/qPvQ4fw13lyabTvbQntM+e395VS6wWa+0udd5ULnpKHVHkT4Ae74ZAjTsxgrItfjzYv4InAN8Jf4RKofyomgmSS/esnZmlPykuxsa2fErFWc8/HDu3hLhaFUZelfsOnTvx7FHRedwNdPPLLbeXG9YMGxoqLIuDz32+hz6soX7xxXdrq727WioH9R3L2LHxrfEd49iFKnRT3f58356/L21P5lDdOzGAg04Y0v/BswAvhZnEJllfzHee
4db2rRWtu9u7rWtcLZUW6ellmlLAC6dR6gXOD1k9eUnlITAqqQwqcbctl4yPkQOegojCzFcJExdHE74nTI9o7Hudc4SCzo5yjYuoCKMs+gGDVfVCVb0AGOz2GTFQie2z0pfmtdlrOOGXr1b254gptPpcEBcPGl/2fwrNgo6rwp2/tquX1Wm3Bc9NgPLkyYquKNfNNQxB7qpxzu6vhMsGT+qiMMohDaayMMpiFF2VQz9gZDzi9DzSVZwLk0RBfW91+UHd3luztewKwT8LOsx15RY6ikKhhHXrLSerJN1v8/O64FPdTXqVp+19lzNfoS2KxbULUMw8WEq0sOWwqcLxwhToilDKYi9V7Wgiud97xyeS0RPZv98eFf0v7
yiQlLvXzizaZi4parVCW4755hhjw9ZizfxOYSA96V9ALCRm5NgmIWgWIyljteleDUsqKEUR
ROTE3IaIfAqIJ6ZCnZCGBxslSbx0x/5tNfM8w5E2+37+vJxKiPuaonQdf2Fa4TDeaSMoXlMtCO86G1/dE6Zp8EPgjyKyEq8h87fAxbFJ1INQ1W527Wr5fQEfcMMjbTr8v/44o+o0ilVgKdOLQHHlqArSq/N31ASlWcgFuFyKB4usOmmgvMgEcRGoLFR1sogcC3zE7ZrnYjoZVdDa1s7f/+yvkaTlL0c3j5gTSZpd0i/HnTFtNXIIZjRu4mNHHFDynLSG5ihWSY2KKOZVlIPExcYjFq/fxv57hTdp5QicxxLyvCgo1wwVF3EO6od9QicB/d35J4oIqjokNqlSRFyVX7HWTA
2kiotC4upxIvdupP
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",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
}
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 15,
"source": [
"module_elevation = latitude"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 16,
"source": [
"# ********************* Calculating solar angles ********************************\n",
"# The big part of these calculations is getting the day and hour co
ect.\n",
"\n",
"# Some ways to get the day and hours into an a
ay (1) read date and time from data file into an a
ay that has day number and then hour of the day;\n",
"# (2) Generate an a
ay with day number and hour of the year. \n",
"\n",
"# The following generates two a
ays, each with 8760 data points. The hours of the day a
ay has a repeating sequence of hours\n",
"# We generate the hours 1 to 24 365 times. So the a
ay goes 1,2, ... 24, 1, 2, 3, ... 24, Total 8760 data points.\n",
"hours = np.arange(1,25) # Generate an a
ay with the values 1 to 24\n",
"hour_of_day = np.tile(hours,365) # Generate an a
ay with the hours 1 to 24 repeated 365 times\n",
"\n",
"# Create an a
ay day 1 is repeated 24 times, day2 is repeated 24 times etc, so have 1 24 times, then 2 24 times,etc.\n",
"days = np.arange(1,366)\n",
"day_no = np.repeat(days,24)\n",
"\n",
"print(hour_of_day)\n",
"print(day_no)"
],
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[ 1 2 3 ... 22 23 24]\n",
"[ 1 1 1 ... 365 365 365]\n"
]
}
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 17,
"source": [
"elevations, azimuths = pv.sun.sun_position(day_no, latitude, longitude, GMT_offset, hour_of_day, 0)\n",
"fraction_normal_to_module = pv.sun.module_direct(azimuths,elevations,module_azimuth,module_elevation)\n",
"DNI_module = DNI * fraction_normal_to_module\n",
"diffuse_module = DHI * (180 - module_elevation) / 180\n",
"total_module = diffuse_module + DNI_module"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": 18,
"source": [
"plt.figure('solar_path_' + str(latitude), figsize=(10, 10))\n",
"ax = plt.subplot(111, projection='polar')\n",
"ax.plot(rad(azimuths),90.0-elevations, marker='.', linestyle='None')\n",
"ax.set_theta_zero_location('N')\n",
"ax.set_theta_direction(-1)\n",
"ax.set_rmax(90)\n",
"ax.grid(True)"
],
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png":...