UPP (develop)
Loading...
Searching...
No Matches
ZENSUN.f
Go to the documentation of this file.
1
52!-------------------------------------------------------------------------------------
61 subroutine zensun(day,time,lat,lon,pi,sun_zenith,sun_azimuth)
62
63!
64 use kinds, only: r_kind,i_kind
65
66 implicit none
67
68 integer(i_kind),intent(in):: day
69 real(r_kind),intent(in) :: pi,time,lat,lon
70 integer(i_kind) di
71 real(r_kind) z,gaz
72 real(r_kind) ut,noon
73 real(r_kind) y(5),y2(5),x(2,5),Tx(5,2),xTx(2,2),aTx(5,2),det
74 real(r_kind) tt,eqtime,decang,latsun,lonsun
75 real(r_kind) nday(74),eqt(74),dec(74)
76 real(r_kind) beta(2), beta2(2), a(2,2)
77 real(r_kind) t0,t1,p0,p1,zz,xx,yy
78 real(r_kind),intent(out) :: sun_zenith,sun_azimuth
79
80 data nday/1.0, 6.0, 11.0, 16.0, 21.0, 26.0, 31.0, 36.0, 41.0, 46.0,&
81 51.0, 56.0, 61.0, 66.0, 71.0, 76.0, 81.0, 86.0, 91.0, 96.0,&
82 101.0, 106.0, 111.0, 116.0, 121.0, 126.0, 131.0, 136.0, 141.0, 146.0,&
83 151.0, 156.0, 161.0, 166.0, 171.0, 176.0, 181.0, 186.0, 191.0, 196.0,&
84 201.0, 206.0, 211.0, 216.0, 221.0, 226.0, 231.0, 236.0, 241.0, 246.0,&
85 251.0, 256.0, 261.0, 266.0, 271.0, 276.0, 281.0, 286.0, 291.0, 296.0,&
86 301.0, 306.0, 311.0, 316.0, 321.0, 326.0, 331.0, 336.0, 341.0, 346.0,&
87 351.0, 356.0, 361.0, 366.0/
88
89 data eqt/ -3.23, -5.49, -7.60, -9.48,-11.09,-12.39,-13.34,-13.95,-14.23,-14.19,&
90 -13.85,-13.22,-12.35,-11.26,-10.01, -8.64, -7.18, -5.67, -4.16, -2.69,&
91 -1.29, -0.02, 1.10, 2.05, 2.80, 3.33, 3.63, 3.68, 3.49, 3.09,&
92 2.48, 1.71, 0.79, -0.24, -1.33, -2.41, -3.45, -4.39, -5.20, -5.84,&
93 -6.28, -6.49, -6.44, -6.15, -5.60, -4.82, -3.81, -2.60, -1.19, 0.36,&
94 2.03, 3.76, 5.54, 7.31, 9.04, 10.69, 12.20, 13.53, 14.65, 15.52,&
95 16.12, 16.41, 16.36, 15.95, 15.19, 14.09, 12.67, 10.93, 8.93, 6.70,&
96 4.32, 1.86, -0.62, -3.23/
97
98 data dec/ -23.06,-22.57,-21.91,-21.06,-20.05,-18.88,-17.57,-16.13,-14.57,-12.91,&
99 -11.16, -9.34, -7.46, -5.54, -3.59, -1.62, 0.36, 2.33, 4.28, 6.19,&
100 8.06, 9.88, 11.62, 13.29, 14.87, 16.34, 17.70, 18.94, 20.04, 21.00,&
101 21.81, 22.47, 22.95, 23.28, 23.43, 23.40, 23.21, 22.85, 22.32, 21.63,&
102 20.79, 19.80, 18.67, 17.42, 16.05, 14.57, 13.00, 11.33, 9.60, 7.80,&
103 5.95, 4.06, 2.13, 0.19, -1.75, -3.69, -5.62, -7.51, -9.36,-11.16,&
104 -12.88,-14.53,-16.07,-17.50,-18.81,-19.98,-20.99,-21.85,-22.52,-23.02,&
105 -23.33,-23.44,-23.35,-23.06/
106
107!
108! compute the subsolar coordinates
109!
110
111 tt= mod(real((int(day)+time/24.-1.)),365.25) +1. ! fractional day number
112 ! with 12am 1jan = 1.
113 do di = 1, 73
114 if ((tt >= nday(di)) .and. (tt <= nday(di+1))) exit
115 end do
116
117!============== Perform a least squares regression on doy**3 ==============
118
119 x(1,:) = 1.0
120
121 if ((di >= 3) .and. (di <= 72)) then
122 y(:) = eqt(di-2:di+2)
123 y2(:) = dec(di-2:di+2)
124
125 x(2,:) = nday(di-2:di+2)**3
126 end if
127 if (di == 2) then
128 y(1) = eqt(73)
129 y(2:5) = eqt(di-1:di+2)
130 y2(1) = dec(73)
131 y2(2:5) = dec(di-1:di+2)
132
133 x(2,1) = nday(73)**3
134 x(2,2:5) = (365.+nday(di-1:di+2))**3
135 end if
136 if (di == 1) then
137 y(1:2) = eqt(72:73)
138 y(3:5) = eqt(di:di+2)
139 y2(1:2) = dec(72:73)
140 y2(3:5) = dec(di:di+2)
141
142 x(2,1:2) = nday(72:73)**3
143 x(2,3:5) = (365.+nday(di:di+2))**3
144 end if
145 if (di == 73) then
146 y(1:4) = eqt(di-2:di+1)
147 y(5) = eqt(2)
148 y2(1:4) = dec(di-2:di+1)
149 y2(5) = dec(2)
150
151 x(2,1:4) = nday(di-2:di+1)**3
152 x(2,5) = (365.+nday(2))**3
153 end if
154 if (di == 74) then
155 y(1:3) = eqt(di-2:di)
156 y(4:5) = eqt(2:3)
157 y2(1:3) = dec(di-2:di)
158 y2(4:5) = dec(2:3)
159
160 x(2,1:3) = nday(di-2:di)**3
161 x(2,4:5) = (365.+nday(2:3))**3
162 end if
163
164! Tx = transpose(x)
165 tx(1:5,1)=x(1,1:5)
166 tx(1:5,2)=x(2,1:5)
167! xTx = MATMUL(x,Tx)
168 xtx(1,1)=x(1,1)*tx(1,1)+x(1,2)*tx(2,1)+x(1,3)*tx(3,1)+x(1,4)*tx(4,1)+x(1,5)*tx(5,1)
169 xtx(1,2)=x(1,1)*tx(1,2)+x(1,2)*tx(2,2)+x(1,3)*tx(3,2)+x(1,4)*tx(4,2)+x(1,5)*tx(5,2)
170 xtx(2,1)=x(2,1)*tx(1,1)+x(2,2)*tx(2,1)+x(2,3)*tx(3,1)+x(2,4)*tx(4,1)+x(2,5)*tx(5,1)
171 xtx(2,2)=x(2,1)*tx(1,2)+x(2,2)*tx(2,2)+x(2,3)*tx(3,2)+x(2,4)*tx(4,2)+x(2,5)*tx(5,2)
172
173 det = xtx(1,1)*xtx(2,2) - xtx(1,2)*xtx(2,1)
174 a(1,1) = xtx(2,2)/det
175 a(1,2) = -xtx(1,2)/det
176 a(2,1) = -xtx(2,1)/det
177 a(2,2) = xtx(1,1)/det
178
179! aTx = MATMUL(Tx,a)
180 atx(1,1)=tx(1,1)*a(1,1)+tx(1,2)*a(2,1)
181 atx(2,1)=tx(2,1)*a(1,1)+tx(2,2)*a(2,1)
182 atx(3,1)=tx(3,1)*a(1,1)+tx(3,2)*a(2,1)
183 atx(4,1)=tx(4,1)*a(1,1)+tx(4,2)*a(2,1)
184 atx(5,1)=tx(5,1)*a(1,1)+tx(5,2)*a(2,1)
185 atx(1,2)=tx(1,1)*a(1,2)+tx(1,2)*a(2,2)
186 atx(2,2)=tx(2,1)*a(1,2)+tx(2,2)*a(2,2)
187 atx(3,2)=tx(3,1)*a(1,2)+tx(3,2)*a(2,2)
188 atx(4,2)=tx(4,1)*a(1,2)+tx(4,2)*a(2,2)
189 atx(5,2)=tx(5,1)*a(1,2)+tx(5,2)*a(2,2)
190
191! beta = MATMUL(y,aTx)
192 beta(1) = y(1)*atx(1,1)+y(2)*atx(2,1)+y(3)*atx(3,1)+y(4)*atx(4,1)+y(5)*atx(5,1)
193 beta(2) = y(1)*atx(1,2)+y(2)*atx(2,2)+y(3)*atx(3,2)+y(4)*atx(4,2)+y(5)*atx(5,2)
194
195! beta2 = MATMUL(y2,aTx)
196 beta2(1) = y2(1)*atx(1,1)+y2(2)*atx(2,1)+y2(3)*atx(3,1)+y2(4)*atx(4,1)+y2(5)*atx(5,1)
197 beta2(2) = y2(1)*atx(1,2)+y2(2)*atx(2,2)+y2(3)*atx(3,2)+y2(4)*atx(4,2)+y2(5)*atx(5,2)
198
199!============== finished least squares regression on doy**3 ==============
200
201 if ((di < 3) .or. (di > 72)) tt = tt + 365.
202
203 eqtime=(beta(1) + beta(2)*tt**3)/60.
204 decang=beta2(1) + beta2(2)*tt**3
205 latsun=decang
206
207 ut=time
208 noon=12.-lon/15. ! universal time of noon
209
210 lonsun=-15.*(ut-12.+eqtime)
211
212 t0=(90.-lat)*pi/180.
213 t1=(90.-latsun)*pi/180.
214
215 p0=lon*pi/180.
216 p1=lonsun*pi/180.
217
218 zz=cos(t0)*cos(t1)+sin(t0)*sin(t1)*cos(p1-p0)
219! zz2=sin(t0)*sin(t1)+cos(t0)*cos(t1)*cos(p1-p0)
220 xx=sin(t1)*sin(p1-p0)
221 yy=sin(t0)*cos(t1)-cos(t0)*sin(t1)*cos(p1-p0)
222
223 sun_zenith=90-acos(zz)/(pi/180)
224 sun_azimuth=atan2(xx,yy)/(pi/180)
225
226 return
227end subroutine zensun
subroutine zensun(day, time, lat, lon, pi, sun_zenith, sun_azimuth)
Makes sun zenith and sun azimuth angle.
Definition ZENSUN.f:62