User Tools

Site Tools


Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
mission:tech:odyssey:sku:solar-prediction-model [2013/06/30 12:47] – [Code] chronomission:tech:odyssey:sku:solar-prediction-model [2015/05/21 13:05] (current) – created chrono
Line 1: Line 1:
-====== Solar-Output prediction model ====== +Moved to [[lab:ucsspm]]
- +
-Using the sun as a renewable energy source isn't really a new invention. Plants have been relying on it for millions of years and our - mostly - green friends seem to handle it pretty well on an //instinctive// method of operation. +
- +
-Let's have a simplified look on how much we already depend on solar energy: +
- +
-  * Global freshwater distribution (oceans->clouds->rain) +
-  * Global atmospheric conditions/weather/temperature (direct) -> flora/fauna +
-  * Global flora -> atmospheric conditions/weather/temperature (indirect) +
- +
-and which parts we use technically: +
- +
-  * Agriculture (photosynthesis) -> Food +
-  * Solar energy conversion to heat (mirror/focus) +
-  * Direct solid-state photon->electron conversion for electrical power +
- +
-We're depending very much on knowing how much solar energy can be harvested on a certain point on the planet's surface, yet we still commonly refer to 1000W/m2 on any point on Earth as a clear-sky reference. The following model is an open-resource based starting point for a new common model to predict the solar output on a clear-sky day and incorporate any given conversion technique (currently only PV). +
-===== Use-Cases ===== +
- +
-==== Photo-Voltaic Systems ==== +
- +
-  * being able to have a more accurate prediction of maximum PV output for a given site/configuration +
-  * keep PV panel at optimum elevation without a separate optical solar tracker +
- +
-==== Solar-Ovens ==== +
- +
-The system can be easily extended to estimate the optimum parabolic oven-reflector size, to satisfy the energy needs for a given community and their specific position on the planet. +
- +
- +
-==== Pyranometer Reference Model ==== +
- +
-Possibility to calibrate a pyranometer in the field, without another calibrated reference, on a clear-sky day. +
- +
-==== Agricultural ==== +
- +
-Usable as basis for agricultural applications (growth/photosynthetic calculations) +
-===== Development ===== +
- +
-This model is based on algorithms developed by the //Environmental and Water Resources Institute of the American Society of Civil Engineers// and a few common NOAA/NASA calculations. Apollo-NG's energy management, prediction and logging system fuses this rational prediction model with real time sensor data in order to predict the nominal output power of a PV system and compares the actual output to it. +
- +
-By now it has become a very advanced clear-sky prediction model, incorporating the following factors: +
- +
-  * Position on Earth +
-  * Day of Year +
-  * Distance Sun-Earth +
-  * Angle through atmosphere +
-  * Water in atmosphere +
-  * Atmospheric turbidity (smog, dust etc.) +
-  * Direct/diffuse beam radiation +
-  * PV-Module surface/type/temperature/age +
-===== Code ===== +
- +
-<sxh python; toolbar:false> +
-#!/usr/bin/env python +
-# -*- coding: UTF-8 -*- +
-+
-######################################################################## +
-+
-#   This program is free software: you can redistribute it and/or modify +
-#   it under the terms of the GNU General Public License as published by +
-#   the Free Software Foundation, either version 3 of the License, or +
-#   (at your option) any later version. +
-+
-#   This program is distributed in the hope that it will be useful, +
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of +
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +
-#   GNU General Public License for more details. +
-+
-#   You should have received a copy of the GNU General Public License +
-#   along with this program.  If not, see <http://www.gnu.org/licenses/>+
-+
-######################################################################## +
- +
-import math, calendar +
-from math import pi +
- +
-# Solar constant for the mean distance between the Earth and sun ####### +
- +
-sol_const = 1367.8 +
- +
-######################################################################## +
-# GEO Parameters (to be fed from GPS) +
- +
-lat = 23 +
-lon = 11 +
-alt = 0 +
- +
-######################################################################## +
-# Time and Offsets (to be fed from GPS) +
- +
-day = 22 +
-month = 06 +
-year = 2011 +
-ToD = 12 +
-tz_off_deg = 0+lon +
-dst_off = 0 +
- +
-######################################################################## +
-# Atmospheric Parameters (to be fed from Argus current sensor data) +
- +
-# air temperature +
- +
-atm_temp = 25.0  +
- +
-# relative humidity +
- +
-atm_hum = 20.0  +
- +
-# turbidity coefficient - 0 < tc < 1.0 - where tc = 1.0 for clean air +
-# and tc < 0.5 for extremely turbid, dusty or polluted air +
- +
-atm_tc = 0.8 +
- +
-######################################################################## +
-# PV System Parameters (actual PV data of Odysseys modules) +
- +
-# Solar Panel Surface in m² +
- +
-pv_a = 1.67 +
- +
-# Module Efficiency % +
- +
-pv_eff = 20 +
- +
-# Mod. neg. Temp. Coeff (0.35=mono) +
- +
-pv_tk = 0.35 +
- +
-# Mod. Temperature in °C - should be measured on the back of module +
- +
-pv_temp = 30 +
- +
-# Mod. Age related Coeff (95% after 1-2y) +
- +
-pv_ak = 0.98 +
- +
- +
- +
-######################################################################## +
-##  MAIN +
-######################################################################## +
- +
-# get Julian Day (Day of Year) +
- +
-if calendar.isleap(year): +
- +
- # Leap year, 366 days +
- lMonth = [0,31,60,91,121,152,182,213,244,274,305,335,366] +
- +
-else: +
- +
- # Normal year, 365 days +
- lMonth = [0,31,59,90,120,151,181,212,243,273,304,334,365] +
- +
-DoY = lMonth[month-1] + day +
- +
-print "--------------------------------------------------------------" +
- +
-print "%d.%d.%d | %d | %f | " % (day, month, year, DoY, ToD, ) +
- +
-print "--------------------------------------------------------------" +
- +
-print "Solar Constant                               %s" % sol_const +
-print "Atmospheric turbidity coefficient            : %s" % atm_tc +
- +
-print "--------------------------------------------------------------" +
- +
- +
-# inverse relative distance factor for distance between Earth and Sun ## +
- +
-sun_rel_dist_f = 1.0/(1.0-9.464e-4*math.sin(DoY)- \ +
- + 0.01671*math.cos(DoY)- \ +
- + 1.489e-4*math.cos(2.0*DoY)-2.917e-5*math.sin(3.0*DoY)-\ +
- + 3.438e-4*math.cos(4.0*DoY))**2 +
- +
-print "Inverse relative distance factor             : %s" % sun_rel_dist_f +
- +
- +
-# solar declination #################################################### +
- +
-sun_decl = (math.asin(0.39785*(math.sin(((278.97+(0.9856*DoY)) \ +
- + (1.9165*(math.sin((356.6+(0.9856*DoY)) \ +
- * (math.pi/180)))))*(math.pi/180))))*180) \ +
- / math.pi +
- +
- +
-print "Sun declination                              : %s°" % sun_decl +
- +
- +
-# equation of time ##################################################### +
-# (More info on http://www.srrb.noaa.gov/highlights/sunrise/azel.html) +
- +
-eqt = (((5.0323-(430.847*math.cos((((2*math.pi)*DoY)/366)+4.8718)))\ +
- + (12.5024*(math.cos(2*((((2*math.pi)*DoY)/366)+4.8718))))\ +
- + (18.25*(math.cos(3*((((2*math.pi)*DoY)/366)+4.8718))))\ +
- - (100.976*(math.sin((((2*math.pi)*DoY)/366)+4.8718))))\ +
- + (595.275*(math.sin(2*((((2*math.pi)*DoY)/366)+4.8718))))\ +
- + (3.6858*(math.sin(3*((((2*math.pi)*DoY)/366)+4.871))))\ +
- - (12.47*(math.sin(4*((((2*math.pi)*DoY)/366)+4.8718)))))\ +
- / 60 +
- +
-print "Equation of time                             : %s min" % eqt +
- +
- +
-# time of solar noon ################################################### +
- +
-sol_noon = ((12+dst_off)-(eqt/60))-((tz_off_deg-lon)/15) +
- +
-print "Solar Noon                                   : %s " % sol_noon +
- +
- +
-# solar zenith angle in DEG ############################################ +
- +
-sol_zen = math.acos(((math.sin(lat*(math.pi/180))) \ +
- * (math.sin(sun_decl*(math.pi/180)))) \ +
- + (((math.cos(lat*((math.pi/180)))) \ +
- * (math.cos(sun_decl*(math.pi/180)))) \ +
- * (math.cos((ToD-sol_noon)*(math.pi/12))))) \ +
- * (180/math.pi) +
- +
-# in extreme latitude, values over 90 may occurs. +
-#if sol_zen > 90: +
- +
-print "Solar Zenith Angle                           : %s° " % sol_zen +
- +
- +
-# barometric pressure of the measurement site +
-# (this should be replaced by the real measured value) in kPa +
- +
-atm_press = 101.325 \ +
- * math.pow(((288-(0.0065*(alt-0)))/288) \ +
- , (9.80665/(0.0065*287))) +
- +
-atm_press=100.5 +
- +
-print "Estimated Barometric Pressure at site        : %s kPa" % atm_press +
- +
- +
-# Estimated air vapor pressure in kPa ################################### +
- +
-atm_vapor_press = (0.61121*math.exp((17.502*atm_temp) \ +
- / (240.97+atm_temp))) \ +
- * (atm_hum/100) +
- +
-print "Estimated Vapor Pressure at site             : %s kPa" % atm_vapor_press +
- +
- +
-# extraterrestrial radiation in W/m2 ################################### +
- +
-extra_terr_rad = (sol_const*sun_rel_dist_f) \ +
- * (math.cos(sol_zen*(math.pi/180))) +
- +
-print "Estimated Extraterrestrial radiation         : %s W/m²" % extra_terr_rad +
- +
- +
-# precipitable water in the atmosphere in mm ########################### +
- +
-atm_prec_h2o = ((0.14*atm_vapor_press)*atm_press)+2.1 +
- +
-print "Estimated precipitable water in Atmosphere   : %s mm" % atm_prec_h2o +
- +
- +
-# clearness index for direct beam radiation [unitless################# +
- +
-clr_idx_beam_rad= 0.98*(math.exp(((-0.00146*atm_press) \ +
- / (atm_tc*(math.sin((90-sol_zen)*(math.pi/180))))) \ +
- - (0.075*(math.pow((atm_prec_h2o \ +
- / (math.sin((90-sol_zen)*(math.pi/180)))),0.4))))) +
- +
-print "Clearness index for direct beam radiation    : %s" % clr_idx_beam_rad +
- +
- +
-# transmissivity index for diffuse radiation [unitless################ +
- +
-if (clr_idx_beam_rad > 0.15): +
- trns_idx_diff_rad= 0.35-(0.36*clr_idx_beam_rad) +
-else: +
- trns_idx_diff_rad= 0.18+(0.82*clr_idx_beam_rad) +
- +
-print "Transmissivity index for diffuse radiation   : %s" % trns_idx_diff_rad +
- +
- +
-# Model Estimated Shortwave Radiation (W/m2) ########################### +
- +
-est_sol_rad = (clr_idx_beam_rad + trns_idx_diff_rad) \ +
- * extra_terr_rad +
- +
-print "--------------------------------------------------------------" +
-print "Model Estimated Shortwave Radiation (RSO)    : \033[1;33m%3.1f W/m²\033[0m" % est_sol_rad +
- +
- +
-# Estimate Output of Odyssey (solar panels at nominal Efficiency) ###### +
- +
-est_p_out = (est_sol_rad*pv_a) / 100 * pv_eff +
- +
-print "Model Estimated Max. PV-Power Output         : \033[1;31m%3.1f W\033[0m \033[1;37m@ %d%% Mod Eff\033[0m" % (est_p_out, pv_eff) +
- +
- +
-# Estimate conversion loss due to module temperature ################### +
- +
-if ( pv_temp > 25 ): +
-  +
-    pv_p_loss = (pv_temp-25 ) * pv_tk +
- pv_p_loss_p = (est_p_out/100) * pv_p_loss +
- +
-print "Model estimated PV-Module temp conv. loss       : \033[1;37m%2.1f W / %2.1f%%\033[0m" % (pv_p_loss_p, pv_p_loss) +
- +
-# Estimate conversion loss due to module age +
- +
-est_pv_age_loss = est_p_out - (est_p_out*pv_ak) +
- +
-print "Model estimated PV-Module aging loss            : \033[1;37m%03.1f W\033[0m" % est_pv_age_loss +
- +
-# Optimal PV Module Angle to Sun +
- +
-print "Model recommends PV-Module angle to Sun      : \033[1;37m%02.1f°\033[0m" % sol_zen +
- +
-# Estime Power output of Odyssey (solar panels at corrected Efficiency) +
- +
-est_real_p_out = est_p_out - est_pv_age_loss-pv_p_loss_p +
- +
-print "--------------------------------------------------------------" +
-print "Model Estimated Real PV-Power Output         : \033[1;31m%3.1f W\033[0m" % est_real_p_out +
- +
- +
-</sxh> +
- +
-<WRAP round download> +
-**Download:**\\ +
-[[https://apollo.open-resource.org/downloads/solar-prediction.py|Source Code]] +
-</WRAP> +
- +
-<WRAP round important> +
-Please feel free to contribute by verifying these calculations or extend them to an even more accurate/versatile model for all of us. +
-</WRAP> +
- +
-<code bash> +
-# python solar-prediction.py  +
--------------------------------------------------------------- +
-22.6.2011 | 173 | 12.000000 |  +
--------------------------------------------------------------- +
-Solar constant                               : 1367.8 +
-Atmospheric turbidity coefficient            : 0.8 +
--------------------------------------------------------------- +
-Inverse relative distance factor             : 0.968392237142 +
-Sun declination                              : 23.4438070502° +
-Equation of time                             : -1.71440597602 min +
-Solar Noon                                   : 12.0285734329  +
-Solar zenith angle                           : 0.593383030197°  +
-Estimated barometric Pressure at site        : 100.5 kPa +
-Estimated vapor pressure at site             : 0.633406906142 kPa +
-Estimated extraterrestrial radiation         : 1324.49586817 W/m² +
-Estimated precipitable water in atmosphere   : 11.0120351694 mm +
-Clearness index for direct beam radiation    : 0.670704071246 +
-Transmissivity index for diffuse radiation   : 0.108546534352 +
--------------------------------------------------------------- +
-Model estimated shortwave radiation (RSO)    : 1032.1 W/m² +
-Model estimated max. PV-Power output         : 344.7 W @ 20% Mod Eff +
-Model estimated PV-Module temp conv. loss    : 6.0 W / 1.8% +
-Model estimated PV-Module aging loss         : 6.9 W +
-Model recommends PV-Module angle to Sun      : 0.6° +
--------------------------------------------------------------- +
-Model estimated real PV-Power output         : 331.8 W +
-</code> +
-===== Sources ===== +
- +
-{{:mission:tech:odyssey:sku:clear-sky-solar-radiation.pdf|}} +
- +
- +
-{{tag>research solar radiation energy prediction software python}}+