Fotoperíodo
Os seguintes exemplos de códigos servem para calcular a declinação solar e a duração do dia (horas de sol) de um determinado ponto em um determinado dia do ano.
Pacotes
library(tidyverse) # manipulação de dados
Funções auxiliares
# converter graus para radianos
deg2rad = function(deg) {
return((pi * deg) / 180)
}
# converter radianos para graus
rad2deg = function(rad) {
return((180 * rad) / pi)
}
# converter hora em decimal para hⓜ️s
dec2hms <- function(nasc){
min <- nasc%%1 * 60
seg <- min%%1 * 60
paste0(trunc(nasc), ":", trunc(min), ":", trunc(seg))
}
Declinação solar
Declinação do Sol é a distância angular do Equador ao paralelo do astro. A declinação pode ser obtida a partir da seguinte fórmula
$$
d = 23.45 * \sin[360 / 365.2422 \times (284 + N)]
$$
Onde: d = declinação; N = número do dia Juliano (1 = 01/01/2021 - 365 = 31/12/2021 ou 366 se ano bissexto). A função dsol
função computa a declinação solar em função do dia Juliano
# declinação solar
dsol <- function(dj){
if(length(dj) > 1){
sapply(dj, dsol)
} else{
23.45 * sin(deg2rad((360/365.2422) * (284 + dj)))
}
}
# exemplo para dia 15/01
dsol(14)
## [1] -21.46852
# um exemplo com a inclinação ao longo de um ano
df_decl <-
data.frame(dj = 1:365,
dec = dsol(1:365))
ggplot(df_decl, aes(x = dj, y = dec)) +
geom_line() +
labs(x = "Dia juliano",
y = "Declinação solar (º)")
Duração do dia
A duração do dia e da noite pode ser calculada utilizando a latitude do local e o dia do ano de interesse:
$$ T=\frac{2}{15} \arccos (-\tan \phi \cdot \tan \delta) $$
Onde $T$ é o tempo de duração do dia; $\phi$ é a latitude da cidade (para cidades do hemisfério sul, o sinal é negativo); $\delta$ é a declinação solar, calculada no ítem anterior.
hsol <- function(lat, dj, lon = NULL){
ds <- dsol(dj)
n <- (2 / 15) * rad2deg(acos(-(tan(deg2rad(lat))) * (tan(deg2rad(ds)))))
n2 <- n / 2
if(is.null(lon)){
h_cor <- 0
} else{
dif <- (lon - 45)
h_cor <- dif / 15
}
nasc <- 12 - n2
por <- 12 + n2
nasc_cor <- nasc + h_cor
por_cor <- por + h_cor
return(data.frame(d_sol = ds,
h_sol = n,
nasc = dec2hms(nasc),
por = dec2hms(por),
nasc_cor = dec2hms(nasc_cor),
por_cor = dec2hms(por_cor)))
}
No seguinte exemplo, é calculado a duração do dia e o nascer e por do sol para a seguinte localidade
- Local: São Paulo
- Latitude: -23°32'36” (-23,543333)
- Longitude: 46°37'59” (46,633056)
- Cálculo para o dia 29 de abril (n=119)
hsol(lat = -23.543333,
lon = 46.633056,
dj = 119)
## d_sol h_sol nasc por nasc_cor por_cor
## 1 14.18302 11.15708 6:25:17 17:34:42 6:31:49 17:41:14
df <-
data.frame(local = c(rep("Lat = -2", 730),
rep("Lat = -27", 730),
rep("Lat = -45", 730)),
lat = c(rep(-2, 730),
rep(-27, 730),
rep(-45, 730)),
data = rep(seq(as.Date('2021-01-01'), as.Date('2022-12-31'), by = "1 days"), 3),
dj = rep(1:730, 3)) %>%
mutate(hsol(lat = lat, dj = dj))
solt_equi <- as.Date(c('2021-03-20',
'2021-06-21',
'2021-09-22',
'2021-12-21',
'2022-03-20',
'2022-06-21',
'2022-09-22',
'2022-12-21'))
ggplot(df, aes(x = data, y = h_sol, col = local)) +
geom_line(size = 1) +
geom_hline(yintercept = 12, linetype = 2) +
scale_y_continuous(breaks = 9:15) +
scale_x_date(breaks = solt_equi,
date_labels = "%d/%m") +
labs(x = "Dias do ano",
y = "Horas de sol",
title = "Duração no comprimento do dia (H)",
caption = "Elaboração: Prof. Tiago Olivoto") +
theme_gray(base_size = 14) +
theme(legend.position = "bottom",
panel.grid.minor = element_blank(),
legend.title = element_blank())