Documente Academic
Documente Profesional
Documente Cultură
Else
Acos = Atn(-x / Sqr(-x * x + 1)) + 1.5708
End If
End Function
'*****************************************************************************************************************
' arc tangent 2 - returneaz arc tangent de y/x, n domeniul [-pi,pi]
Function Atan2(x, y)
' Calcul arc tangent
If (Abs(x) < 0.0000005) Then
If (y > 0) Then
Atan2 = Pi / 2#
Else
Atan2 = -Pi / 2#
End If
Else
Atan2 = Atn(y / x)
' Calcul cadran
If (x < 0) Then
If (y < 0) Then
Atan2 = Atan2 - Pi
Else
Atan2 = Atan2 + Pi
End If
End If
End If
End Function
'*****************************************************************************************************************
1. Y12=GetDeclination(X12) apelul funciei
Declinaie [radiani]
284 n
23,45 sin 2
365
' nDay
= X12 // (i) ziua anului
Function GetDeclination(nDay)
GetDeclination = DTOR * 23.45 * Sin(2# * Pi * (284# + nDay) / 365#)
End Function
'*****************************************************************************************************************
2. Z12=GetAlbedo(H12) apelul funciei
' Adoptam pentru albedo valoarea 0.7 daca temperatura < -5C si 0.2 peste 0 si o interpolare lineara intre aceste valori
Temp
= H12
Function GetAlbedo(Temp)
Const LowTemp = -5
Const LowAlbedo = 0.7
Const HighTemp = 0
End If
End Function
'*****************************************************************************************************************
4.1 AC12=GetNExtra(X12)/1000 apelul funciei
' H0 Iradiaia extraterestr pe o suprafa orizontal integrat de la unghiul orar -w la unghiul orar w.
H0
86400 G sc
1 0,033 cos 2
365
w
= AA12
// unghiul orar al apusului
Lat
= Lat_rad
// latitudinea
Decl = Y12
// declianatia
Nextra = GetNExtra(X12)/1000000
Function GetHExtra_integ (w, Lat, Decl, NExtra)
HExtra = Sin(Decl) * Sin(Lat) * w + Cos(Decl) * Cos(Lat) * Sin(w)
'*****************************************************************************************************************
5.1 Call CalcSunPositionHourAngle(SunZenith, SunAzimuth, Decl, HAngle, Lat) apelul procedurii
' Poziia soarelui: zenit i azimut funcie de declinaie i unghiul orar
' Not: n Braun i Mitchell, convenia pentru unghiul azimutului solar este:
' punctele aproape de ecuator si pozitiv spre vest. Pentru un punct
' aflat la ecuator 0 points south. In emisfera nordica aceasta
' conventie este echivalenta cu cea din SCL. In emisfera sudica
' Azimuth_SCL = PI - Azimuth_BM (modulo 2*PI), prin urmare sinAzimuth este
' acelasi cosAzimuth isi schimba semnul
'
' void CalcSunPositionHourAngle
' double *Zenith
= SunZenith
/* (o) unghiul zenital solar [radian] */
' double *Azimuth
= SunAzimuth /* (o) unghiul azimutal solar [radian] */
' double Decl
= Decl
/* (i) declinaie [radian] */
' double HourAngle
= HAngle
/* (i) unghiul orar [radian] */
' double Lat
= Lat
/* (i) latitudine [radian] */
Sub CalcSunPositionHourAngle (Zenith As Double, Azimuth As Double, Decl As Double, HourAngle As Double, Lat As Double)
' Declaraii
Dim cosZenith As Double, sinAzimuth As Double, cosAzimuth As Double
' Calcul unghi zenital
cos Z sin sin cos cos cos
cosZenith = Cos(Lat) * Cos(Decl) * Cos(HourAngle) + Sin(Lat) * Sin(Decl)
If (cosZenith > 1#) Then cosZenith = 1#
If (cosZenith < -1#) Then cosZenith = -1#
Zenith = Acos(cosZenith)
Wend
While (BMAzimuth > Pi)
BMAzimuth = BMAzimuth - 2# * Pi
Wend
End Function
'*****************************************************************************************************************
5.2.2 GetCosIncidenceAngle(SunZenith, SunAzimuth, SurfSlope, SurfAzimuth) apelul funciei
' Cosinusul unghiului de inciden pe o suprafa nclinat cu orice orientare
cos cos Z cos sin Z sin cos sur
Sub Track (SurfSlope As Double, SurfAzimuth As Double, cosIncidenceAngle As Double, SunZenith As Double, SunAzimuth _
As Double, Mode As Integer, TrackSlope As Double, TrackAzimuth As Double, Lat As Double)
' Conversie a azimutului n convenia Braun i Mitchell
Dim BMSurfAzimuth As Double, BMSunAzimuth As Double, BMTrackAzimuth As Double
BMSunAzimuth = BMAzimuth(SunAzimuth, Lat)
BMTrackAzimuth = BMAzimuth(TrackAzimuth, Lat)
Select Case Mode
' Fr urmrire
Case TR_NONE:
SurfSlope = TrackSlope
BMSurfAzimuth = BMTrackAzimuth
' O singur ax urmrit
Case TR_1_AXIS:
' Axa orizontal
If (TrackSlope = 0#) Then
' Prima dat se convertete unghiul pentru valori ntre -pi/2 i pi/2
While (BMTrackAzimuth < -Pi / 2#)
BMTrackAzimuth = BMTrackAzimuth + Pi
Wend
While (BMTrackAzimuth > Pi / 2#)
BMTrackAzimuth = BMTrackAzimuth - Pi
Wend
If (BMSunAzimuth >= BMTrackAzimuth) Then
BMSurfAzimuth = BMTrackAzimuth + Pi / 2
Else
BMSurfAzimuth = BMTrackAzimuth - Pi / 2
End If
SurfSlope = Atn(Tan(SunZenith) * Cos(BMSurfAzimuth - BMSunAzimuth))
If (SurfSlope < 0#) Then
' SurfSlope = SurfSlope + Pi
SurfSlope = -SurfSlope
End If
' Ax nclinat, suprafaa paralel cu axa
Else
Dim Aux As Double
Aux = GetCosIncidenceAngle(SunZenith, BMSunAzimuth, TrackSlope, BMTrackAzimuth)
BMSurfAzimuth = BMTrackAzimuth + Atn(Sin(SunZenith) * Sin(BMSunAzimuth - BMTrackAzimuth) / Aux / Sin(TrackSlope))
If ((BMSurfAzimuth - BMTrackAzimuth) * (BMSunAzimuth - BMTrackAzimuth) < 0) Then
If (BMSunAzimuth >= BMTrackAzimuth) Then
BMSurfAzimuth = BMSurfAzimuth + Pi
Else
BMBMSurfAzimuth = BMSurfAzimuth - Pi
End If
End If
SurfSlope = Atn(Tan(TrackSlope) / Cos(BMSurfAzimuth - BMTrackAzimuth))
If (SurfSlope < 0#) Then
SurfSlope = SurfSlope + Pi
End If
End If
' Azimutul urmriri (axa vartical)
Case TR_AZIMUTH:
SurfSlope = TrackSlope
BMSurfAzimuth = BMSunAzimuth
' Urmarire n doua axe
Case TR_2_AXIS:
SurfSlope = SunZenith
BMSurfAzimuth = BMSunAzimuth
' n caz de eroare
Case Else:
MsgBox "Error: invalid tracking value"
End Select
' Conversie la convenia SCL
SurfAzimuth = BMAzimuth(BMSurfAzimuth, Lat)
' Calculul unghiului de inciden
cosIncidenceAngle = GetCosIncidenceAngle(SunZenith, SunAzimuth, SurfSlope, SurfAzimuth)
End Sub
'*****************************************************************************************************************
5. AG12=GetMonthlyTrackingRadiation(Lat_rad;TrackModeIndex;Slope_rad;Azim_rad;X12;AE12*1000000;Z12) /1000000
1 cos
1 - cos
H
2
2
Ht HbRb Hd
' Calculul mediei lunare a radiaiei zilnice pe o suprafa nclinat, given the monthly mean
' se dau media lunar a radiaiei zilnice pe o suprafa orizontal, numrul de luni,
' albedo, modul de urmrire i orientara suprafeei de urmrire
' GetMonthlyTrackingRadiation
/* media lunar a radiaiei zilnice pe o suprafa de urmrire [J] */
' double Lat
= Lat_rad
/* latitudine [radian] */
' int Mode
= TrackModeIndex
/* mod de urmrire */
' double TrackSlope
= Slope_rad
/* panta urmririi [radian] */
' double TrackAzim
= Azim_rad
/* azimutul urmririi [radian] */
' int Day
= X12
/* ziua medie a lunii */
' double Hglobar
= AE12*1000000
/* media lunar a radiaiei zilnice pe o suprafa [J] */
' double Albedobar
= Z12
/* medie lunar a albedo [0-1] */
Function GetMonthlyTrackingRadiation (Lat As Double, Mode As Integer, TrackSlope As Double, TrackAzim As Double, Day As _
Integer, Hglobar As Double, Albedobar As Double)
' Calcul declinaie
Dim Decl As Double
Decl = GetDeclination(Day)
' s Calcul unghi orar apus [radian]
Dim Sunset As Double
Sunset = GetSunsetHourAngle(Lat, Decl)
86400 G sc
1 0,033 cos 2
365
H
H0
' Calcul Hdirbar radiaia direct orizontal corespunzatoare lui KTbar, apoi radiaia difuz = radiaia global - radiaia direct
Hd
1,391 3,560 K T 4,189 K T2 2,137 K T3
H
Hd
1,311 3,022 K T 3,427 K T2 1,821 K T3
H
rd
cos cos s
24 sin s s cos s
rt = rd * (a + b * cosHAngle)
Hglo(h) = rt
Hdif(h) = rd
rttot = rttot + rt
rdtot = rdtot + rd
Else
Hglo(h) = 0#
Hdif(h) = 0#
End If
Next h
' Calculul matricelor celor 24 de valori ale radiaiei globale, difuze i directe zilnice
H rt H
H d rd H d
Hb H Hd
For h = 0 To 23
If (rttot > 0#) Then Hglo(h) = Hglo(h) * Hglobar / rttot
If (rdtot > 0#) Then Hdif(h) = Hdif(h) * Hdifbar / rdtot
Hdir(h) = Hglo(h) - Hdif(h)
Next h
Dim Tglobar As Double
Tglobar = 0#
' Calculul celor 24 de valori ale radiaiei pe planul nclinat i nsumarea acestora
1 cos
1 - cos
H
2
2
Ht HbRb Hd
For h = 0 To 23
' Calculul poziiei soarelui
Dim SunZenith As Double, SunAzimuth As Double
HAngle = DTOR * 15# * (h + 0.5 - 12#)
Call CalcSunPositionHourAngle(SunZenith, SunAzimuth, Decl, HAngle, Lat)
' Cazul n care Soarele este sub orizont
If (SunZenith < Pi / 2#) Then
' Calculul orientrii suprafeei
Dim SurfSlope As Double, SurfAzimuth As Double, cosIncidenceAngle As Double
Call Track(SurfSlope, SurfAzimuth, cosIncidenceAngle, SunZenith, SunAzimuth, Mode, TrackSlope, TrackAzim, Lat)
' Calcul Rbbar
Rb
cos
cos z
Dim rb As Double
rb = cosIncidenceAngle / Cos(SunZenith)
If (rb < 0#) Then rb = 0#
' Calculul radiaiei pe planul nclinat
Tglobar = Tglobar + Hdir(h) * rb + Hdif(h) * (1# + Cos(SurfSlope)) / 2# + Albedobar * Hglo(h) * (1# - Cos(SurfSlope)) / 2#
End If
Next h
'*****************************************************************************************************************
6. AH12=GetDailyDiffuseFraction(AF12)
' Calculul fraciuni de radiaie difuz zilnic, cunoscnd indicele de luminozitate zilnic
Function GetDailyDiffuseFraction(DailyClearnessIndex)
kt = DailyClearnessIndex
If (kt <= 0.17) Then
kd = 0.99
ElseIf (kt < 0.75) Then
kd = 1.188 + kt * (-2.272 + kt * (9.473 + kt * (-21.865 + kt * 14.648)))
ElseIf (kt < 0.8) Then
kd = -0.54 * kt + 0.632
Else
kd = 0.2
End If
GetDailyDiffuseFraction = kd
End Function
'*****************************************************************************************************************
7. AI12=SurfSlopeNoon(Lat_rad;Y12;TrackModeIndex;Slope_rad; Azim_rad)
Function SurfSlopeNoon (Lat As Double, Decl As Double, Mode As Integer, TrackSlope As Double, TrackAzimuth As Double _
) As Double
Dim SunZenithNoon As Double, SunAzimuthNoon As Double
Dim SurfAzimuthNoon As Double, cosIncidenceAngle As Double
9. AX12=getcoszenithangle(Y12;0;Lat_rad)
' s Unghiul solar zenital [radiani]
'*****************************************************************************************************************
10. BA12=GetHourlyToDailyTotalRadRatio(0;AA12)
' rt,n Calcularea raportului dintre radiaia total orar i zilnic
rt ,n
11. BB12=GetHourlyToDailyDiffuseRadRatio(0;AA12)
' rd,n Calculul raportului dintre radiaia difuz orar i zilnic (cnd soarle este la amiaz, = 0)
rd ,n
cos cos s
24 sin s s cos s