Временная метка solaR для излучения на наклонной поверхности

Я пытаюсь использовать пакет R SolaR для расчета освещенности на наклонной плоскости с учетом измеренной освещенности на горизонтальной плоскости. Я могу заставить код работать, но конечная метка времени не имеет смысла.

Данные для этого кода можно найти здесь. Это измеренное значение освещенности за один день (глобальная горизонталь - ГГц, прямая норма - дир, рассеянная горизонталь - Гц и температура наружного воздуха) для Остина, Техас. Временная метка - это местное время CST6CDT. Данные относятся к ясному дню, поэтому максимальное значение глобальной горизонтали (ГГц) должно приблизительно соответствовать солнечному полудню (времени, когда Солнце пересекает местный меридиан).

Мой код выглядит следующим образом:

library(solaR)

sol_data <- read.csv(file)

    # The data must be named a certain way.
names(sol_data) <- c('time', 'G0', 'B', 'D0', 'Ta')

    # The negatives are an artifact of the sensor and are set to 0.
sol_data$G0 <- ifelse(sol_data$G0 < 0, 0, sol_data$G0)
sol_data$B <- ifelse(sol_data$B < 0, 0, sol_data$B)
sol_data$D0 <- ifelse(sol_data$D0 < 0, 0, sol_data$D0)

# This calculates the beam incidence on the horizontal plane. 
sol_data$B0 <- sol_data$G0 - sol_data$D0
sol_data$B0 <- ifelse(sol_data$B0 < 0, 0, sol_data$B0)

    # This takes the data and assigns the timestamp to a certain format and timezone
idxLocal <- with(sol_data, as.POSIXct(time, format='%Y-%m-%d %H:%M:%S', tz = 'CST6CDT'))
    # This converts the timestamp to solar time
idx <- local2Solar(idxLocal, lon = -97.7428)

    # Creates a zoo object needed to make the Meteo file for input
z <- zoo(sol_data[,c('G0', 'D0', 'B0', 'Ta')], idx)

    # local latitude
lat = 30.2669

    # Creates a Meteo file
My_Meteo <- zoo2Meteo(z, lat=lat)


# Finds the start and end date of the input file
start <- idx[1] 
end <- idx[length(idx)] 

    # Returns a base time for the calculations
BTd <- fBTd(mode = 'serie', year = '2013', start = start, end = end, format = '%Y-%m-%d %H:%M:%S')
    # Computes the movement of the sun/earth
sol <- calcSol(lat = 30.2669, BTd, sample = 'min')

# Creates a G0 file for solar rad on horizontal surface
compI <- calcG0(30.2669, modeRad = 'bdI', dataRad = My_Meteo, corr = 'none')
    # creates the angles for calculation of the rad on a tilted surface
angGen <- fTheta(sol = sol, beta = 0, alfa = 0)
    # Calculates the irradiance on a tilted surface
irad_tilt <- fInclin(compI, angGen)

Когда я использую бета = 0, альфа = 0 (плоская плоскость), я должен получить примерно тот же результат, что и мой ввод. Тем не менее, когда я ищу максимальное значение глобального горизонтального освещения:

x <- which.max(irad_tilt$G) 
irad_tilt[x,]

Я получаю это, чтобы возвратить максимум в 2013-05-05 10:43:01, и я не могу понять, что / почему это время как есть. Это не местное время, это должно быть около 13:24. Местное солнечное время должно быть около 12:00. Время UTC должно быть около 18:24, а солнечное время UTC (если оно есть) должно быть 17:00...

Я знаю, это неясно, но есть мысли?

2 ответа

Решение

Я проверил код и данные на моем компьютере с правильными результатами. Давайте воспроизведем основные шаги с некоторыми графическими выводами:

library(solaR)

sol_data <- read.csv('/tmp/one_day_WSL_8.csv')

## The data must be named a certain way.
names(sol_data) <- c('time', 'G0', 'B', 'D0', 'Ta')

## The negatives are an artifact of the sensor and are set to 0.
sol_data$G0 <- ifelse(sol_data$G0 < 0, 0, sol_data$G0)
sol_data$B <- ifelse(sol_data$B < 0, 0, sol_data$B)
sol_data$D0 <- ifelse(sol_data$D0 < 0, 0, sol_data$D0)

## This calculates the beam incidence on the horizontal plane.
sol_data$B0 <- sol_data$G0 - sol_data$D0
sol_data$B0 <- ifelse(sol_data$B0 < 0, 0, sol_data$B0)

## This takes the data and assigns the timestamp to a certain format and timezone
idxLocal <- with(sol_data, as.POSIXct(time, format='%Y-%m-%d %H:%M:%S', tz = 'CST6CDT'))

Функция local2Solar преобразует часовой пояс POSIXct возражать против среднего солнечного времени и установить его часовой пояс в UTC как синоним среднего солнечного времени. Он включает две поправки: разницу долгот между местоположением и часовым поясом и переход на летнее время.

idx <- local2Solar(idxLocal, lon = -97.7428)

## Creates a zoo object needed to make the Meteo file for input
z <- zoo(sol_data[,c('G0', 'D0', 'B0', 'Ta')], idx)

Поскольку ваши данные относятся к ясному дню, а этот временной ряд использует среднее солнечное время, максимум должен находиться около полудня.

xyplot(z, type=c('l', 'g'))

данные со средним солнечным временем

Теперь мы вычисляем геометрию Солнца с calcSol, Здесь я использую код, отличный от вашего.

## local latitude
lat = 30.2669
## Computes the movement of the sun/earth
sol <- calcSol(lat, BTi=idx)

xyplot(as.zooI(sol), type=c('l', 'g'))

геометрия солнца

Далее мы рассчитываем излучение на горизонтальной поверхности.

g0 <- calcG0(lat, modeRad = 'bdI', dataRad = z, corr = 'none')

xyplot(as.zooI(g0), type=c('l', 'g'))

горизонтальная освещенность

Наконец, с calcGef получаем освещенность на наклонной поверхности:

gef <- calcGef(lat=lat, modeRad='bdI', dataRad=z)

xyplot(as.zooI(gef), type=c('l', 'g'))

освещение на наклонной плоскости

Я подозреваю, что ваша проблема связана с часовыми поясами, определенными на вашем компьютере. Не могли бы вы проверить эти результаты?:

lonHH('America/Chicago')
## [1] -1.570796
lonHH('CDT6CST')
## [1] -1.570796

idxLocal1 <- as.POSIXct(sol_data$time, format='%Y-%m-%d %H:%M:%S', tz = 'CST6CDT')
idxLocal2 <- as.POSIXct(sol_data$time, format='%Y-%m-%d %H:%M:%S', tz = 'America/Chicago')

idxUTC1 <- as.POSIXct(format(idxLocal1, tz='UTC'), tz='UTC')
idxUTC2 <- as.POSIXct(format(idxLocal2, tz='UTC'), tz='UTC')

all.equal(idxUTC1, idxUTC2)
## [1] TRUE

Возможно, эти технические примечания полезны для дополнительной информации по этой теме:

Кроме того, вы должны взглянуть на информацию и примеры help(timezone),

Большое спасибо за прямой ответ и за отличный пакет. Оказывается, у нас была совершенно неправильная интерпретация солнечного времени. Я вижу другую возможную проблему, которая не вписывается в раздел комментариев.

Когда я бегу:

local2Solar(as.POSIXct("2013-07-07 13:36:00",tz="America/Chicago"),lon=-97.7428)

я получил "2013-07-07 12:05:01 UTC", Согласно NOAA, "2013-07-07 13:36:00" это солнечный полдень для этого дня.

Просто чтобы запутать материю, когда я бегу:

local2Solar(as.POSIXct("2013-06-07 13:30:00",tz="America/Chicago"),lon=-97.7428)

я получил "2013-06-07 11:59:01 UTC"так что, похоже, очень близко. Согласно NOAA, "2013-06-07 13:30:00" это солнечный полдень для этого дня.

Если вы должны были бежать:

local2Solar(as.POSIXct("2013-01-07 12:37:27",tz="America/Chicago"),lon=-97.7428)

Вы бы получили "2013-01-07 12:06:28 UTC", Согласно NOAA, "2013-01-07 12:37:27"" это солнечный полдень для этого дня.

Я управлял уравнениями Г. Мастера отдельно от solaR и получил: "2013-06-07 13:29:30 CDT" (максимальная точность - каждая минута для этой версии) для времени с максимальной падающей мощностью для первого случая на "2013-06-07",

Другие вопросы по тегам