-
Notifications
You must be signed in to change notification settings - Fork 12
/
sunrise.m
61 lines (45 loc) · 1.78 KB
/
sunrise.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function [rhr,rmin,shr,smin]=sunrise(mon,da,yr,lat,long)
% SUNRISE: computes sunrise and sunset times for specified day and location.
% [rhr,rmin,shr,smin] = SUNRISE(mon,da,yr,lat,long) computes the time
% of sunrise rhr:rmin and sunset shr:smin to the nearest minute in GMT
% for a calendar day(s) and a specified (scalar) position.
%
% INPUT: mon - month (e.g., Jan is 1)
% da - day (e.g., Jan 10th is 10)
% yr - year (e.g., 1995)
% lat - latitude [deg]
% long - longitude (west is positive) [deg]
%
% OUTPUT: rhr,rmin - sunrise in GMT hours and minutes
% shr,smin - sunset in GMT hours and minutes.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 8/28/98: version 1.1 (contributed by RP)
% 8/5/99: version 2.0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% convert calender time to julian yd
j=julianmd(yr,mon,da,0);
j0=julianmd(yr,1,1,0);
yd=j(:)-j0(:);
% compute solar altitude for entire day
dt=1./2880;
% we don't want abs(long)>180...
if long<-180, long=long+360; end;
if long>180, long=long-360; end;
time=dt.*[0:2879]'+long/360; % have a whole day, beginning at midnight (near enough)
yday=yd(ones(1,2880),:)+time(:,ones(length(yd),1));
if length(yr)>1,
yr=yr(:,ones(1,2880))';
end;
[z,sorad]=soradna1(yday(:),yr(:),long,lat);
z=reshape(z,2880,length(yd));
sorad=reshape(sorad,2880,length(yd));
[ir,jr]=find(sorad(1:2879,:)==0 & sorad(2:2880,:)>0);
[is,js]=find(sorad(2:2880,:)==0 & sorad(1:2879,:)>0);
srise=zeros(length(yd),1);
sset=any(sorad>0);
srise(jr)=yday(ir+(jr-1)*2880);
sset(js) =yday(is+(js-1)*2880);
rhr=fix(rem(srise,1)*24);
rmin=rem(rem(srise,1)*1440,60);
shr=fix(rem(sset,1)*24);
smin=rem(rem(sset,1)*1440,60);