Source code for sicor.Tools.SolarIrradiance

"""Derive Solar Irradiance from various data sources."""
import numpy as np
from pint import UnitRegistry
from datetime import date
import pandas as pd
import csv
from ..Tools import get_data_file


__author__ = "Niklas Bohn, Andre Hollstein"


[docs] class SolarIrradiance: def __init__(self, dataset="Thuillier2002", used_date=date.today()): """ General object for solar constant computations dataset: Irradiance dataset to use, either: Thuillier2002 or Fontenla used_date: datetime object, for sun earth distance correction """ self.sol_irr = {} self.ureg = UnitRegistry() # for unit conversion self.Q_ = self.ureg.Quantity self.wvl = None self.irr = None self.dataset = dataset self.rp = None # actual sun earth distance self.rc = None # distance of reference self.cc = None # c parameter for solar irradiance model assert isinstance(used_date, date), "Used date should be datetime date object." self.date = used_date if self.dataset == "Thuillier2002": path_thuillier = get_data_file("sicor", "Solar_irradiance_Thuillier_2002.xls") print(path_thuillier) self.irr_unit = 'mW/m**2/nm' self.sol_irr["Thuillier2002"] = (lambda x: {"ref_day": date(1982, 5, 5), "ref_dist": 1.0, "wvl": x[:, 0], "irr": self.Q_(x[:, 1], 'mW/m**2/nm')} )( np.array(pd.read_excel(path_thuillier, sheet_name="Thuillier 2002"), dtype=float)) elif self.dataset == "Fontenla": path_fontenla = get_data_file("sicor", "SUNp1fontenla.asc") self.irr_unit = 'mW/m**2/nm' self.sol_irr["Fontenla"] = (lambda x: {"ref_dist": 1, # AU as given in the doc "wvl": 10e6 / x[::-1, 0], # given in cm-1, converted to nm "irr": self.Q_(x[::-1, 1] * x[::-1, 0] ** 2, 'W/cm**2/cm')} # given in (W CM-2 / CM-1), conversion by v*2*L )(np.loadtxt(path_fontenla, skiprows=2)) else: raise ValueError("Dataset not implemented: %s" % dataset) path_earth_sun_distance = get_data_file("sicor", "Earth_Sun_distances_per_day_edited.csv") with open(path_earth_sun_distance, 'r') as csvfile: self.sun_earth_dist = {row[0].replace(" ", ""): float(row[1]) for row in csv.reader(csvfile, delimiter=',')} assert type(used_date) == date, "Used date should be datetime date object." self.date = used_date self.wvl = self.sol_irr[self.dataset]["wvl"] if self.sun_earth_dist is not None: # simple quadratic model S(r)=c/r^2 self.rp = self.sun_earth_dist[str(self.date)] self.rc = self.sol_irr[self.dataset]["ref_dist"] self.cc = self.sol_irr[self.dataset]["irr"].to(self.irr_unit).magnitude * self.rc ** 2 self.irr = self.cc / self.rp ** 2 else: # no correction for distance self.irr = self.sol_irr[self.dataset]["irr"].to(self.irr_unit).magnitude def __call__(self): return self.irr