solaR timestamp for radiation on a tilted surface

匿名 (未验证) 提交于 2019-12-03 02:31:01

问题:

I am trying to use the R package solaR to calculate irradiance on a tilted plane given measured irradiance on the horizontal plane. I can get the code to work, but the final output timestamp does not make sense.

Data for this code can be found here. It is one day's worth of measured irradiance (global horizontal -- ghz, direct normal -- dir, diffuse horizontal -- dhz, and outdoor temp ta) for Austin, TX. The timestamp is local 'CST6CDT' time. The data is for a clear day, so that maximum value of global horizontal (ghz) should roughly correspond with solar noon (the time that the sun crosses the local meridian).

My code is as follows:

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) 

When I use beta = 0, alfa = 0 (a flat plane) I should get roughly the same output as my input. However, when I search for the max value of global horizontal irradiance:

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

I get it to return a max at 2013-05-05 10:43:01 and I cannot figure out what/why this time is as it is. It is not local time, that should be around 13:24. Local solar time should be around 12:00. UTC time should be around 18:24, and UTC solar time (if there is such a thing) should be 17:00...

I know this is obscure, but any thoughts?

回答1:

I have tested the code and data in my computer with correct results. Let's reproduce the main steps with some graphical outputs:

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')) 

The function local2Solar converts the time zone of a POSIXct object to the mean solar time and set its time zone to UTC as a synonym of mean solar time. It includes two corrections: the difference of longitudes between the location and the time zone, and the daylight saving 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) 

Because your data belongs to a clear day and this time series uses mean solar time, the maximum should be located around noon.

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

Now we compute the sun geometry with calcSol. Here I am using a different code from yours.

## 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')) 

Next we calculate radiation on the horizontal surface.

g0 <- calcG0(lat, modeRad = 'bdI', dataRad = z, corr = 'none')  xyplot(as.zooI(g0), type=c('l', 'g')) 

Finally, with calcGef we obtain irradiance on a tilted surface:

gef <- calcGef(lat=lat, modeRad='bdI', dataRad=z)  xyplot(as.zooI(gef), type=c('l', 'g')) 

I suspect that your problem is related with time zones defined in your computer. Could you check these results?:

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 

Maybe these technical notes are useful for additional information on this topic:

Besides, you should take a look at the information and examples of help(timezone).



回答2:

thank you greatly for responding directly and for the great package. It turns out we had a wildly wrong interpretation of solar time. I am seeing a different possible issue that would not fit into the comments section.

When I run:

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

I get "2013-07-07 12:05:01 UTC". According to NOAA, "2013-07-07 13:36:00" is solar noon for that day.

Just to confuse matter, when I run:

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

I get "2013-06-07 11:59:01 UTC", so it appears to be very close. According to NOAA, "2013-06-07 13:30:00" is solar noon for that day.

If you were to run:

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

You would get "2013-01-07 12:06:28 UTC". According to NOAA, "2013-01-07 12:37:27"" is solar noon for that day.

I ran G. Master's equations separately from solaR and got: "2013-06-07 13:29:30 CDT" (the highest precision is each minute for this version) for the time with maximum incident power for the first case on "2013-06-07".



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!