from __future__ import absolute_import
from src.functions.SOLWEIGpython.UTIL import sun_position as sp
#import sun_position as sp
import numpy as np
import datetime
import calendar
[docs]
def Solweig_2015a_metdata_noload(inputdata, location, UTC):
"""
This function is used to process the input meteorological file.
It also calculates Sun position based on the time specified in the met-file
:param inputdata:
:param location:
:param UTC:
"""
met = inputdata
data_len = len(met[:, 0])
dectime = met[:, 1]+met[:, 2] / 24 + met[:, 3] / (60*24.)
dectimemin = met[:, 3] / (60*24.)
if data_len == 1:
halftimestepdec = 0
else:
halftimestepdec = (dectime[1] - dectime[0]) / 2.
time = dict()
time['sec'] = 0
time['UTC'] = UTC
sunmaximum = 0.
leafon1 = 97 #TODO this should change
leafoff1 = 300 #TODO this should change
# initialize matrices
altitude = np.empty(shape=(1, data_len))
azimuth = np.empty(shape=(1, data_len))
zen = np.empty(shape=(1, data_len))
jday = np.empty(shape=(1, data_len))
YYYY = np.empty(shape=(1, data_len))
leafon = np.empty(shape=(1, data_len))
altmax = np.empty(shape=(1, data_len))
sunmax = dict()
for i, row in enumerate(met[:, 0]):
if met[i, 1] == 221:
test = 4
YMD = datetime.datetime(int(met[i, 0]), 1, 1) + datetime.timedelta(int(met[i, 1]) - 1)
# Finding maximum altitude in 15 min intervals (20141027)
if (i == 0) or (np.mod(dectime[i], np.floor(dectime[i])) == 0):
fifteen = 0.
sunmaximum = -90.
sunmax['zenith'] = 90.
while sunmaximum <= 90. - sunmax['zenith']:
sunmaximum = 90. - sunmax['zenith']
fifteen = fifteen + 15. / 1440.
HM = datetime.timedelta(days=(60*10)/1440.0 + fifteen)
YMDHM = YMD + HM
time['year'] = YMDHM.year
time['month'] = YMDHM.month
time['day'] = YMDHM.day
time['hour'] = YMDHM.hour
time['min'] = YMDHM.minute
sunmax = sp.sun_position(time,location)
altmax[0, i] = sunmaximum
half = datetime.timedelta(days=halftimestepdec)
H = datetime.timedelta(hours=met[i, 2])
M = datetime.timedelta(minutes=met[i, 3])
YMDHM = YMD + H + M - half
time['year'] = YMDHM.year
time['month'] = YMDHM.month
time['day'] = YMDHM.day
time['hour'] = YMDHM.hour
time['min'] = YMDHM.minute
sun = sp.sun_position(time, location)
if (sun['zenith'] > 89.0) & (sun['zenith'] <= 90.0): # Hopefully fixes weird values in Perez et al. when altitude < 1.0, i.e. close to sunrise/sunset
sun['zenith'] = 89.0
altitude[0, i] = 90. - sun['zenith']
zen[0, i] = sun['zenith'] * (np.pi/180.)
azimuth[0, i] = sun['azimuth']
# day of year and check for leap year
if calendar.isleap(time['year']):
dayspermonth = np.atleast_2d([31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31])
else:
dayspermonth = np.atleast_2d([31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31])
# jday[0, i] = np.sum(dayspermonth[0, 0:time['month']-1]) + time['day'] # bug when a new day 20191015
YYYY[0, i] = met[i, 0]
doy = YMD.timetuple().tm_yday
jday[0, i] = doy
if (doy > leafon1) | (doy < leafoff1):
leafon[0, i] = 1
else:
leafon[0, i] = 0
return YYYY, altitude, azimuth, zen, jday, leafon, dectime, altmax