solaR timestamp for radiation on a tilted surface

前端 未结 2 1630
心在旅途
心在旅途 2021-01-20 02:20

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

相关标签:
2条回答
  • 2021-01-20 02:47

    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".

    0 讨论(0)
  • 2021-01-20 02:48

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

    data with mean solar time

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

    sun geometry

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

    horizontal irradiance

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

    irradiance on the tilted plane

    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:

    • Ripley, B. D. and Hornik, K. (2001) Date-time classes. R News, 1/2, 8–11.
    • Gabor Grothendieck and Thomas Petzoldt (2004), Date and Time Classes in R, R News 4(1), 29-32.

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

    0 讨论(0)
提交回复
热议问题