`sun_angle` documentation

`sun_angle` gives the solar azimuth and elevation for any time at any location on Earth. This function was adapted from the `SolarAzEl` function by Darin C. Koblick.

Back to Climate Data Tools Contents.

## Contents

## Syntax

[az,el] = sun_angle(t,lat,lon) [az,el] = sun_angle(t,lat,lon,h)

## Description

`[az,el] = sun_angle(t,lat,lon)` gives the solar azimuth and elevation in degrees at the specified geographic locations and times `t` in UTC. Input `t` can be datenum, datestr, or datetime format.

`[az,el] = sun_angle(t,lat,lon,h)` specifies height above sea level in meters. If no height is specified, elevations are automatically determined via the CDT function `topo_interp`.

## Example 1: Time series at one location

As I write this, I'm sitting at a coffee shop in Pasadena, California, (34.16N,118.13W). Determine the sun's azimuth and elevation right now and for the next 10 days.

t = linspace(now,now+10,10000); % a time array 10 days long t = t + 8/24; % converts Pacific Standard Time to UTC [az,el] = sun_angle(t,34.16,-118.13);

Use `subsubplot` to plot the sun's angles:

subsubplot(2,1,1) plot(t,az) axis tight ylabel 'azimuth (deg)' datetick('x','keeplimits') subsubplot(2,1,2) plot(t,el) axis tight ylabel 'elevation (deg)' datetick('x','keeplimits')

## Example 2: Global grid

Use `cdtgrid` to create a quarter-degree global grid and get the sun angles everywhere around the globe at the UTC strike of midnight on May 27, 2019:

```
[lat,lon] = cdtgrid(1/4);
[az,el] = sun_angle('may 27, 1984 00:00:00',lat,lon);
```

Use `imagescn` to plot the solar azimuth and set the colormap to `cmocean` *phase*. Add political boundaries for context using `borders`.

figure imagescn(lon,lat,az) cb = colorbar; ylabel(cb,'solar azimuth (deg)') caxis([0 360]) cmocean phase borders('countries','color',rgb('gray'))

Overlay sun elevation as contours. Of course, the sun elevation is only physical where the sun is above 0 elevation, so only include positive contours:

hold on contour(lon,lat,el,[0 0],'k') % solid zero contour contour(lon,lat,el,0:10:90,'k:') text(0,0,{'It''s night time';'everywhere south';'of the solid contour'},... 'horiz','center')

## Example 3: The tiny effects of elevation

The sun's angle is affected by elevation above sea level. By default, `sun_angle` uses `topo_interp` to determine ground surface elevation above sea level if no elevation is specified. But here we consider a hypothetical tower, 10,000 meters tall in the center of London (51.51N, 0.123W). What's the sun azimuth and elevation along this tower at 7:45 pm on July 14, 2019?

t = 'july 14, 2019 7:45 pm'; lat = 51.51; lon = -0.123; z = 0:10000; % height along tower (m) [az,el] = sun_angle(t,lat,lon,z); figure subplot(1,2,1) plot(az-az(1),z) % plot relative to base axis tight xlabel '\Delta azimuth (deg)' ylabel 'elevation (m)' subplot(1,2,2) plot(el-el(1),z) % plot relative to base axis tight xlabel '\Delta elevation (deg)'

Note the scientific notation on the x axis scales. That tells us the effect of elevation is miniscule on the scale of a few thousand meters.

## Author Info

This function was originally written by Darin C. Koblick using the formulas described here: http://stjarnhimlen.se/comp/tutorial.html#5. It was adapted for the Climate Data Toolbox for Matlab in 2019 by Chad A. Greene.