| Type: | Package | 
| Title: | Radiation and Photovoltaic Systems | 
| Version: | 0.47 | 
| Encoding: | UTF-8 | 
| Description: | Calculation methods of solar radiation and performance of photovoltaic systems from daily and intradaily irradiation data sources. | 
| URL: | https://oscarperpinan.codeberg.page/solar/ | 
| BugReports: | https://codeberg.org/oscarperpinan/solar/issues | 
| License: | GPL-3 | 
| LazyData: | yes | 
| Depends: | R (≥ 2.10), zoo, lattice, latticeExtra | 
| Imports: | RColorBrewer, graphics, grDevices, stats, methods | 
| Suggests: | sp, raster, rasterVis, tdr, meteoForecast | 
| NeedsCompilation: | no | 
| Packaged: | 2025-04-08 16:13:02 UTC; oscar | 
| Author: | Oscar Perpiñán Lamigueiro | 
| Maintainer: | Oscar Perpiñán Lamigueiro <oscar.perpinan@upm.es> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-04-09 13:00:07 UTC | 
Solar Radiation and Photovoltaic Systems with R
Description
The solaR package allows for reproducible research both for
photovoltaics (PV) systems performance and solar radiation. It
includes a set of classes, methods and functions to calculate the sun
geometry and the solar radiation incident on a photovoltaic generator
and to simulate the performance of several applications of the
photovoltaic energy. This package performs the whole calculation
procedure from both daily and intradaily global horizontal irradiation
to the final productivity of grid-connected PV systems and water
pumping PV systems.
Details
solaR is designed using a set of S4 classes whose core
is a group of slots with multivariate time series. The classes share a
variety of methods to access the information and several visualization
methods. In addition, the package provides a tool for the visual
statistical analysis of the performance of a large PV plant composed of
several systems.
Although solaR is primarily designed for time series associated
to a location defined by its latitude/longitude values and the
temperature and irradiation conditions, it can be easily combined with
spatial packages for space-time analysis.
The best place to learn how to use the package is the companion paper published by the Journal of Statistical Software:
Perpiñán Lamigueiro, O. (2012). solaR: Solar Radiation and Photovoltaic Systems with R. Journal of Statistical Software, 50(9), 1–32. https://doi.org/10.18637/jss.v050.i09
Please note that this package needs to set the timezone to
UTC. Every ‘zoo’ object created by the package will have an
index with this time zone as a synonym of mean solar time..
You can check it after loading solaR with:
Sys.getenv('TZ')
If you need to change it, use:
Sys.setenv(TZ = 'YourTimeZone')
Index of functions and classes:
G0-class                Class "G0": irradiation and irradiance on the
                        horizontal plane.
Gef-class               Class "Gef": irradiation and irradiance on the
                        generator plane.
HQCurve                 H-Q curves of a centrifugal pump
Meteo-class             Class "Meteo"
NmgPVPS                 Nomogram of a photovoltaic pumping system
ProdGCPV-class          Class "ProdGCPV": performance of a grid
                        connected PV system.
ProdPVPS-class          Class "ProdPVPS": performance of a PV pumping
                        system.
Shade-class             Class "Shade": shadows in a PV system.
Sol-class               Class "Sol": Apparent movement of the Sun from
                        the Earth
aguiar                  Markov Transition Matrices for the Aguiar etal.
                        procedure
as.data.frameD          Methods for Function as.data.frameD
as.data.frameI          Methods for Function as.data.frameI
as.data.frameM          Methods for Function as.data.frameM
as.data.frameY          Methods for Function as.data.frameY
as.zooD                 Methods for Function as.zooD
as.zooI-methods         Methods for Function as.zooI
as.zooM                 Methods for Function as.zooM
as.zooY                 Methods for Function as.zooY
calcG0                  Irradiation and irradiance on the horizontal
                        plane.
calcGef                 Irradiation and irradiance on the generator
                        plane.
calcShd                 Shadows on PV systems.
calcSol                 Apparent movement of the Sun from the Earth
compare                 Compare G0, Gef and ProdGCPV objects
compareLosses           Losses of a GCPV system
corrFdKt                Correlations between the fraction of diffuse
                        irradiation and the clearness index.
d2r                     Conversion between angle units.
diff2Hours              Small utilities for difftime objects.
fBTd                    Daily time base
fCompD                  Components of daily global solar irradiation on
                        a horizontal surface
fCompI                  Calculation of solar irradiance on a horizontal
                        surface
fInclin                 Solar irradiance on an inclined surface
fProd                   Performance of a PV system
fPump                   Performance of a centrifugal pump
fSolD                   Daily apparent movement of the Sun from the
                        Earth
fSolI                   Instantaneous apparent movement of the Sun from
                        the Earth
fSombra                 Shadows on PV systems
fTemp                   Intradaily evolution of ambient temperature
fTheta                  Angle of incidence of solar irradiation on a
                        inclined surface
getData                 Methods for function getData
getG0                   Methods for function getG0
getLat                  Methods for Function getLat
helios                  Daily irradiation and ambient temperature from
                        the Helios-IES database
hour                    Utilities for time indexes.
indexD                  Methods for Function indexD
indexI                  Methods for Function indexI
indexRep-methods        Methods for Function indexRep
levelplot-methods       Methods for function levelplot.
local2Solar             Local time, mean solar time and UTC time zone.
mergesolaR              Merge solaR objects
optimShd                Shadows calculation for a set of distances
                        between elements of a PV grid connected plant.
prodEx                  Productivity of a set of PV systems of a PV
                        plant.
prodGCPV                Performance of a grid connected PV system.
prodPVPS                Performance of a PV pumping system
pumpCoef                Coefficients of centrifugal pumps.
readBD                  Daily or intradaily values of global horizontal
                        irradiation and ambient temperature from a
                        local file or a data.frame.
readG0dm                Monthly mean values of global horizontal
                        irradiation.
shadeplot               Methods for Function shadeplot
solaR.theme             solaR theme
window                  Methods for extracting a time window
writeSolar              Exporter of solaR results
xyplot-methods          Methods for function xyplot in Package 'solaR'
Author(s)
Oscar Perpiñán Lamigueiro
Maintainer: Oscar Perpiñán Lamigueiro <oscar.perpinan@gmail.com>
Apparent movement of the Sun from the Earth
Description
Compute the apparent movement of the Sun from the Earth with the
functions fSolD and fSolI.
Usage
calcSol(lat, BTd, sample = 'hour', BTi,
        EoT = TRUE, keep.night = TRUE,
        method = 'michalsky')
Arguments
| lat | Latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| BTd | Daily time base, a  | 
| sample | Increment of the intradaily sequence. It is a character
string, containing one of ‘"sec"’, ‘"min"’, ‘"hour"’.
This can optionally be preceded by a (positive or
negative) integer and a space, or followed by ‘"s"’. It is
used by  It is not considered if  | 
| BTi | Intradaily time base, a  | 
| EoT | logical, if  | 
| keep.night | logical, if  | 
| method | 
 | 
Value
A Sol-class object.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Cooper, P.I., Solar Energy, 12, 3 (1969). "The Absorption of Solar Radiation in Solar Stills" 
- Spencer, Search 2 (5), 172, https://www.mail-archive.com/sundial@uni-koeln.de/msg01050.html 
- Michalsky, J., 1988: The Astronomical Almanac's algorithm for approximate solar position (1950-2050), Solar Energy 40, 227-235 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
Examples
BTd = fBTd(mode = 'serie')
lat = 37.2
sol = calcSol(lat, BTd[100])
print(as.zooD(sol))
library(lattice)
xyplot(as.zooI(sol))
solStrous = calcSol(lat, BTd[100], method = 'strous')
print(as.zooD(solStrous))
solSpencer = calcSol(lat, BTd[100], method = 'spencer')
print(as.zooD(solSpencer))
solCooper = calcSol(lat, BTd[100], method = 'cooper')
print(as.zooD(solCooper))
Irradiation and irradiance on the horizontal plane.
Description
This function obtains the global, diffuse and direct irradiation and
irradiance on the horizontal plane from the values of daily and
intradaily global irradiation on the horizontal plane.
It makes use of the functions calcSol,
fCompD, fCompI, fBTd
and readBD (or equivalent).
Besides, if information about maximum and minimum temperatures values are available it obtains a series of temperature values with fTemp.
Usage
calcG0(lat, modeRad = 'prom', dataRad,
       sample = 'hour', keep.night = TRUE,
       sunGeometry = 'michalsky',
       corr, f, ...)
Arguments
| lat | numeric, latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| modeRad | A character string, describes the kind of source data of the global irradiation and ambient temperature. It can be  
 If  If  | 
| dataRad | 
 | 
| sample | 
 | 
| keep.night | 
 | 
| sunGeometry | 
 | 
| corr | A character, the correlation between the the fraction of diffuse irradiation and the clearness index to be used. With this version several options are available, as described in
 If  If  | 
| f | A function defininig a correlation between the fraction of
diffuse irradiation and the clearness index. It is only neccessary
when  | 
| ... | 
Value
A G0 object.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
- Aguiar, Collares-Pereira and Conde, "Simple procedure for generating sequences of daily radiation values using a library of Markov transition matrices", Solar Energy, Volume 40, Issue 3, 1988, Pages 269–279 
See Also
calcSol,
fCompD,
fCompI,
readG0dm,
readBD,
readBDi,
corrFdKt.
Examples
G0dm = c(2.766, 3.491, 4.494, 5.912, 6.989, 7.742, 7.919, 7.027, 5.369, 3.562, 2.814, 2.179)*1000;
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 
  15.2)
g0 <- calcG0(lat = 37.2, modeRad = 'prom', dataRad = list(G0dm = G0dm, Ta = Ta))
print(g0)
xyplot(g0)
## Aguiar et al.
g0 <- calcG0(lat = 37.2, modeRad = 'aguiar', dataRad = G0dm)
print(g0)
xyplot(g0)
##Now the G0I component of g0 is used as
##the bdI argument to calcG0 in order to
##test the intradaily correlations of fd-kt
BDi = as.zooI(g0)
BDi$Ta = 25 ##Information about temperature must be contained in BDi
g02 <- calcG0(lat = 37.2, 
            modeRad = 'bdI', 
            dataRad = list(lat = 37.2, file = BDi), 
            corr = 'none')
print(g02)
g03 <- calcG0(lat = 37.2, 
            modeRad = 'bdI', 
            dataRad = list(lat = 37.2, file = BDi), 
            corr = 'BRL')
print(g03)
xyplot(fd ~ kt, data = g03, pch = 19, alpha = 0.3)
## Not run: 
##NREL-MIDC
##La Ola, Lanai
##Latitude: 20.76685o North
##Longitude: 156.92291o West
##Elevation: 381 meters AMSL
##Time Zone: -10.0
NRELurl <- 'http://goo.gl/fFEBN'
dat <- read.table(NRELurl, header = TRUE, sep = ',')
names(dat) <- c('date', 'hour', 'G0', 'B', 'D0', 'Ta')
##B is direct normal. We need direct horizontal.
dat$B0 <- dat$G0 - dat$D0
##http://www.nrel.gov/midc/la_ola_lanai/instruments.html:
##The datalogger program runs using Greenwich Mean Time (GMT), 
##data is converted to Hawaiin Standard Time (HST) after data collection
idxLocal <- with(dat, as.POSIXct(paste(date, hour), format = '%m/%d/%Y %H:%M', tz = 'HST'))
idx <- local2Solar(idxLocal, lon = -156.9339)
NRELMeteo <- zoo(dat[, c('G0', 'D0', 'B0', 'Ta')], idx)
lat = 20.77
g0 <- calcG0(lat = lat, modeRad = 'bdI', dataRad = NRELMeteo, corr = 'none')
xyplot(g0)
xyplot(as.zooI(g0), superpose = TRUE)
g02 <- calcG0(lat = lat, modeRad = 'bdI', dataRad = NRELMeteo, corr = 'BRL')
xyplot(g02)
xyplot(as.zooI(g02), superpose = TRUE)
xyplot(fd ~ kt, data = g02, pch = 19, cex = 0.5, alpha = 0.5)
g03 <- calcG0(lat = lat, modeRad = 'bdI', dataRad = NRELMeteo, corr = 'CLIMEDh')
xyplot(g03)
xyplot(as.zooI(g03), superpose = TRUE)
xyplot(fd ~ kt, data = g03, pch = 19, cex = 0.5, alpha = 0.5)
## End(Not run)
Irradiation and irradiance on the generator plane.
Description
This function obtains the global, diffuse and direct irradiation and
irradiance on the generator plane from the values of daily or intradaily global
irradiation on the horizontal plane. It makes use of the functions
calcG0, fTheta,
fInclin. Besides, it can calculate the shadows effect with
the calcShd function.
Usage
calcGef(lat,
        modeTrk = 'fixed',
        modeRad = 'prom',
        dataRad,
        sample = 'hour',
        keep.night = TRUE,
        sunGeometry = 'michalsky',
        corr, f,
        betaLim = 90, beta = abs(lat)-10, alfa = 0,
        iS = 2, alb = 0.2, horizBright = TRUE, HCPV = FALSE,
        modeShd = '',
        struct = list(),
        distances = data.frame(),
        ...)
Arguments
| lat | numeric, latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| modeTrk | character, to be chosen from  | 
| modeRad,dataRad | Information about the source data of the
global irradiation. See  | 
| sample,keep.night | See  | 
| sunGeometry | 
 | 
| corr,f | See  | 
| beta | numeric, inclination angle of the surface
(degrees). It is only needed when  | 
| betaLim | numeric, maximum value of the inclination angle for a tracking surface. Its default value is 90 (no limitation)) | 
| alfa | numeric, azimuth angle of the surface (degrees). It is
measured from the south ( | 
| iS | integer, degree of dirtiness. Its value must be included in
the set (1,2,3,4).  | 
| alb | numeric, albedo reflection coefficient. Its default value is 0.2 | 
| modeShd,struct,distances | See  | 
| horizBright | logical, if TRUE, the horizon brightness correction proposed by Reind et al. is used. | 
| HCPV | logical, if TRUE the diffuse and albedo components of the effective irradiance are set to zero. HCPV is the acronym of High Concentration PV system. | 
| ... | 
Value
A Gef object.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Hay, J. E. and McKay, D. C.: Estimating Solar Irradiance on Inclined Surfaces: A Review and Assessment of Methodologies. Int. J. Solar Energy, (3):pp. 203, 1985. 
- Martin, N. and Ruiz, J.M.: Calculation of the PV modules angular losses under field conditions by means of an analytical model. Solar Energy Materials & Solar Cells, 70:25–38, 2001. 
- D. T. Reindl and W. A. Beckman and J. A. Duffie: Evaluation of hourly tilted surface radiation models, Solar Energy, 45:9-17, 1990. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
calcG0,
fTheta,
fInclin,
calcShd.
Examples
lat <- 37.2
###12 Average days.
G0dm = c(2.766, 3.491, 4.494, 5.912, 6.989, 7.742, 7.919, 7.027, 5.369,
         3.562, 2.814, 2.179)*1000;
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2,
       15.2)
##Fixed surface, default values of inclination and azimuth.
gef <- calcGef(lat = lat, modeRad = 'prom', dataRad = list(G0dm = G0dm, Ta = Ta))
print(gef)
xyplot(gef)
##Two-axis surface, no limitation angle.
gef2 <- calcGef(lat = lat, modeRad = 'prom',
                dataRad = list(G0dm = G0dm, Ta = Ta),
                modeTrk = 'two')
print(gef2)
xyplot(gef2)
struct = list(W = 23.11, L = 9.8, Nrow = 2, Ncol = 8)
distances = data.frame(Lew = 40, Lns = 30, H = 0)
gefShd <- calcGef(lat = lat, modeRad = 'prom',
                  dataRad = list(G0dm = G0dm, Ta = Ta),
                  modeTrk = 'two',
                  modeShd = c('area', 'prom'), 
                  struct = struct, distances = distances)
print(gefShd)
## Not run: 
##Fixed surface using Aguiar method
gefAguiar <- calcGef(lat = lat, modeRad = 'aguiar', dataRad = G0dm)
##Two-axis tracker, using the previous result.
##'gefAguiar' is internally coerced to a 'G0' object.
gefAguiar2 <- calcGef(lat = lat, modeRad = 'prev', dataRad = gefAguiar, modeTrk = 'two')
print(gefAguiar2)
xyplot(gefAguiar2)
###Shadows between two-axis trackers, again using the gefAguiar result.
struct = list(W = 23.11, L = 9.8, Nrow = 2, Ncol = 8)
distances = data.frame(Lew = 40, Lns = 30, H = 0)
gefShdAguiar <- calcGef(lat = lat, modeRad = 'prev', 
                        dataRad = gefAguiar, modeTrk = 'two', 
                        modeShd = c('area', 'prom'), 
                        struct = struct, distances = distances)
print(gefShdAguiar)
## End(Not run)
Performance of a grid connected PV system.
Description
Compute every step from solar angles to effective irradiance to calculate the performance of a grid connected PV system.
Usage
prodGCPV(lat,
         modeTrk = 'fixed',
         modeRad = 'prom',
         dataRad,
         sample = 'hour',
         keep.night = TRUE,
         sunGeometry = 'michalsky',
         corr, f,
         betaLim = 90, beta = abs(lat)-10, alfa = 0,
         iS = 2, alb = 0.2, horizBright = TRUE, HCPV = FALSE,
         module = list(),
         generator = list(),
         inverter = list(),
         effSys = list(),
         modeShd = '',
         struct = list(),
         distances = data.frame(),
         ...)
Arguments
| lat | numeric, latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| modeTrk | A character string, describing the tracking method
of the generator. See  | 
| modeRad,dataRad | Information about the source data of the
global irradiation. See  | 
| sample,keep.night | See  | 
| sunGeometry | 
 | 
| corr,f | See  | 
| betaLim,beta,alfa,iS,alb,horizBright,HCPV | See  | 
| module | list of numeric values with information about the PV module, 
 | 
| generator | list of numeric values with information about the generator, 
 | 
| inverter | list of numeric values with information about the DC/AC inverter, 
 | 
| effSys | list of numeric values with information about the system losses, 
 | 
| modeShd,struct,distances | See  | 
| ... | 
Details
The calculation of the irradiance on the horizontal plane is
carried out with the function calcG0. The transformation
to the inclined surface makes use of the fTheta and
fInclin functions inside the calcGef function. The shadows are computed with  calcShd while the performance of the PV system is simulated with fProd.
Value
A ProdGCPV object.
Author(s)
Oscar Perpiñán Lamigueiro
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
fProd,
calcGef,
calcShd,
calcG0,
compare,
compareLosses,
mergesolaR
Examples
library(lattice)
library(latticeExtra)
lat <- 37.2;
G0dm <- c(2766, 3491, 4494, 5912, 6989, 7742, 7919, 7027, 5369, 3562,
          2814, 2179)
Ta <- c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2,
        17.2, 15.2)
prom <- list(G0dm = G0dm, Ta = Ta)
###Comparison of different tracker methods
prodFixed <- prodGCPV(lat = lat, dataRad = prom,
                      keep.night = FALSE)
prod2x <- prodGCPV(lat = lat, dataRad = prom,
                   modeTrk = 'two',
                   keep.night = FALSE)
prodHoriz <- prodGCPV(lat = lat,dataRad = prom,
                      modeTrk = 'horiz',
                      keep.night = FALSE)
##Comparison of yearly productivities
compare(prodFixed, prod2x, prodHoriz)
compareLosses(prodFixed, prod2x, prodHoriz)
##Comparison of power time series
ComparePac <- CBIND(two = as.zooI(prod2x)$Pac,
                    horiz = as.zooI(prodHoriz)$Pac,
                    fixed = as.zooI(prodFixed)$Pac)
AngSol <- as.zooI(as(prodFixed, 'Sol'))
ComparePac <- CBIND(AngSol, ComparePac)
mon <- month(index(ComparePac))
xyplot(two + horiz + fixed ~ AzS|mon, data = ComparePac,
       type = 'l',
       auto.key = list(space = 'right',
                     lines = TRUE,
                     points = FALSE),
       ylab = 'Pac')
## Not run: 
###Use of modeRad = 'aguiar' and modeRad = 'prev'
prodAguiarFixed <- prodGCPV(lat = lat,
                            modeRad = 'aguiar',
                            dataRad = G0dm,
                            keep.night = FALSE)
##We want to compare systems with different effective irradiance
##so we have to convert prodAguiarFixed to a 'G0' object.
G0Aguiar <- as(prodAguiarFixed, 'G0')
prodAguiar2x <- prodGCPV(lat = lat,
                         modeTrk = 'two',
                         modeRad = 'prev',
                         dataRad = G0Aguiar)
prodAguiarHoriz <- prodGCPV(lat = lat,
                            modeTrk = 'horiz',
                            modeRad = 'prev',
                            dataRad = G0Aguiar)
##Comparison of yearly values
compare(prodAguiarFixed,
        prodAguiar2x,
        prodAguiarHoriz)
compareLosses(prodAguiarFixed,
              prodAguiar2x,
              prodAguiarHoriz)
##Compare of daily productivities of each tracking system
compareYf <- mergesolaR(prodAguiarFixed,
                        prodAguiar2x,
                        prodAguiarHoriz)
xyplot(compareYf, superpose = TRUE,
       ylab = 'kWh/kWp',
       main = 'Daily productivity',
       auto.key = list(space = 'right'))
## End(Not run)
###Shadows
#Two-axis trackers
struct2x <- list(W = 23.11, L = 9.8, Nrow = 2, Ncol = 8)
dist2x <- data.frame(Lew = 40, Lns = 30, H = 0)
prod2xShd <- prodGCPV(lat = lat, dataRad = prom,
                      modeTrk = 'two',
                      modeShd = 'area',
                      struct = struct2x,
                      distances = dist2x)
print(prod2xShd)
#Horizontal N-S tracker
structHoriz <- list(L = 4.83);
distHoriz <- data.frame(Lew = structHoriz$L*4);
#Without Backtracking
prodHorizShd <- prodGCPV(lat = lat, dataRad = prom,
                         sample = '10 min',
                         modeTrk = 'horiz',
                         modeShd = 'area', betaLim = 60,
                         distances = distHoriz,
                         struct = structHoriz)
print(prodHorizShd)
xyplot(r2d(Beta)~r2d(w),
       data = prodHorizShd,
       type = 'l',
       main = 'Inclination angle of a horizontal axis tracker',
       xlab = expression(omega (degrees)),
       ylab = expression(beta (degrees)))
#With Backtracking
prodHorizBT <- prodGCPV(lat = lat, dataRad = prom,
                        sample = '10 min',
                        modeTrk = 'horiz',
                        modeShd = 'bt', betaLim = 60,
                        distances = distHoriz,
                        struct = structHoriz)
print(prodHorizBT)
xyplot(r2d(Beta)~r2d(w),
       data = prodHorizBT,
       type = 'l',
       main = 'Inclination angle of a horizontal axis tracker\n with backtracking',
       xlab = expression(omega (degrees)),
       ylab = expression(beta (degrees)))
compare(prodFixed, prod2x, prodHoriz, prod2xShd,
        prodHorizShd, prodHorizBT)
compareLosses(prodFixed, prod2x, prodHoriz, prod2xShd,
              prodHorizShd, prodHorizBT)
compareYf2 <- mergesolaR(prodFixed, prod2x, prodHoriz, prod2xShd,
                         prodHorizShd, prodHorizBT)
xyplot(compareYf2, superpose = TRUE,
       ylab = 'kWh/kWp', main = 'Daily productivity',
       auto.key = list(space = 'right'))
Performance of a PV pumping system
Description
Compute every step from solar angles to effective irradiance to calculate the performance of a PV pumping system.
Usage
prodPVPS(lat,
         modeTrk = 'fixed',
         modeRad = 'prom',
         dataRad,
         sample = 'hour',
         keep.night = TRUE,
         sunGeometry = 'michalsky',
         corr, f,
         betaLim = 90, beta = abs(lat)-10, alfa = 0,
         iS = 2, alb = 0.2, horizBright = TRUE, HCPV = FALSE,
         pump , H,
         Pg, converter= list(),
         effSys = list(),
         ...)
Arguments
| lat | numeric, latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| modeTrk | A character string, describing the tracking method
of the generator. See  | 
| modeRad,dataRad | Information about the source data of the
global irradiation. See  | 
| sample,keep.night | See  | 
| sunGeometry | 
 | 
| corr,f | See  | 
| betaLim,beta,alfa,iS,alb,horizBright,HCPV | See  | 
| pump | A  | 
| H | Total manometric head (m) | 
| Pg | Nominal power of the PV generator (Wp) | 
| converter | 
 | 
| effSys | list of numeric values with information about the system losses, 
 | 
| ... | 
Details
The calculation of the irradiance on the generator is carried
out with the function calcGef. The  performance of the PV system is simulated with fPump.
Value
A ProdPVPS object.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Abella, M. A., Lorenzo, E. y Chenlo, F.: PV water pumping systems based on standard frequency converters. Progress in Photovoltaics: Research and Applications, 11(3):179–191, 2003, ISSN 1099-159X. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Shadows on PV systems.
Description
 Compute the irradiance and irradiation including shadows
for two-axis and horizontal N-S axis trackers and fixed surfaces.  It
makes use of the function fSombra for the shadows factor
calculation. It is used by the function calcGef.  
Usage
calcShd(radEf, modeTrk = 'fixed', modeShd = '',
        struct = list(),
        distances = data.frame())
Arguments
| radEf | |
| modeTrk | character, to be chosen from  | 
| modeShd | character, defines the type of shadow calculation. In
this version of the package the effect of the shadow is calculated
as a proportional reduction of the circumsolar diffuse and direct
irradiances. This type of approach is selected with
 | 
| struct | 
 When  For two-axis trackers ( | 
| distances | 
 When  When  When  The distances, in meters, are defined between axis of the trackers. | 
Value
A Gef object including three additional variables
(Gef0, Def0 and Bef0) in the slots GefI,
GefD, Gefdm and Gefy with the
irradiance/irradiation without shadows as a reference.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
calcG0, fTheta,
fInclin, calcShd.  
Shadows calculation for a set of distances between elements of a PV grid connected plant.
Description
The optimum distance between trackers or static structures of a PV grid connected plant depends on two main factors: the ground requirement ratio (defined as the ratio of the total ground area to the generator PV array area), and the productivity of the system including shadow losses. Therefore, the optimum separation may be the one which achieves the highest productivity with the lowest ground requirement ratio.
However, this definition is not complete since the terrain characteristics and the costs of wiring or civil works could alter the decision. This function is a help for choosing this distance: it computes the productivity for a set of combinations of distances between the elements of the plant.
Usage
optimShd(lat,
         modeTrk = 'fixed',
         modeRad = 'prom',
         dataRad,
         sample = 'hour',
         keep.night = TRUE,
         sunGeometry = 'michalsky',
         betaLim = 90, beta = abs(lat)-10, alfa = 0,
         iS = 2, alb = 0.2, HCPV = FALSE,
         module = list(),
         generator = list(),
         inverter = list(),
         effSys = list(),
         modeShd = '',
         struct = list(),
         distances = data.frame(),
         res = 2,
         prog = TRUE)
Arguments
| lat | numeric, latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| modeTrk | character, to be chosen from  | 
| modeRad,dataRad | Information about the source data of the
global irradiation. See  | 
| sample | 
 | 
| keep.night | 
 | 
| sunGeometry | 
 | 
| betaLim,beta,alfa,iS,alb,HCPV | See  | 
| module | list of numeric values with information about the PV module, 
 | 
| generator | list of numeric values with information about the generator, 
 | 
| inverter | list of numeric values with information about the DC/AC inverter, 
 | 
| effSys | list of numeric values with information about the system losses, 
 | 
| modeShd | character, defines the type of shadow calculation. In
this version of the package the effect of the shadow is calculated
as a proportional reduction of the circumsolar diffuse and direct
irradiances. This type of approach is selected with
 | 
| struct | 
 | 
| distances | 
 
 These distances, in meters, are defined between the axis of the trackers. | 
| res | numeric;  | 
| prog | logical, show a progress bar; default value is TRUE | 
Details
optimShd calculates the energy produced for every
combination of distances as defined by distances and
res. The result of this function is a Shade-class
object.  A method of shadeplot for this class is defined
(shadeplot-methods), and it shows the graphical relation
between the productivity and the distance between trackers or fixed
surfaces.  
Value
A Shade object.
Author(s)
Oscar Perpiñán Lamigueiro
References
- Perpiñan Lamigueiro, Oscar (2012). Cost of energy and mutual shadows in a two-axis tracking PV system. "Renewable Energy", v. 43 ; pp. 331-342. ISSN 0960-1481. https://oa.upm.es/10219/. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
library(lattice)
library(latticeExtra)
lat = 37.2;
G0dm = c(2766, 3491, 4494, 5912, 6989, 7742, 7919, 7027, 5369, 3562, 2814,
2179)
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 15.2)
prom = list(G0dm = G0dm, Ta = Ta)
###Two-axis trackers
struct2x = list(W = 23.11, L = 9.8, Nrow = 2, Ncol = 3)
dist2x = list(Lew = c(30, 45),Lns = c(20, 40))
ShdM2x <- optimShd(lat = lat, dataRad = prom, modeTrk = 'two',
                   modeShd = c('area','prom'),
                   distances = dist2x, struct = struct2x,
                   res = 5)
shadeplot(ShdM2x)
pLew = xyplot(Yf~GRR,data = ShdM2x,groups = factor(Lew),type = c('l','g'),
    main = 'Productivity for each Lew value')
pLew+glayer(panel.text(x[1], y[1], group.value))
pLns = xyplot(Yf~GRR,data = ShdM2x,groups = factor(Lns),type = c('l','g'),
    main = 'Productivity for each Lns value')
pLns+glayer(panel.text(x[1], y[1], group.value))
## 1-axis tracker with Backtracking
structHoriz = list(L = 4.83);
distHoriz = list(Lew = structHoriz$L * c(2,5));
Shd12HorizBT <- optimShd(lat = lat, dataRad = prom,
        modeTrk = 'horiz',
        betaLim = 60,
        distances = distHoriz, res = 2,
        struct = structHoriz,
        modeShd = 'bt')
shadeplot(Shd12HorizBT)
xyplot(diff(Yf)~GRR[-1],data = Shd12HorizBT,type = c('l','g'))
###Fixed system
structFixed = list(L = 5);
distFixed = list(D = structFixed$L*c(1,3));
Shd12Fixed <- optimShd(lat = lat, dataRad = prom,
        modeTrk = 'fixed',
        distances = distFixed, res = 2,
        struct = structFixed,
        modeShd = 'area')
shadeplot(Shd12Fixed)
Daily or intradaily values of global horizontal irradiation and ambient temperature from a local file or a data.frame.
Description
Constructor for the class Meteo with values of
daily or intradaily values of global horizontal irradiation and ambient temperature
from a local file or a data.frame.
Usage
readBD(file,  lat,
       format = '%d/%m/%Y',
       header = TRUE, fill = TRUE, dec = '.', sep = ';',
       dates.col = 'date',source = file)
readBDi(file,  lat,
       format = '%d/%m/%Y %H:%M:%S',
       header = TRUE, fill = TRUE, dec = '.', sep = ';',
       time.col = 'time',
       source = file)
df2Meteo(file,  lat,
         format = '%d/%m/%Y',
         dates.col = 'date',
         source = '')
dfI2Meteo(file,  lat,
         format = '%d/%m/%Y %H:%M:%S',
         time.col = 'time',
         source = '')
zoo2Meteo(file, lat, source = '')
Arguments
| file | The name of the file ( If the  Only for daily data: if the ambient temperature is not available,
the file should include two columns named  | 
| header,fill,dec,sep | See  | 
| format | character string with the format of the dates or time
index.
(Default for daily time bases: | 
| lat | numeric, latitude (degrees) of the location. | 
| dates.col | character string with the name of the column wich contains the dates of the time series. | 
| time.col | character string with the name of the column wich contains the time index of the series. | 
| source | character string with information about the source of the values. (Default: the name of the file). | 
Value
A Meteo object.
Author(s)
Oscar Perpiñán Lamigueiro.
See Also
Examples
data(helios)
names(helios) = c('date', 'G0', 'TempMax', 'TempMin')
bd = df2Meteo(helios, dates.col = 'date', lat = 41, source = 'helios-IES', format = '%Y/%m/%d')
summary(getData(bd))
xyplot(bd)
Monthly mean values of global horizontal irradiation.
Description
Constructor for the class Meteo with 12 values of
monthly means of irradiation.
Usage
readG0dm(G0dm, Ta = 25, lat = 0,
    year= as.POSIXlt(Sys.Date())$year+1900,
    promDays = c(17,14,15,15,15,10,18,18,18,19,18,13),
    source = '')
Arguments
| G0dm | numeric, 12 values of monthly means of daily global horizontal irradiation (Wh/m²). | 
| Ta | numeric, 12 values of monthly means of ambient temperature (degrees Celsius). | 
| lat | numeric, latitude (degrees) of the location. | 
| year | numeric (Default: current year). | 
| promDays | numeric, set of the average days for each month. | 
| source | character string with information about the source of the values. | 
Value
Meteo object
Author(s)
Oscar Perpiñán Lamigueiro.
See Also
Examples
G0dm =
  c(2.766,3.491,4.494,5.912,6.989,7.742,7.919,7.027,5.369,3.562,2.814,2.179) * 1000;
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 15.2)
BD <- readG0dm(G0dm = G0dm, Ta = Ta, lat = 37.2)
print(BD)
getData(BD)
xyplot(BD)
Class "Meteo"
Description
A class for meteorological data.
Objects from the Class
Objects can be created by the family of readBD functions.
Slots
- latData:
- Latitude (degrees) of the meteorological station or source of the data. 
- data:
- A - zooobject with the time series of daily irradiation (- G0, Wh/m²), the ambient temperature (- Ta) or the maximum and minimum ambient temperature (- TempMaxand- TempMin).
- source:
- A character with a short description of the source of the data. 
- type:
- A character, - prom,- bd,- bdIor- mapa, depending on the constructor.
Methods
- getData
- signature(object = "Meteo"): extracts the- dataslot as a- zooobject.
- getG0
- signature(object = "Meteo"): extracts the irradiation time series as a- zooobject.
- getLat
- signature(object = "Meteo"): extracts the latitude value.
- indexD
- signature(object = "Meteo"): extracts the index of the- dataslot.
- xyplot
- signature(x = "formula", data = "Meteo"): plot the content of the object according to the- formulaargument.
- xyplot
- signature(x = "Meteo", data = "missing"): plot the- dataslot using the- xyplotmethod for- zooobjects.
Author(s)
Oscar Perpiñán Lamigueiro.
See Also
readBD,
readBDi,
zoo2Meteo,
df2Meteo,
dfI2Meteo,
readG0dm,
Class "Sol": Apparent movement of the Sun from the Earth
Description
A class which describe the apparent movement of the Sun from the Earth.
Objects from the Class
Objects can be created by calcSol.
Slots
- lat:
- numeric, latitude (degrees) as defined in the call to - calcSol.
- solD:
- Object of class - "zoo"created by- fSolD.
- solI:
- Object of class - "zoo"created by- fSolI.
- match:
- numeric, index of - solDrelated with the index of- solI.
- method:
- character, method for the sun geometry calculations. 
- sample:
- difftime, increment of the intradaily sequence.
Methods
- as.data.frameD
- signature(object = "Sol"): conversion to a data.frame with daily values.
- as.data.frameI
- signature(object = "Sol"): conversion to a data.frame with intradaily values.
- as.zooD
- signature(object = "Sol"): conversion to a- zooobject with daily values.
- as.zooI
- signature(object = "Sol"): conversion to a- zooobject with intradaily values.
- getLat
- signature(object = "Sol"): latitude (degrees) as defined in the call to- calcSol.
- indexD
- signature(object = "Sol"): index of the- solDslot.
- indexI
- signature(object = "Sol"): index of the- solIobject.
- indexRep
- signature(object = "Sol"): accesor for the- matchslot.
- xyplot
- signature(x = "formula", data = "Sol"): displays the contents of a- Solobject with the- xyplotmethod for formulas.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Class "G0": irradiation and irradiance on the horizontal plane.
Description
This class contains the global, diffuse and direct irradiation and irradiance on the horizontal plane, and ambient temperature.
Objects from the Class
Objects can be created by the function calcG0.
Slots
- G0D:
- Object of class - "zoo"created by- fCompD. It includes daily values of:- Fd:
- numeric, the diffuse fraction 
- Ktd:
- numeric, the clearness index 
- G0d:
- numeric, the global irradiation on a horizontal surface (Wh/m²) 
- D0d:
- numeric, the diffuse irradiation on a horizontal surface (Wh/m²) 
- B0d:
- numeric, the direct irradiation on a horizontal surface (Wh/m²) 
 
- G0I:
- Object of class - "zoo"created by- fCompI. It includes values of:- kt:
- numeric, clearness index 
- G0:
- numeric, global irradiance on a horizontal surface, (W/m²) 
- D0:
- numeric, diffuse irradiance on a horizontal surface, (W/m²) 
- B0:
- numeric, direct irradiance on a horizontal surface, (W/m²) 
 
- G0dm:
- Object of class - "zoo"with monthly mean values of daily irradiation.
- G0y:
- Object of class - "zoo"with yearly sums of irradiation.
- Ta:
- Object of class - "zoo"with intradaily ambient temperature values.
Besides, this class contains the slots from the Sol and
Meteo classes.
Extends
Class "Meteo", directly.
Class "Sol", directly.
Methods
- as.zooD
- signature(object = "G0"): conversion to a- zooobject with daily values.
- as.zooI
- signature(object = "G0"): conversion to a- zooobject with intradaily values.
- as.zooM
- signature(object = "G0"): conversion to a- zooobject with monthly values.
- as.zooY
- signature(object = "G0"): conversion to a- zooobject with yearly values.
- as.data.frameD
- signature(object = "G0"): conversion to a data.frame with daily values.
- as.data.frameI
- signature(object = "G0"): conversion to a data.frame with intradaily values.
- as.data.frameM
- signature(object = "G0"): conversion to a data.frame with monthly values.
- as.data.frameY
- signature(object = "G0"): conversion to a data.frame with yearly values.
- indexD
- signature(object = "G0"): index of the- solDslot.
- indexI
- signature(object = "G0"): index of the- solIobject.
- indexRep
- signature(object = "G0"): accesor for the- matchslot.
- getLat
- signature(object = "G0"): latitude of the inherited- Solobject.
- xyplot
- signature(x = "G0", data = "missing"): display the time series of daily values of irradiation.
- xyplot
- signature(x = "formula", data = "G0"): displays the contents of a- G0object with the- xyplotmethod for formulas.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Class "Gef": irradiation and irradiance on the generator plane.
Description
This class contains the global, diffuse and direct irradiation and irradiance on the horizontal plane, and ambient temperature.
Objects from the Class
Objects can be created by the function calcGef.
Slots
- GefI:
- Object of class - "zoo"created by- fInclin. It contains these components:- Bo:
- Extra-atmospheric irradiance on the inclined surface (W/m²) 
- Bn:
- Direct normal irradiance (W/m²) 
- G, B, D, Di, Dc, R:
- Global, direct, diffuse (total, isotropic and anisotropic) and albedo irradiance incident on an inclined surface (W/m²) 
- Gef, Bef, Def, Dief, Dcef, Ref:
- Effective global, direct, diffuse (total, isotropic and anisotropic) and albedo irradiance incident on an inclined surface (W/m²) 
- FTb, FTd, FTr:
- Factor of angular losses for the direct, diffuse and albedo components 
 
- GefD:
- Object of class - "zoo"with daily values of global, diffuse and direct irradiation.
- Gefdm:
- Object of class - "zoo"with monthly means of daily global, diffuse and direct irradiation.
- Gefy:
- Object of class - "zoo"with yearly sums of global, diffuse and direct irradiation.
- Theta:
- Object of class - "zoo"created by- fTheta. It contains these components:- Beta:
- numeric, inclination angle of the surface (radians). When - modeTrk='fixed'it is the value of the argument- betaconverted from degreesto radians.
- Alfa:
- numeric, azimuth angle of the surface (radians). When - modeTrk='fixed'it is the value of the argument- alfaconverted from degrees to radians.
- cosTheta:
- numeric, cosine of the incidence angle of the solar irradiance on the surface 
 
- iS:
- numeric, degree of dirtiness. 
- alb:
- numeric, albedo reflection coefficient. 
- modeTrk:
- character, mode of tracking. 
- modeShd:
- character, mode of shadows. 
- angGen:
- A list with the values of - alfa,- betaand- betaLim.
- struct:
- A list with the dimensions of the structure. 
- distances:
- A data.frame with the distances between structures. 
Extends
Class "G0", directly.
Class "Meteo", by class "G0", distance 2.
Class "Sol", by class "G0", distance 2.
Methods
- as.zooD
- signature(object = "Gef"): conversion to a- zooobject with daily values.
- as.zooI
- signature(object = "Gef"): conversion to a- zooobject with intradaily values.
- as.zooM
- signature(object = "Gef"): conversion to a- zooobject with monthly values.
- as.zooY
- signature(object = "Gef"): conversion to a- zooobject with yearly values.
- as.data.frameD
- signature(object = "Gef"): conversion to a data.frame with daily values.
- as.data.frameI
- signature(object = "Gef"): conversion to a data.frame with intradaily values.
- as.data.frameM
- signature(object = "Gef"): conversion to a data.frame with monthly values.
- as.data.frameY
- signature(object = "Gef"): conversion to a data.frame with yearly values.
- indexD
- signature(object = "Gef"): index of the- solDslot.
- indexI
- signature(object = "Gef"): index of the- solIobject.
- indexRep
- signature(object = "Gef"): accesor for the- matchslot.
- getLat
- signature(object = "Gef"): latitude of the inherited- Solobject.
- xyplot
- signature(x = "Gef", data = "missing"): display the time series of daily values of irradiation.
- xyplot
- signature(x = "formula", data = "Gef"): displays the contents of a- Gefobject with the- xyplotmethod for formulas.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Class "ProdGCPV": performance of a grid connected PV system.
Description
A class containing values of the performance of a grid connected PV system.
Objects from the Class
Objects can be created by prodGCPV.
Slots
- prodI:
- Object of class - "zoo"created by- fProd. It includes these components:- Tc:
- cell temperature, - ^{\circ}{\rm C}.
- Voc, Isc, Vmpp, Impp:
- open circuit voltage, short circuit current, MPP voltage and current, respectively. 
- Vdc, Idc:
- voltage and current at the input of the inverter. 
- Pdc:
- power at the input of the inverter, W 
- Pac:
- power at the output of the inverter, W 
- EffI:
- efficiency of the inverter 
 
- prodD:
- A - zooobject with daily values of AC (- Eac) and DC (- Edc) energy (Wh), and productivity (- Yf, Wh/Wp) of the system.
- prodDm:
- A - zooobject with monthly means of daily values of AC and DC energy (kWh), and productivity of the system.
- prody:
- A - zooobject with yearly sums of AC and DC energy (kWh), and productivity of the system.
- module:
- A list with the characteristics of the module. 
- generator:
- A list with the characteristics of the PV generator. 
- inverter:
- A list with the characteristics of the inverter. 
- effSys:
- A list with the efficiency values of the system. 
Besides, this class contains the slots from the
"Meteo", "Sol",
"G0" and "Gef" classes.
Extends
Class "Gef", directly.
Class "G0", by class "Gef", distance 2.
Class "Meteo", by class "Gef", distance 3.
Class "Sol", by class "Gef", distance 3.
Methods
- as.zooD
- signature(object = "ProdGCPV"): conversion to a- zooobject with daily values.
- as.zooI
- signature(object = "ProdGCPV"): conversion to a- zooobject with intradaily values.
- as.zooM
- signature(object = "ProdGCPV"): conversion to a- zooobject with monthly values.
- as.zooY
- signature(object = "ProdGCPV"): conversion to a- zooobject with yearly values.
- as.data.frameD
- signature(object = "ProdGCPV"): conversion to a data.frame with daily values.
- as.data.frameI
- signature(object = "ProdGCPV"): conversion to a data.frame with intradaily values.
- as.data.frameM
- signature(object = "ProdGCPV"): conversion to a data.frame with monthly values.
- as.data.frameY
- signature(object = "ProdGCPV"): conversion to a data.frame with yearly values.
- indexD
- signature(object = "ProdGCPV"): index of the- solDslot.
- indexI
- signature(object = "ProdGCPV"): index of the- solIobject.
- indexRep
- signature(object = "ProdGCPV"): accesor for the- matchslot.
- getLat
- signature(object = "ProdGCPV"): latitude of the inherited- Solobject.
- xyplot
- signature(x = "ProdGCPV", data = "missing"): display the time series of daily values.
- xyplot
- signature(x = "formula", data = "ProdGCPV"): displays the contents of a- ProdGCPVobject with the- xyplotmethod for formulas.
- as.zooD
- signature(object = "ProdGCPV"): conversion to a- zooobject with daily values.
- as.zooI
- signature(object = "ProdGCPV"): conversion to a- zooobject with intradaily values.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Class "ProdPVPS": performance of a PV pumping system.
Description
Performance of a PV pumping system with a centrifugal pump and a variable frequency converter.
Objects from the Class
Objects can be created by prodPVPS.
Slots
- prodI:
- Object of class - "zoo"with these components:- Q:
- Flow rate, (m³/h) 
- Pb, Ph:
- Pump shaft power and hydraulical power (W), respectively. 
- etam, etab:
- Motor and pump efficiency, respectively. 
- f:
- Frequency (Hz) 
 
- prodD:
- A - zooobject with daily values of AC energy (Wh), flow (m³) and productivity of the system.
- prodDm:
- A - zooobject with monthly means of daily values of AC energy (kWh), flow (m³) and productivity of the system.
- prody:
- A - zooobject with yearly sums of AC energy (kWh), flow (m³) and productivity of the system.
- pump
- A - listextracted from- pumpCoef
- H
- Total manometric head (m) 
- Pg
- Nominal power of the PV generator (Wp) 
- converter
- listcontaining the nominal power of the frequency converter,- Pnom, and- Ki, vector of three values, coefficients of the efficiency curve.
- effSys
- list of numeric values with information about the system losses 
Besides, this class contains the slots from the Gef class.
Extends
Class "Gef", directly.
Class "G0", by class "Gef", distance 2.
Class "Meteo", by class "Gef", distance 3.
Class "Sol", by class "Gef", distance 3.
Methods
- as.zooD
- signature(object = "ProdPVPS"): conversion to a- zooobject with daily values.
- as.zooI
- signature(object = "ProdPVPS"): conversion to a- zooobject with intradaily values.
- as.zooM
- signature(object = "ProdPVPS"): conversion to a- zooobject with monthly values.
- as.zooY
- signature(object = "ProdPVPS"): conversion to a- zooobject with yearly values.
- as.data.frameD
- signature(object = "ProdPVPS"): conversion to a data.frame with daily values.
- as.data.frameI
- signature(object = "ProdPVPS"): conversion to a data.frame with intradaily values.
- as.data.frameM
- signature(object = "ProdPVPS"): conversion to a data.frame with monthly values.
- as.data.frameY
- signature(object = "ProdPVPS"): conversion to a data.frame with yearly values.
- indexD
- signature(object = "ProdPVPS"): index of the- solDslot.
- indexI
- signature(object = "ProdPVPS"): index of the- solIobject.
- indexRep
- signature(object = "ProdPVPS"): accesor for the- matchslot.
- getLat
- signature(object = "ProdPVPS"): latitude of the inherited- Solobject.
- xyplot
- signature(x = "ProdPVPS", data = "missing"): display the time series of daily values.
- xyplot
- signature(x = "formula", data = "ProdPVPS"): displays the contents of a- ProdPVPSobject with the- xyplotmethod for formulas.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Abella, M. A., Lorenzo, E. y Chenlo, F.: PV water pumping systems based on standard frequency converters. Progress in Photovoltaics: Research and Applications, 11(3):179–191, 2003, ISSN 1099-159X. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Class "Shade": shadows in a PV system.
Description
A class for the optimization of shadows in a PV system.
Objects from the Class
Objects can be created by optimShd.
Slots
- FS:
- numeric, shadows factor values for each combination of distances. 
- GRR:
- numeric, Ground Requirement Ratio for each combination. 
- Yf:
- numeric, final productivity for each combination. 
- FS.loess:
- A local fitting of - FSwith- loess.
- Yf.loess:
- A local fitting of - Yfwith- loess.
- modeShd:
- character, mode of shadows. 
- struct:
- A list with the dimensions of the structure. 
- distances:
- A data.frame with the distances between structures. 
- res
- numeric, difference (meters) between the different steps of the calculation. 
Besides, as a reference, this class includes a ProdGCPV object
with the performance of a PV systems without shadows.
Extends
Class "ProdGCPV", directly.
Class "Gef", by class "ProdGCPV", distance 2.
Class "G0", by class "ProdGCPV", distance 3.
Class "Meteo", by class "ProdGCPV", distance 4.
Class "Sol", by class "ProdGCPV", distance 4.
Methods
- as.data.frame
- signature(x = "Shade"): conversion to a data.frame including columns for distances (- Lew,- Lns, and- D) and results (- FS,- GRRand- Yf).
- shadeplot
- signature(x = "Shade"): display the results of the iteration with a level plot for the two-axis tracking, or with conventional plot for horizontal tracking and fixed systems.
- xyplot
- signature(x = "formula", data = "Shade"): display the content of the- Shadeobject with the- xyplotmethod for formulas.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñan Lamigueiro, Oscar (2012). Cost of energy and mutual shadows in a two-axis tracking PV system. "Renewable Energy", v. 43 ; pp. 331-342. ISSN 0960-1481. https://oa.upm.es/10219/. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
H-Q curves of a centrifugal pump
Description
Compute and display the H-Q curves of a centrifugal pump fed working at several frequencies, and the iso-efficiency curve as a reference.
Usage
HQCurve(pump)
Arguments
| pump | 
 | 
Value
| result | A  | 
| plot | The plot with several curves labelled with the correspondent frequencies, and the isoefficiency curve (named "ISO"). | 
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Abella, M. A., Lorenzo, E. y Chenlo, F.: PV water pumping systems based on standard frequency converters. Progress in Photovoltaics: Research and Applications, 11(3):179–191, 2003, ISSN 1099-159X. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
library(lattice)
library(latticeExtra)
data(pumpCoef)
CoefSP8A44 <- subset(pumpCoef, Qn == 8&stages == 44)
CurvaSP8A44 <- HQCurve(pump = CoefSP8A44)
Nomogram of a photovoltaic pumping system
Description
This function simulate the performance of a water pump fed by a frequency converter with several PV generators of different size during a day. The result is plotted as a nomogram which relates the nominal power of the PV generator, the total water flow and the total manometric head.
Usage
NmgPVPS(pump, Pg, H, Gd, Ta = 30,
    lambda = 0.0045, TONC = 47, eta = 0.95,
    Gmax = 1200, t0 = 6, Nm = 6,
    title = '', theme = custom.theme.2())
Arguments
| pump | A  | 
| Pg | Sequence of values of the nominal power of the PV generator (Wp)) | 
| H | Sequence of values of the total manometric head (m) | 
| Gd | Global irradiation incident on the generator (Wh/m²) | 
| Ta | Ambient temperature ( | 
| lambda | Power losses factor due to temperature | 
| TONC | Nominal operational cell temperature ( | 
| eta | Average efficiency of the frequency converter | 
| Gmax | Maximum value of irradiance (parameter of the IEC 61725) | 
| t0 | Hours from midday to sunset (parameter of the IEC 61725) | 
| Nm | Number of samples per hour | 
| title | Main title of the plot. | 
| theme | Theme of the lattice plot. | 
Details
This function computes the irradiance profile according to the IEC 61725 "Analytical Expression for Daily Solar Profiles", which is a common reference in the official documents regarding PV pumping systems.
At this version only pumps from the manufacturer Grundfos are included in pumpCoef.
Value
| I | 
 | 
| D | 
 | 
| param | 
 | 
| plot | 
 | 
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Abella, M. A., Lorenzo, E. y Chenlo, F.: PV water pumping systems based on standard frequency converters. Progress in Photovoltaics: Research and Applications, 11(3):179–191, 2003, ISSN 1099-159X. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
Pg = seq(4000, 8000,by = 100);
H = seq(120, 150,by = 5);
data(pumpCoef)
CoefSP8A44 <- subset(pumpCoef, Qn == 8 & stages == 44)
NmgSP8A44 <- NmgPVPS(pump = CoefSP8A44,Pg = Pg,H = H,Gd = 5000,
     title = 'Choice of Pump', theme = custom.theme())
Correlations between the fraction of diffuse irradiation and the clearness index.
Description
A set of correlations between the fraction of diffuse irradiation and the
clearness index used by fCompD and fCompI.
Usage
## Monthly means of daily values
FdKtPage(Ktd)
FdKtLJ(Ktd)
## Daily values
FdKtCPR(Ktd)
FdKtEKDd(Ktd, sol)
FdKtCLIMEDd(Ktd)
## Intradaily values
FdKtEKDh(kt)
FdKtCLIMEDh(kt)
FdKtBRL(kt, sol)
Arguments
| Ktd | A numeric, the daily clearness index. | 
| kt | A numeric, the intradaily clearness index. | 
| sol | A  | 
Value
A numeric, the diffuse fraction.
Author(s)
Oscar Perpiñán Lamigueiro; The BRL model was suggested by Kevin Ummel.
References
- Page, J. K., The calculation of monthly mean solar radiation for horizontal and inclined surfaces from sunshine records for latitudes 40N-40S. En U.N. Conference on New Sources of Energy, vol. 4, págs. 378–390, 1961. 
- Collares-Pereira, M. y Rabl, A., The average distribution of solar radiation: correlations between diffuse and hemispherical and between daily and hourly insolation values. Solar Energy, 22:155–164, 1979. 
- Erbs, D.G, Klein, S.A. and Duffie, J.A., Estimation of the diffuse radiation fraction for hourly, daily and monthly-average global radiation. Solar Energy, 28:293:302, 1982. 
- De Miguel, A. et al., Diffuse solar irradiation model evaluation in the north mediterranean belt area, Solar Energy, 70:143-153, 2001. 
- Ridley, B., Boland, J. and Lauret, P., Modelling of diffuse solar fraction with multiple predictors, Renewable Energy, 35:478-482, 2010. 
See Also
Examples
Ktd = seq(0, 1, .01)
Monthly = data.frame(Ktd = Ktd)
Monthly$Page = FdKtPage(Ktd)
Monthly$LJ = FdKtLJ(Ktd)
xyplot(Page+LJ~Ktd, data = Monthly,
       type = c('l', 'g'), auto.key = list(space = 'right'))
Ktd = seq(0, 1, .01)
Daily = data.frame(Ktd = Ktd)
Daily$CPR = FdKtCPR(Ktd)
Daily$CLIMEDd = FdKtCLIMEDd(Ktd)
xyplot(CPR + CLIMEDd ~ Ktd, data = Daily,
       type = c('l', 'g'), auto.key = list(space = 'right'))
Daily time base
Description
Construction of a daily time base for solar irradiation calculation
Usage
fBTd(mode = "prom",
    year = as.POSIXlt(Sys.Date())$year+1900,
    start = paste('01-01-',year,sep = ''),
    end = paste('31-12-',year,sep = ''),
                   format = '%d-%m-%Y')
Arguments
| mode | character, controls the type of time base to be
created. With   | 
| year | which year is to be used for the time base when  | 
| start | first day of the time base for  | 
| end | last day of the time base for  | 
| format | format of  | 
Details
This function is commonly used inside fSolD.
Value
This function returns a POSIXct object.
Author(s)
Oscar Perpiñán Lamigueiro
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
fSolD,
as.POSIXct,
seq.POSIXt.
Examples
#Average days
fBTd(mode = 'prom')
#The day #100 of the year 2008
BTd = fBTd(mode = 'serie', year = 2008)
BTd[100]
Components of daily global solar irradiation on a horizontal surface
Description
Extract the diffuse and direct components from the daily global irradiation on a horizontal surface by means of regressions between the clearness index and the diffuse fraction parameters.
Usage
fCompD(sol, G0d, corr = "CPR",f)
Arguments
| sol | A  | 
| G0d | A  | 
| corr | A character, the correlation between the the fraction of diffuse irradiation and the clearness index to be used. With this version several options are available, as described in
 If  If  | 
| f | A function defininig a correlation between the fraction of
diffuse irradiation and the clearness index. It is only neccessary when  | 
Value
A zoo object  which includes:
| Fd | numeric, the diffuse fraction | 
| Ktd | numeric, the clearness index | 
| G0d | numeric, the global irradiation on a horizontal surface (Wh/m²) | 
| D0d | numeric, the diffuse irradiation on a horizontal surface (Wh/m²) | 
| B0d | numeric, the direct irradiation on a horizontal surface (Wh/m²) | 
Author(s)
Oscar Perpiñán Lamigueiro
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
lat = 37.2;
BTd = fBTd(mode = 'serie')
SolD <- fSolD(lat, BTd[100])
G0d = zoo(5000, index(SolD))
fCompD(SolD, G0d, corr = "Page")
fCompD(SolD, G0d, corr = "CPR")
#define a function fKtd with the correlation of CPR
fKTd = function(x){(0.99*(x <= 0.17))+
                 (x>0.17)*(1.188 -2.272 * x + 9.473 * x^2 - 21.856 * x^3
+ 14.648 * x^4)}
#The same as with corr = "CPR"
fCompD(SolD, G0d, corr = "user", f = fKTd)
lat = -37.2;
SolDs <- fSolD(lat, BTd[283])
G0d = zoo(5000, index(SolDs))
fCompD(SolDs, G0d, corr = "CPR")
lat = 37.2;
G0dm = c(2.766,3.491,4.494,5.912,6.989,7.742,7.919,7.027,5.369,3.562,2.814,2.179)*1000;
Rad = readG0dm(G0dm, lat = lat)
solD <- fSolD(lat,fBTd(mode = 'prom'))
fCompD(solD, Rad, corr = 'Page')
Calculation of solar irradiance on a horizontal surface
Description
From the daily global, diffuse and direct irradiation values supplied by fCompD, the profile of the global, diffuse and direct irradiance is calculated with the rd and rg components of fSolI.
Usage
fCompI(sol, compD, G0I, corr = 'none', f, filterG0 = TRUE)Arguments
| sol | A  | 
| compD | A  | 
| G0I | A  See below for  | 
| corr | A character, the correlation between the the fraction of
intradaily diffuse irradiation and the clearness index to be
used. It is ignored if  With this version several correlations are available, as described in
 If  If  | 
| f | A function defininig a correlation between the fraction of
diffuse irradiation and the clearness index. It is only neccessary
when  | 
| filterG0 | A logical. If  | 
Value
A zoo with these components:
| kt | numeric, clearness index. | 
| fd | numeric, diffuse fraction. | 
| G0 | numeric, global irradiance on a horizontal surface, (W/m²) | 
| D0 | numeric, diffuse irradiance on a horizontal surface, (W/m²) | 
| B0 | numeric, direct irradiance on a horizontal surface, (W/m²) | 
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Collares-Pereira, M. y Rabl, A., The average distribution of solar radiation: correlations between diffuse and hemispherical and between daily and hourly insolation values. Solar Energy, 22:155–164, 1979. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
fCompD,
fSolI,
calcSol,
corrFdKt.
Examples
lat <- 37.2
BTd <- fBTd(mode = 'serie')
solD <- fSolD(lat, BTd[100])
solI <- fSolI(solD, sample = 'hour')
G0d <- zoo(5000, index(solD))
compD <- fCompD(solD, G0d, corr = "Page")
fCompI(solI, compD)
sol <- calcSol(lat, fBTd(mode = 'prom'), sample = 'hour', keep.night = FALSE)
G0dm <- c(2.766, 3.491, 4.494, 5.912, 6.989, 7.742,
          7.919, 7.027, 5.369, 3.562, 2.814, 2.179)*1000
Ta <- c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9,
        24.3, 18.2, 17.2, 15.2)
BD <- readG0dm(G0dm = G0dm, Ta = Ta, lat = lat)
compD <- fCompD(sol, BD, corr = 'Page')
compI <- fCompI(sol, compD)
head(compI)
## Use of 'corr'.  The help page of calcG0 includes additional examples
## with intradaily data xyplot(fd ~ kt, data = compI)
climed <- fCompI(sol, G0I = compI, corr = 'CLIMEDh')
xyplot(fd ~ kt, data = climed)
ekdh <- fCompI(sol, G0I = compI, corr = 'EKDh')
xyplot(fd ~ kt, data = ekdh)
brl <- fCompI(sol, G0I = compI, corr = 'BRL')
xyplot(fd ~ kt, data = brl)
Solar irradiance on an inclined surface
Description
The solar irradiance incident on an inclined surface is calculated from the direct and diffuse irradiance on a horizontal surface, and from the evolution of the angles of the Sun and the surface. Moreover, the effect of the angle of incidence and dust on the PV module is included to obtain the effective irradiance.
This function is used by the calcGef function.
Usage
fInclin(compI, angGen, iS = 2, alb = 0.2, horizBright = TRUE, HCPV = FALSE)
Arguments
| compI | A  | 
| angGen | A  | 
| iS | integer, degree of dirtiness. Its value must be included in the set (1,2,3,4).  | 
| alb | numeric, albedo reflection coefficient. Its default value is 0.2 | 
| horizBright | logical, if TRUE, the horizon brightness correction proposed by Reind et al. is used. | 
| HCPV | logical, if TRUE the diffuse and albedo components of the effective irradiance are set to zero. HCPV is the acronym of High Concentration PV system. | 
Details
The solar irradiance incident on an inclined surface can be calculated from the direct and  diffuse irradiance on a horizontal surface, and from the evolution of the angles of the Sun and the surface. The transformation of the direct radiation is straightforward since only geometric considerations are needed. However, the treatment of the diffuse irradiance is more complex since it involves the modelling of the atmosphere. There are several models for the estimation of diffuse irradiance on an inclined surface. The one which combines simplicity and acceptable results is the proposal of Hay and McKay. This model divides the diffuse component in isotropic and anisotropic whose values depends on a anisotropy index.
On the other hand, the effective irradiance, the fraction of the incident irradiance that reaches the cells inside a PV module, is calculated with the losses due to the angle of incidence and dirtiness. This behaviour can be simulated with a model proposed by Martin and Ruiz requiring information about the angles of the surface and the level of dirtiness (iS) .
Value
A zoo object with these components:
| Bo | Extra-atmospheric irradiance on the inclined surface (W/m²) | 
| Bn | Direct normal irradiance (W/m²) | 
| G,B,D,Di,Dc,R | Global, direct, diffuse (total, isotropic and anisotropic) and albedo irradiance incident on an inclined surface (W/m²) | 
| Gef,Bef,Def,Dief,Dcef,Ref | Effective global, direct, diffuse (total, isotropic and anisotropic) and albedo irradiance incident on an inclined surface (W/m²) | 
| FTb,FTd,FTr | Factor of angular losses for the direct, diffuse and albedo components | 
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Hay, J. E. and McKay, D. C.: Estimating Solar Irradiance on Inclined Surfaces: A Review and Assessment of Methodologies. Int. J. Solar Energy, (3):pp. 203, 1985. 
- Martin, N. and Ruiz, J.M.: Calculation of the PV modules angular losses under field conditions by means of an analytical model. Solar Energy Materials & Solar Cells, 70:25–38, 2001. 
- D. T. Reindl and W. A. Beckman and J. A. Duffie: Evaluation of hourly tilted surface radiation models, Solar Energy, 45:9-17, 1990. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Performance of a PV system
Description
Simulate the behaviour of a grid connected PV system under different
conditions of irradiance and temperature. This function is used by the
prodGCPV function.
Usage
fProd(inclin, module, generator, inverter, effSys)Arguments
| inclin | A  | 
| module | list of numeric values with information about the PV module, 
 | 
| generator | list of numeric values with information about the generator, 
 | 
| inverter | list of numeric values with information about the DC/AC inverter, 
 | 
| effSys | list of numeric values with information about the system losses, 
 | 
Value
If inclin is zoo or Gef object, the result
is a zoo object with these components (if inclin
is a data.frame the result is also a data.frame with these same components):
| Tc | cell temperature,  | 
| Voc,Isc,Vmpp,Impp | open circuit voltage, short circuit current, MPP voltage and current, respectively, in the conditions of irradiance and temperature provided by  | 
| Vdc,Idc | voltage and current at the input of the inverter. If no voltage limitation occurs (according to the values of  | 
| Pdc | power at the input of the inverter, W | 
| Pac | power at the output of the inverter, W | 
| EffI | efficiency of the inverter | 
Author(s)
Oscar Perpiñán Lamigueiro
References
- Jantsch, M., Schmidt, H. y Schmid, J.: Results on the concerted action on power conditioning and control. 11th European photovoltaic Solar Energy Conference, 1992. 
- Baumgartner, F. P., Schmidt, H., Burger, B., Bründlinger, R., Haeberlin, H. and Zehner, M.: Status and Relevance of the DC Voltage Dependency of the Inverter Efficiency. 22nd European Photovoltaic Solar Energy Conference, 2007. 
- Alonso Garcia, M. C.: Caracterización y modelado de asociaciones de dispositivos fotovoltaicos. PhD Thesis, CIEMAT, 2005. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
inclin = data.frame(Gef = c(200,400,600,800,1000),Ta = 25)
#using default values
fProd(inclin)
#Using a matrix for Ki (voltage dependence)
inv1 <- list(Ki = rbind(c(-0.00019917, 7.513e-06, -5.4183e-09),
c(0.00806, -4.161e-06, 2.859e-08),
c(0.02118, 3.4002e-05, -4.8967e-08)))
fProd(inclin, inverter = inv1)
#Voltage limits of the inverter
inclin = data.frame(Gef = 800,Ta = 30)
gen1 = list(Nms = 10, Nmp = 11)
prod = fProd(inclin,generator = gen1)
print(prod)
with(prod, Vdc * Idc / (Vmpp * Impp))
Performance of a centrifugal pump
Description
Compute the performance of the different parts of a centrifugal pump fed by a frequency converter following the affinity laws.
Usage
fPump(pump, H)
Arguments
| pump | 
 | 
| H | Total manometric head (m). | 
Value
| lim | Range of values of electrical power input | 
| fQ | Function constructed with  | 
| fPb | Function constructed with  | 
| fPh | Function constructed with  | 
| fFreq | Function constructed with  | 
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Abella, M. A., Lorenzo, E. y Chenlo, F.: PV water pumping systems based on standard frequency converters. Progress in Photovoltaics: Research and Applications, 11(3):179–191, 2003, ISSN 1099-159X. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
NmgPVPS, prodPVPS, pumpCoef, splinefun.
Examples
library(latticeExtra)
data(pumpCoef)
CoefSP8A44 <- subset(pumpCoef, Qn == 8 & stages == 44)
fSP8A44 <- fPump(pump = CoefSP8A44,H = 40)
SP8A44 = with(fSP8A44,{
                Pac = seq(lim[1],lim[2],by = 100)
                Pb = fPb(Pac)
                etam = Pb/Pac
                Ph = fPh(Pac)
                etab = Ph/Pb
                f = fFreq(Pac)
                Q = fQ(Pac)
                result = data.frame(Q,Pac,Pb,Ph,etam,etab,f)})
#Efficiency of the motor, pump and the motor-pump
SP8A44$etamb = with(SP8A44,etab*etam)
lab = c(expression(eta[motor]), expression(eta[pump]), expression(eta[mp]))
p <- xyplot(etam + etab + etamb ~ Pac,data = SP8A44,type = 'l', ylab = 'Efficiency')
p+glayer(panel.text(x[1], y[1], lab[group.number], pos = 3))
#Mechanical, hydraulic and electrical power
lab = c(expression(P[pump]), expression(P[hyd]))
p <- xyplot(Pb + Ph ~ Pac,data = SP8A44,type = 'l', ylab = 'Power (W)', xlab = 'AC Power (W)')
p+glayer(panel.text(x[length(x)], y[length(x)], lab[group.number], pos = 3))
#Flow and electrical power
xyplot(Q ~ Pac,data = SP8A44,type = 'l')
Daily apparent movement of the Sun from the Earth
Description
Compute the daily apparent movement of the Sun from the Earth. This movement is mainly described (for the simulation of photovoltaic systems) by the declination angle, the sunrise angle and the daily extra-atmospheric irradiation.
Usage
fSolD(lat, BTd, method = 'michalsky')
Arguments
| lat | Latitude (degrees) of the point of the Earth where calculations are needed. It is positive for locations above the Equator. | 
| BTd | Daily temporal base, a  | 
| method | 
 | 
Value
A zoo object with these components:
| decl | Declination angle (radians) for each day of year in  | 
| eo | Factor of correction due the eccentricity of orbit of the Earth around the Sun. | 
| ws | Sunrise angle (in radians) for each day of year. Due to the convention which considers that the solar hour angle is negative before midday, this angle is negative. | 
| Bo0d | Extra-atmospheric daily irradiation (watt-hour per squared meter) incident on a horizontal surface | 
| EoT | Equation of Time. | 
Note
The latitude is stored as the attribute lat of the result,
and thus it is accessible with attr(object, 'lat').
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Cooper, P.I., Solar Energy, 12, 3 (1969). "The Absorption of Solar Radiation in Solar Stills" 
- Spencer, Search 2 (5), 172, https://www.mail-archive.com/sundial@uni-koeln.de/msg01050.html 
- Michalsky, J., 1988: The Astronomical Almanac's algorithm for approximate solar position (1950-2050), Solar Energy 40, 227-235 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
Examples
BTd <- fBTd(mode = 'serie')
lat <- 37.2
fSolD(lat, BTd[100])
fSolD(lat, BTd[100], method = 'strous')
fSolD(lat, BTd[100], method = 'spencer')
fSolD(lat, BTd[100], method = 'cooper')
lat <- -37.2
fSolD(lat, BTd[283])
#Solar angles along the year
SolD <- fSolD(lat, BTd = fBTd())
library(lattice)
xyplot(SolD)
#Calculation of the daylength for several latitudes
library(latticeExtra)
Lats <- c(-60, -40, -20, 0, 20, 40, 60)
NomLats <- ifelse(Lats > 0, paste(Lats,'N', sep = ''),
                  paste(abs(Lats), 'S', sep = ''))
NomLats[Lats == 0] <- '0'
mat <- matrix(nrow = 365, ncol = length(Lats))
colnames(mat) <- NomLats
WsZ <- zoo(mat, fBTd(mode = 'serie'))
for (i in seq_along(Lats)){
    SolDaux <- fSolD(lat = Lats[i], BTd = fBTd(mode = 'serie'));
    WsZ[,i] <- r2h(2*abs(SolDaux$ws))}
p = xyplot(WsZ, superpose = TRUE,
        ylab = expression(omega[s] (h)), auto.key = FALSE)
plab <- p+glayer(panel.text(x[1], y[1], NomLats[group.number], pos = 2))
print(plab)
Instantaneous apparent movement of the Sun from the Earth
Description
Compute the angles which describe the intradaily apparent movement of the Sun from the Earth.
Usage
fSolI(solD, sample = 'hour', BTi, EoT = TRUE, keep.night = TRUE, method = 'michalsky')
Arguments
| solD | A  | 
| sample | Increment of the intradaily sequence. It is a character
string, containing one of ‘"sec"’, ‘"min"’, ‘"hour"’.  This can
optionally be preceded by a (positive or negative) integer and a
space, or followed by ‘"s"’. It is used by  It is not considered when  | 
| BTi | Intradaily time base, a  | 
| EoT | logical, if  | 
| keep.night | logical, if  | 
| method | 
 | 
Value
A zoo object is returned with these components:
| w | numeric, solar hour angle (radians) | 
| aman | logical,  | 
| cosThzS | numeric, cosine of the solar zenith angle | 
| AzS | numeric, solar acimuth angle (radians) | 
| AlS | numeric, solar elevation angle (radians) | 
| Bo0 | numeric, extra-atmospheric irradiance (W/m2) | 
| rd,rg | numeric, relation between irradiance and irradiation of diffuse and global values, respectively, following the correlations proposed by Collares-Pereira and Rabl | 
The latitude is stored as the attribute lat of this object.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Cooper, P.I., Solar Energy, 12, 3 (1969). "The Absorption of Solar Radiation in Solar Stills" 
- Spencer, Search 2 (5), 172, https://www.mail-archive.com/sundial@uni-koeln.de/msg01050.html 
- Michalsky, J., 1988: The Astronomical Almanac's algorithm for approximate solar position (1950-2050), Solar Energy 40, 227-235 
- Collares-Pereira, M. y Rabl, A., The average distribution of solar radiation: correlations between diffuse and hemispherical and between daily and hourly insolation values. Solar Energy, 22:155–164, 1979. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
###Angles for one day
BTd = fBTd(mode = 'serie')
#North hemisphere
lat = 37.2
solD <- fSolD(lat,BTd[100])
solI <- fSolI(solD, sample = 'hour')
print(solI)
#South hemisphere
lat = -37.2;
solDs <- fSolD(lat,BTd[283])
solIs <- fSolI(solDs, sample = 'hour')
print(solIs)
 ###Angles for the 12 average days
lat = 37.2;
solD <- fSolD(lat,BTd = fBTd(mode = 'prom'))
solI <- fSolI(solD, sample = '10 min', keep.night = FALSE)
library(lattice)
library(latticeExtra)
###Solar elevation angle vs. azimuth.
#This kind of graphics is useful for shadows calculations
mon = month.abb
p <- xyplot(r2d(AlS)~r2d(AzS),
    groups = month,
    data = solI, type = 'l', col = 'black',
    xlab = expression(psi[s]),ylab = expression(gamma[s]))
plab <- p + glayer({
  idx <- round(length(x)/2+1)
  panel.text(x[idx], y[idx], mon[group.value], pos = 3, offset = 0.2, cex = 0.8)})
print(plab)
Shadows on PV systems
Description
Compute the shadows factor for two-axis and horizontal N-S axis trackers and fixed surfaces.
Usage
fSombra(angGen, distances, struct, modeTrk = 'fixed',prom = TRUE)
fSombra6(angGen,distances,struct,prom = TRUE)
fSombra2X(angGen,distances,struct)
fSombraHoriz(angGen, distances,struct)
fSombraEst(angGen, distances,struct)
Arguments
| angGen | A  | 
| distances | 
 | 
| struct | 
 | 
| modeTrk | character, to be chosen from  | 
| prom | logical, only needed for two-axis tracker mode. If  | 
Details
fSombra is only a wrapper for fSombra6 (two-axis trackers), fSombraEst (fixed systems) and fSombraHoriz (horizontal N-S axis trackers). Depending on the value of modeTrk the corresponding function is selected.
fSombra6 calculates the shadows factor in a set of six two-axis trackers. If distances has only one row, this function constructs a symmetric grid around a tracker located at (0,0,0). These five trackers are located at (-Lew, Lns, H), (0, Lns, H), (Lew, Lns, H), (-Lew, 0, H) and (Lns, 0, H). It is possible to define a irregular grid around (0,0,0) including five rows in distances. When prom = TRUE the shadows factor for each of the six trackers is calculated. Then, according to the distribution of trackers in the plant defined by struct$Nrow and struct$Ncol, a weighted average of the shadows factors is the result.
It is important to note that the distances are defined between axis for trackers and between similar points of the structure for fixed surfaces.
Value
data.frame including angGen and a variable named FS, which is the shadows factor. This factor is the ratio between the area of the generator affected by shadows and the total area. Therefore its value is 1 when the PV generator is completely shadowed.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñan Lamigueiro, Oscar (2012). Cost of energy and mutual shadows in a two-axis tracking PV system. "Renewable Energy", v. 43 ; pp. 331-342. ISSN 0960-1481. https://oa.upm.es/10219/. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
calcShd, optimShd, fTheta, calcSol
Examples
lat = 37.2;
sol <- calcSol(lat, fBTd(mode = 'prom'), sample = '10 min', keep.night = FALSE)
angGen <- fTheta(sol, beta = 35);
Angles = CBIND(as.zooI(sol), angGen)
###Two-axis tracker
#Symmetric grid
distances = data.frame(Lew = 40,Lns = 30,H = 0)
struct = list(W = 23.11, L = 9.8, Nrow = 2, Ncol = 8)
ShdFactor <- fSombra6(Angles, distances, struct, prom = FALSE)
Angles$FS = ShdFactor
xyplot(FS ~ w, groups = month, data = Angles,
    type = 'l',
    auto.key = list(space = 'right',
                    lines = TRUE,
                    points = FALSE))
#Symmetric grid defined with a five rows data.frame
distances = data.frame(Lew = c(-40,0,40,-40,40),
                       Lns = c(30,30,30,0,0),
                       H = 0)
ShdFactor2 <- fSombra6(Angles, distances, struct,prom = FALSE)
#of course, with the same result
identical(coredata(ShdFactor), coredata(ShdFactor2))
Intradaily evolution of ambient temperature
Description
From the maximum and minimum daily values of ambient temperature, its evolution its calculated through a combination of cosine functions (ESRA method)
Usage
fTemp(sol, BD)Arguments
| sol | |
| BD | A  | 
Details
The ESRA method estimates the dependence of the temperature on the time of the day (given as the local solar time) from only two inputs: minimum and maximum daily temperatures. It assumes that the temperature daily profile can be described using three piecewise cosine functions, dividing the day into three periods: from midnight to sunrise, from sunrise to the time of peak temperature (3 hours after midday), and to midnight.
Value
A zoo object with the profile of the ambient temperature.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Huld, T. , Suri, M., Dunlop, E. D., and Micale F., Estimating average daytime and daily temperature profiles within Europe, Environmental Modelling & Software 21 (2006) 1650-1661. 
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Angle of incidence of solar irradiation on a inclined surface
Description
The orientation, azimuth and incidence angle are calculated from the
results of fSolI or calcSoland from the information supplied by the
arguments beta and alfa when the surface is fixed
(modeTrk = 'fixed') or the movement equations when a tracking
surface is chosen (modeTrk = 'horiz' or modeTrk = 'two').
Besides, the modified movement of a horizontal NS tracker due to the
backtracking strategy is calculated if BT = TRUE with information
about the tracker and the distance between the trackers included in the
system.
This function is used by the calcGef function.
Usage
fTheta(sol, beta, alfa = 0, modeTrk = "fixed", betaLim = 90,
    BT = FALSE, struct, dist)
Arguments
| sol | 
 | 
| beta | numeric, inclination angle of the surface (degrees). It is only needed when  | 
| alfa | numeric, azimuth angle of the surface (degrees). It is measured from the south ( | 
| modeTrk | character, to be chosen from  | 
| betaLim | numeric, maximum value of the inclination angle for a tracking surface. Its default value is 90 (no limitation)) | 
| BT | logical,  | 
| struct | Only needed when  | 
| dist | Only needed when  | 
Value
A zoo object with these components:
| Beta | numeric, inclination angle of the surface (radians). When  | 
| Alfa | numeric, azimuth angle of the surface (radians). When  | 
| cosTheta | numeric, cosine of the incidence angle of the solar irradiance on the surface | 
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Panico, D., Garvison, P., Wenger, H. J., Shugar, D., Backtracking: a novel strategy for tracking PV systems, Photovoltaic Specialists Conference, 668-673, 1991 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Local time, mean solar time and UTC time zone.
Description
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.
The function CBIND combines several objects (zoo,
data.frame or matrix) preserving
the index of the first of them or asigning a new one with the
index argument.
The function lonHH calculates the longitude (radians) of a time zone.
Usage
local2Solar(x, lon = NULL)
CBIND(..., index = NULL)
lonHH(tz)
Arguments
| x | a  | 
| lon | A numeric value of the longitude (degrees) of the
location. If  | 
| ... | A set of  | 
| index | A  | 
| tz | A character, a time zone as documented in https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. | 
Details
Since the result of local2Solar is the mean solar time, the
Equation of Time correction is not calculated with this function. The
fSolI function includes this correction if desired.
If the index argument of CBIND is NULL (default)
the first object of ... must be a zoo object.
Value
The function local2Solar produces a POSIXct object
with its time zone set to UTC.
The function CBIND produces a zoo object.
The function lonHH gives a numeric value.
Note
It is important to note that the solaR package sets the system
time zone to UTC with Sys.setenv(TZ = 'UTC').
Every zoo object created by the package will have an index with this
time zone and will be supposed to be mean solar time.
Author(s)
Oscar Perpiñán Lamigueiro.
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
Examples
t.local <- as.POSIXct("2006-01-08 10:07:52", tz = 'Europe/Madrid')
##The local time zone and the location have the same longitude (15 degrees)
local2Solar(t.local)
##But Madrid is at lon = -3
local2Solar(t.local, lon = -3)
##Daylight saving time
t.local.dst <- as.POSIXct("2006-07-08 10:07:52", tz = 'Europe/Madrid')
local2Solar(t.local.dst)
local2Solar(t.local.dst, lon = -3)
## Not run: 
##Extracted from an example of calcG0
##NREL-MIDC
##La Ola, Lanai
##Latitude: 20.76685o North
##Longitude: 156.92291o West
##Time Zone: -10.0
NRELurl <- 'http://goo.gl/fFEBN'
dat <- read.table(NRELurl, header = TRUE, sep = ',')
names(dat) <- c('date', 'hour', 'G0', 'B', 'D0', 'Ta')
##B is direct normal. We need direct horizontal.
dat$B0 <- dat$G0-dat$D0
##http://www.nrel.gov/midc/la_ola_lanai/instruments.html:
##The datalogger program runs using Greenwich Mean Time (GMT),
##data is converted to Hawaiin Standard Time (HST) after data collection
idxLocal <- with(dat, as.POSIXct(paste(date, hour), format = '%m/%d/%Y %H:%M', tz = 'HST'))
head(idxLocal)
idx <- local2Solar(idxLocal, lon = -156.9339)
head(idx)
## End(Not run)
Small utilities for difftime objects.
Description
diff2Hours converts a difftime object into its numeric
value with units = 'hours'.
char2diff converts a character description into a
difftime object, following the code of
seq.POSIXt.
sample2Hours calculates the sampling time in hours described by a character
or a difftime.
P2E (power to energy) sums a series of power values (for
example, irradiance) to obtain energy aggregation (for example,
irradiation) using sample2Hours for the units conversion.
Usage
diff2Hours(by)
char2diff(by)
sample2Hours(by)
P2E(x, by)
Arguments
| by | A character for  | 
| x | A numeric vector. | 
Value
A numeric value or a difftime object.
Author(s)
Oscar Perpiñán Lamigueiro
See Also
Examples
char2diff('min')
char2diff('2 s')
sample2Hours('s')
sample2Hours('30 m')
by1 <- char2diff('10 min')
sample2Hours(by1)
Conversion between angle units.
Description
Several small functions to convert angle units.
Usage
d2r(x)
r2d(x)
h2r(x)
h2d(x)
r2h(x)
d2h(x)
r2sec(x)
Arguments
| x | A numeric value. | 
Value
A numeric value:
- d2r:
- Degrees to radians. 
- r2d:
- Radians to degrees. 
- h2r:
- Hours to radians. 
- r2h:
- Radians to hours. 
- h2d:
- Hours to degrees. 
- d2h:
- Degrees to hours. 
- r2sec:
- Radians to seconds. 
Author(s)
Oscar Perpiñán Lamigueiro.
Utilities for time indexes.
Description
Several small functions to extract information from POSIXct
indexes.
Usage
hour(x)
minute(x)
second(x)
hms(x)
doy(x)
dom(x)
month(x)
year(x)
DoY(x)
DoM(x)
Month(x)
Year(x)
dst(x)
truncDay(x)
Arguments
| x | A  | 
Value
The functions year, month,
day, hour, minute, second give the numeric
value corresponding to their names.
doy and dom provide the (numeric) day of year and day of month,
respectively.
Month, Year, DoY and DoM give
the same result as month, year, doy and dom
in a character string format.
hms gives the numeric value
hour(x)+minute(x)/60+second(x)/3600
dst is +1 if the Daylight Savings Time flag is in force,
zero if not, -1 if unknown (DateTimeClasses).
truncDay truncates the POSIXct object towards the day.
Author(s)
Oscar Perpiñán Lamigueiro.
See Also
as.POSIXct
Losses of a GCPV system
Description
The function losses calculates the yearly losses
from a Gef or a ProdGCPV object. The function
compareLosses compares the losses from several ProdGCPV
objects and plots the result with dotplot.
Usage
compareLosses(...)
losses(object)
Arguments
| ... | A list of  | 
| object | An object of  | 
Methods
- signature(... = "Gef")
- shadows and angle of incidence ( - AoI) losses.
- signature(... = "ProdGCPV")
- shadows, - AoI, generator (mainly temperature), DC and AC system (as detailed in- effSysof- fProd) and inverter losses.
Author(s)
Oscar Perpiñán Lamigueiro
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
See Also
Examples
lat = 37.2;
G0dm = c(2766, 3491, 4494, 5912, 6989, 7742, 7919, 7027, 5369, 3562, 2814,
2179)
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 15.2)
prom = list(G0dm = G0dm, Ta = Ta)
###Comparison of different tracker methods
ProdFixed <- prodGCPV(lat = lat,dataRad = prom, keep.night = FALSE)
Prod2x <- prodGCPV(lat = lat, dataRad = prom, modeTrk = 'two', keep.night = FALSE)
ProdHoriz <- prodGCPV(lat = lat,dataRad = prom, modeTrk = 'horiz', keep.night = FALSE)
losses(ProdFixed)
losses(as(ProdFixed, 'Gef'))
compareLosses(ProdFixed, Prod2x, ProdHoriz)
Methods for Function as.data.frameD
Description
Convert a Sol object (or a extended class) into a data.frame with
daily values.
Usage
## S4 method for signature 'Sol'
as.data.frameD(object, complete=FALSE)Arguments
| object | A  | 
| complete | A logical. | 
Methods
- signature(object = "Sol")
- This function converts the object into a - zoocontainer with the- as.zooDfunction and then into a- data.framewith- as.data.frame. Besides, it includes three additional columns named- month,- day(day of year) and- year.
See as.zooD-methods for a description of the argument
complete.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.data.frameI
Description
Convert a Sol object (or a extended class) into a data.frame with
intradaily values.
Usage
## S4 method for signature 'Sol'
as.data.frameI(object, complete=FALSE, day=FALSE)Arguments
| object | A  | 
| complete | A logical. | 
| day | A logical. | 
Methods
- signature(object = "Sol")
- This function converts the object into a - zoocontainer with the- as.zooIfunction and then into a- data.framewith- as.data.frame. Besides, it includes three additional columns named- month,- day(day of year) and- year.
See as.zooI-methods for a description of the arguments
complete and day.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.data.frameM
Description
Convert a G0 object (or a extended class) into a data.frame with
monthly values.
Usage
## S4 method for signature 'G0'
as.data.frameM(object, complete=FALSE)Arguments
| object | A  | 
| complete | A logical. | 
Methods
- signature(object = "G0")
- This function converts the object into a - zoocontainer with the- as.zooMfunction and then into a- data.framewith- as.data.frame. Besides, it includes two additional columns named- monthand- year.
See as.zooM-methods for a description of the argument
complete.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.data.frameY
Description
Convert a G0 object (or a extended class) into a data.frame with
yearly values.
Usage
## S4 method for signature 'G0'
as.data.frameY(object, complete=FALSE)Arguments
| object | A  | 
| complete | A logical. | 
Methods
- signature(object = "G0")
- This function converts the object into a - zoocontainer with the- as.zooYfunction and then into a- data.framewith- as.data.frame. Besides, it includes an additional column named- year.
See as.zooY-methods for a description of the argument
complete.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.zooD
Description
Convert a Sol, G0, Gef,
ProdGCPV or ProdPVPS object into a
zoo object with daily values.
Usage
## S4 method for signature 'Sol'
as.zooD(object, complete=FALSE)
Arguments
| object | A  | 
| complete | A logical. | 
Methods
- signature(object = "Sol")
- Conversion to a - zooobject with the content of the- solDslot.
- signature(object = "G0")
- If - complete=FALSE(default) the result includes only the columns of- G0d,- D0dand- B0dfrom the- G0Dslot. If- complete=TRUEit returns the contents of the slots- solDand- G0D.
- signature(object = "Gef")
- If - complete=FALSE(default) the result includes only the columns of- Gefd,- Defdand- Befdfrom the- GefDslot. If- complete=TRUEit returns the contents of the slots- solD,- G0Dand- GefD
- signature(object = "ProdGCPV")
- If - complete=FALSE(default) the result includes only the columns of- Eac,- Edcand- Yffrom the- prodDslot. If- complete=TRUEit returns the contents of the slots- solD,- G0D,- GefDand- prodD.
- signature(object = "ProdPVPS")
- If - complete=FALSE(default) the result includes only the columns of- Eac,- Qdand- Yffrom the- prodDslot. If- complete=TRUEit returns the contents of the slots- solD,- G0D,- GefDand- prodD.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.zooI
Description
Convert a Sol, G0, Gef,
ProdGCPV or ProdPVPS object into a
zoo object with intradaily values and (optionally) daily values.
Usage
## S4 method for signature 'Sol'
as.zooI(object, complete=FALSE, day=FALSE)Arguments
| object | A  | 
| complete | A logical. | 
| day | A logical. | 
Methods
- signature(object = "Sol")
- If - complete=FALSEand- day=FALSE(default) the result includes only the content of the- solIslot. It- day=TRUEthe contents of the- solDslot are included.
- signature(object = "G0")
- If - complete=FALSEand- day=FALSE(default) the result includes only the columns of- G0,- D0and- B0of the- G0Islot. If- complete=TRUEit returns the contents of the slots- G0Iand- solI. If- day=TRUEthe daily values (slots- G0Dand- solD) are also included.)
- signature(object = "Gef")
- If - complete=FALSEand- day=FALSE(default) the result includes only the columns of- Gef,- Defand- Befof the- GefIslot. If- complete=TRUEit returns the contents of the slots- GefI,- G0Iand- solI. If- day=TRUEthe daily values (slots- GefD,- G0Dand- solD) are also included.)
- signature(object = "ProdGCPV")
- If - complete=FALSEand- day=FALSE(default) the result includes only the columns of- Pacand- Pdcof the- prodIslot. If- complete=TRUEit returns the contents of the slots- prodI,- GefI,- G0Iand- solI. If- day=TRUEthe daily values (slots- prodD,- GefD,- G0Dand- solD) are also included.)
- signature(object = "ProdPVPS")
- If - complete=FALSEand- day=FALSE(default) the result includes only the columns of- Pacand- Qof the- prodIslot. If- complete=TRUEit returns the contents of the slots- prodI,- GefI,- G0Iand- solI. If- day=TRUEthe daily values (slots- prodD,- GefD,- G0Dand- solD) are also included.)
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.zooM
Description
Convert a G0, Gef,
ProdGCPV or ProdPVPS object into a
zoo object with monthly average of daily values.
Usage
## S4 method for signature 'G0'
as.zooM(object, complete=FALSE)
Arguments
| object | A  | 
| complete | A logical. | 
Methods
- signature(object = "G0")
- The result is the - G0dmslot.
- signature(object = "Gef")
- If - complete=FALSE(default) the result is the slot- Gefdm. If- complete=TRUEit returns the slot- G0dm.
- signature(object = "ProdGCPV")
- If - complete=FALSE(default) the result is the- prodDmslot. If- complete=TRUEthe result includes the slots- G0dmand- Gefdm.
- signature(object = "ProdPVPS")
- If - complete=FALSE(default) the result is the- prodDmslot. If- complete=TRUEthe result includes the slots- G0dmand- Gefdm.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function as.zooY
Description
Convert a G0, Gef,
ProdGCPV or ProdPVPS object into a
zoo object with yearly values.
Usage
## S4 method for signature 'G0'
as.zooY(object, complete=FALSE)
Arguments
| object | A  | 
| complete | A logical. | 
Methods
- signature(object = "G0")
- The result is the - G0yslot.
- signature(object = "Gef")
- If - complete=FALSE(default) the result is the slot- Gefy. If- complete=TRUEit returns the slot- G0y.
- signature(object = "ProdGCPV")
- If - complete=FALSE(default) the result is the- prodyslot. If- complete=TRUEthe result includes the slots- G0yand- Gefy.
- signature(object = "ProdPVPS")
- If - complete=FALSE(default) the result is the- prodyslot. If- complete=TRUEthe result includes the slots- G0yand- Gefy.
Author(s)
Oscar Perpiñán Lamigueiro
Compare G0, Gef and ProdGCPV objects
Description
Compare and plot the yearly values of several objects.
Usage
## S4 method for signature 'G0'
compare(...)Arguments
| ... | A list of objects to be compared. | 
Methods
The class of the first element of ... is used to determine the
suitable method. The result is plotted with dotplot:
- signature(... = "G0")
- yearly values of - G0d,- B0dand- D0d.
- signature(... = "Gef")
- yearly values of - Gefd,- Befdand- Defd.
- signature(... = "ProdGCPV")
- yearly values of - Yf,- Gefdand- G0d.
Author(s)
Oscar Perpiñán Lamigueiro
See Also
Examples
lat = 37.2;
G0dm = c(2766, 3491, 4494, 5912, 6989, 7742, 7919, 7027, 5369, 3562, 2814,
2179)
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 15.2)
prom = list(G0dm = G0dm, Ta = Ta)
###Comparison of different tracker methods
ProdFixed <- prodGCPV(lat = lat, dataRad = prom, keep.night = FALSE)
Prod2x <- prodGCPV(lat = lat, dataRad = prom, modeTrk = 'two', keep.night = FALSE)
ProdHoriz <- prodGCPV(lat = lat, dataRad = prom, modeTrk = 'horiz', keep.night = FALSE)
compare(ProdFixed, Prod2x, ProdHoriz)
##The first element rules the method
GefFixed = as(ProdFixed, 'Gef')
compare(GefFixed, Prod2x, ProdHoriz)
Methods for function getData
Description
Meteorological source data of a Meteo (or extended) object.
Methods
- signature(object = "Meteo")
- returns the meteorological source data of the slot - dataof the object.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for function getG0
Description
Global irradiation source data of a Meteo (or extended) object.
Methods
- signature(object = "Meteo")
- returns the global irradiation values stored in a - Meteoobject.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function getLat
Description
Latitude angle of solaR objects.
Usage
getLat(object, units='rad')Arguments
| object | A  | 
| units | A character, 'rad' or 'deg'. | 
Methods
This function returns the latitude angle in radians
(units='rad', default) or degrees (units='deg').
- signature(object = "Meteo")
- Value of the - latDataslot, which is defined by the argument- latof the- readG0dmand- readBDfunctions, or by the- latcomponent of the- dataRadobject passed to- calcG0(or equivalent) . It is the latitude of the meteorological station (or equivalent) which provided the irradiation source data. It may be different from the value used for the calculation procedure.
- signature(object = "Sol")
- Value of the - latslot, which is defined by the argument- latof the- calcSolfunction. It is the value used through the calculation procedure.
- signature(object = "G0")
- same as for the - Solclass.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function indexD
Description
Daily time index of solaR objects.
Usage
## S4 method for signature 'Meteo'
indexD(object)
## S4 method for signature 'Sol'
indexD(object)
## S4 method for signature 'G0'
indexD(object)
Arguments
| object | A  | 
Methods
- signature(object = "Meteo")
- returns the index of the - dataslot (a- zooobject.)
- signature(object = "Sol")
- returns the index of the - solDslot (a- zooobject.)
- signature(object = "G0")
- same as for - object='Sol'
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function indexI
Description
Intra-daily time index of solaR objects.
Usage
## S4 method for signature 'Sol'
indexI(object)
Arguments
| object | A  | 
Methods
- signature(object = "Sol")
- returns the index of the slot - solI(a- zooobject).
Author(s)
Oscar Perpiñán Lamigueiro
Methods for Function indexRep
Description
Daily time index of solaR object.
Methods
- signature(object = "Sol")
- returns the daily index of the - solDslot but repeated to match the length of the index of the- solIslot.
Author(s)
Oscar Perpiñán Lamigueiro
Methods for function levelplot.
Description
Methods for function levelplot and zoo and solaR objects.
Methods
- signature(x = "formula", data = "zoo"):
- 
The zooobject is converted into adata.frameobject and additional columns are added (day,monthandyear, andwwith the solar hour in radians). Thisdata.frameis thedataargument for a call tolevelplot, using the S3 method for classformula.
- signature(x = "formula", data = "Meteo"):
- 
The Meteoobject is converted into azooobject, and the previous method is used.
- signature(x = "formula", data = "Sol"):
- idem 
- signature(x = "formula", data = "G0"):
- idem 
Author(s)
Oscar Perpiñán Lamigueiro
Merge solaR objects
Description
Merge the daily time series of solaR objects
Usage
## S4 method for signature 'G0'
mergesolaR(...)Arguments
| ... | A list of objects to be merged. | 
Methods
The class of the first element of ... is used to
determine the suitable method. Only the most important daily variable is
merged, depending on the class of the objects:
- signature(... = "Meteo")
- G0
- signature(... = "G0")
- G0d
- signature(... = "Gef")
- Gefd
- signature(... = "ProdGCPV")
- Yf
- signature(... = "ProdPVPS")
- Yf
Examples
lat = 37.2;
G0dm = c(2766, 3491, 4494, 5912, 6989, 7742, 7919, 7027, 5369, 3562, 2814,
2179)
Ta = c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 15.2)
prom = list(G0dm = G0dm, Ta = Ta)
###Different tracker methods
ProdFixed <- prodGCPV(lat = lat,dataRad = prom, keep.night = FALSE)
Prod2x <- prodGCPV(lat = lat, dataRad = prom, modeTrk = 'two', keep.night = FALSE)
ProdHoriz <- prodGCPV(lat = lat,dataRad = prom, modeTrk = 'horiz', keep.night = FALSE)
prod <- mergesolaR(ProdFixed, Prod2x, ProdHoriz)
head(prod)
Methods for Function shadeplot
Description
Visualization of the content of a Shade object.
Methods
- signature(x = "Shade")
- display the results of the iteration with a level plot for the two-axis tracking, or with conventional plot for horizontal tracking and fixed systems. 
Author(s)
Oscar Perpiñán Lamigueiro
Methods for extracting a time window
Description
Method for extracting the subset of a solaR object
whose daily time index (indexD) is comprised between the
times i and j.
Usage
## S4 method for signature 'Meteo'
x[i, j, ..., drop = TRUE]
## S4 method for signature 'Sol'
x[i, j, ..., drop = TRUE]
## S4 method for signature 'G0'
x[i, j, ..., drop = TRUE]
## S4 method for signature 'Gef'
x[i, j, ..., drop = TRUE]
## S4 method for signature 'ProdGCPV'
x[i, j, ..., drop = TRUE]
## S4 method for signature 'ProdPVPS'
x[i, j, ..., drop = TRUE]
Arguments
| x | A  | 
| i | an index/time value ( | 
| j | an index/time value ( | 
| ...,drop | Additional arguments for  | 
Author(s)
Oscar Perpiñán Lamigueiro
See Also
Examples
lat = 37.2
sol = calcSol(lat, BTd = fBTd(mode = 'serie'))
range(indexD(sol))
start <- as.Date(indexD(sol)[1])
end <- start + 30
solWindow <- sol[start, end]
range(indexD(solWindow))
Exporter of solaR results
Description
Exports the results of the solaR functions as text
files using read.zoo
Usage
## S4 method for signature 'Sol'
writeSolar(object, file, complete = FALSE,
    day = FALSE, timeScales = c('i', 'd', 'm', 'y'), sep = ',', ...)Arguments
| object | A  | 
| file | A character with the name of the file. | 
| complete | A logical. Should all the variables be exported? | 
| day | A logical. Should be daily values included in the intradaily file? | 
| timeScales | A character. Use 'i' to export intradaily values, 'd' for daily values, 'm' for monthly values and 'y' for yearly values. A different file will be created for each choice. | 
| sep | The field separator character. | 
| ... | Additional arguments for  | 
Methods
- signature(object = "Sol")
- This function exports the slots with results using - write.zoo. If- complete = FALSEand- day = FALSE(default) the result includes only the content of the- solIslot. It- day = TRUEthe contents of the- solDslot are included.
- signature(object = "G0")
- If - complete = FALSEand- day = FALSE(default) the result includes only the columns of- G0,- D0and- B0of the- G0Islot. If- complete = TRUEit returns the contents of the slots- G0Iand- solI. If- day = TRUEthe daily values (slots- G0Dand- solD) are also included.
- signature(object = "Gef")
- If - complete = FALSEand- day = FALSE(default) the result includes only the columns of- Gef,- Defand- Befof the- GefIslot. If- complete = TRUEit returns the contents of the slots- GefI,- G0Iand- solI. If- day = TRUEthe daily values (slots- GefD,- G0Dand- solD) are also included.
- signature(object = "ProdGCPV")
- If - complete = FALSEand- day = FALSE(default) the result includes only the columns of- Pacand- Pdcof the- prodIslot. If- complete = TRUEit returns the contents of the slots- prodI,- GefI,- G0Iand- solI. If- day = TRUEthe daily values (slots- prodD,- GefD,- G0Dand- solD) are also included.
- signature(object = "ProdPVPS")
- If - complete = FALSEand- day = FALSE(default) the result includes only the columns of- Pacand- Qof the- prodIslot. If- complete = TRUEit returns the contents of the slots- prodI,- GefI,- G0Iand- solI. If- day = TRUEthe daily values (slots- prodD,- GefD,- G0Dand- solD) are also included.
Author(s)
Oscar Perpiñán Lamigueiro
See Also
write.zoo,
read.zoo,
as.zooI,
as.zooD,
as.zooM,
as.zooY
Examples
lat <- 37.2;
G0dm <- c(2766, 3491, 4494, 5912, 6989, 7742, 7919, 7027, 5369, 3562, 2814, 2179)
Ta <- c(10, 14.1, 15.6, 17.2, 19.3, 21.2, 28.4, 29.9, 24.3, 18.2, 17.2, 15.2)
prom <- list(G0dm = G0dm, Ta = Ta)
prodFixed <- prodGCPV(lat = lat, dataRad = prom, modeRad = 'aguiar', keep.night = FALSE)
old <- setwd(tempdir())
writeSolar(prodFixed, 'prodFixed.csv')
dir()
zI <- read.zoo("prodFixed.csv",
               header = TRUE, sep = ",",
               FUN = as.POSIXct)
zD <- read.zoo("prodFixed.D.csv",
               header = TRUE, sep = ",")
zD <- read.zoo("prodFixed.D.csv",
               header = TRUE, sep = ",",
               FUN = as.yearmon)
setwd(old)
Methods for function xyplot in Package ‘solaR’
Description
Methods for function xyplot in Package ‘solaR’
Methods
- signature(x = "formula", data = "zoo"):
- 
The zooobject is converted into adata.frameobject and additional columns are added (day,monthandyear, andwwith the solar hour in radians). Thisdata.frameis thedataargument for a call toxyplot, using the S3 method for classformula.
- signature(x = "formula", data = "Meteo"):
- 
The Meteoobject is converted into azooobject withgetData(data). Thiszoois thedataargument for a call toxyplot, using the S4 method forsignature(x = "formula", data = "zoo").
- signature(x = "formula", data = "Sol"):
- 
The Solobject is converted into azooobject withas.zooI(data, complete = TRUE, day = TRUE)(therefore, thezooincludes the whole content of the object). Thiszoois thedataargument for a call toxyplot, using the S4 method forsignature(x = "formula", data = "zoo").
- signature(x = "formula", data = "G0"):
- 
The G0object is converted into azooobject withas.zooI(data, complete = TRUE, day = TRUE)(therefore, thezooincludes the whole content of the object). Thiszoois thedataargument for a call toxyplot, using the S4 method forsignature(x = "formula", data = "zoo").
- signature(x = "Meteo", data = "missing"):
- 
The Meteoobject is converted into azooobject withgetData(x)and displayed with the method forzoo.
- signature(x = "G0", data = "missing"):
- 
The xobject is converted into azooobject withas.zooD(x, complete = FALSE). Therefore, the content of theG0Dslot (azooobject) is displayed with the method forzoo.
- signature(x = "ProdGCPV", data = "missing"):
- 
Idem, but the variables are not superposed. 
- signature(x = "ProdPVPS", data = "missing"):
- 
Idem. 
- signature(x = "formula", data = "Shade"):
- The - Shadeobject is converted into a- data.frameand passed as the- dataargument to the- xyplotfunction. Once again, the S3 method for class- formulais used.
Author(s)
Oscar Perpiñán Lamigueiro
Markov Transition Matrices for the Aguiar etal. procedure
Description
Markov Transition Matrices and auxiliary data for generating sequences of daily radiation values.
Usage
data(MTM)Format
MTM is a data.frame with the collection of Markov
Transition Matrices defined in the paper "Simple procedure for
generating sequences of daily radiation values using a library of
Markov transition matrices", Aguiar et al., Solar Energy,
1998. Ktlim (matrix) and Ktm (vector) are auxiliary data
to choose the correspondent matrix of the collection.
Daily irradiation and ambient temperature from the Helios-IES database
Description
A year of irradiation, maximum and minimum ambient temperature from the HELIOS-IES database.
Usage
data(helios)Format
A data frame with 355 observations on the following 4 variables:
- yyyy.mm.dd
- a factor: year, month and day. 
- G.0.
- a numeric vector, daily global horizontal irradiation. 
- TambMax
- a numeric vector, maximum ambient temperature. 
- TambMin
- a numeric vector, minimum ambient temperature. 
Source
http://helios.ies-def.upm.es/consulta.aspx
Productivity of a set of PV systems of a PV plant.
Description
A zoo object with the time evolution of the final productivity of a set
of 22 systems of a large PV plant.
Usage
data(prodEx)References
O. Perpiñán, Statistical analysis of the performance and simulation of a two-axis tracking PV system, Solar Energy, 83:11(2074–2085), 2009.https://oa.upm.es/1843/1/PERPINAN_ART2009_01.pdf
Coefficients of centrifugal pumps.
Description
Coefficients of centrifugal pumps
Usage
data(pumpCoef)Format
A data frame with 13 columns:
- Qn
- rated flux 
- stages
- number of stages 
- Qmax
- maximum flux 
- Pmn
- rated motor power 
- a, b, c
- Coefficients of the equation - H=a \cdot f^2+b \cdot f \cdot Q+c \cdot Q^2.
- g, h, i
- Coefficients of the efficiency curve of the motor (50 Hz): - \eta_{m}=g \cdot (\%P_{mn})^2+h \cdot (\%P{mn})+i.
- j, k, l
- Coefficients of the efficiency curve of the pump (50 Hz): - \eta_{b}=j \cdot Q^2+k \cdot Q+l.
Details
With this version only pumps from the manufacturer Grundfos are included.
Source
https://product-selection.grundfos.com/
References
- Perpiñán, O, Energía Solar Fotovoltaica, 2025. (https://blogs.upm.es/oscarperpinan/libros/esf/) 
- Perpiñán, O. (2012), "solaR: Solar Radiation and Photovoltaic Systems with R", Journal of Statistical Software, 50(9), 1-32, doi:10.18637/jss.v050.i09 
solaR theme
Description
A customized theme for lattice. It is based on the custom.theme.2
function of the latticeExtra package with the next values:
- pch = 19
- cex = 0.7
- region = rev(brewer.pal(9, 'YlOrRd'))
- strip.background$col = 'lightgray'
- strip.shingle$col = 'transparent'
Defunct functions in package ‘solaR’
Description
These functions are no longer available.
Details
- readSIAR: The SIAR webpage cannot be accessed with a direct URL but using javascript code. Therefore, the function- readSIARno longer works. This help page is still here as a reference. The SIAR webpage is now https://eportal.mapa.gob.es//websiar/Inicio.aspx.
- TargetDiagram,- analyzeData: Use the- tdrpackage