The Lunar Limb Corrections

for the Total Solar Eclipse of 2001 June 21

Home

Psion
Eclipse Calculator
GarRec

Solar Eclipses
Javascript Calculator
Irish Eclipses 1997-2021
Lunar Limb Corrections

GPS
Degree Confluences
Geocaching

Fun
Bus Crash photos
Irish County Tripoints

CV/Resume

 

You are : home > Solar Eclipses > Lunar limb corrections

Introduction

Total solar eclipses can now be predicted to a high degree of accuracy. However, there remains one important factor that is not easy to calculate - the Lunar Limb Profile. The limb profile is the profile of mountains and valleys along the lunar limb. This profile affects the exact time of the start and end of totality as the sun has to disappear behind the last valley before totality starts. This can affect the calculated time of the start of totality by up to 8 or 9 seconds.

I wanted to produce a concise representation of the lunar limb profile for the eclipse of 2001 June 21 that I could program into my portable computer (of limited resources) that could correct for the limb profile. My results are presented below.

Copyright

This page and the code below is copyright (C) 2000 Chris O'Byrne. It is being released under the terms of the GNU General Public License. It is based on work carried out by Fred Espenak - see "Total Solar Eclipse of 2001 June 21" for more details.

Results

Below is a copy of figure 8 by Fred Espenak. On top of Fred Espenak's red line, I have plotted a green line which is my fit (below) to Fred's data. Click on the image to download a bigger version.

2001curvessm.gif (59134 bytes)

As you can see, the fit is quite good.

Details

The following is the C code which implements my fit to the data. The function correction takes the contact angle (in the range -180.0 to 180.0) as an argument, and returns the number of seconds to add to the calculated contact time. If the returned number is greater than 100, then there is no data available for that contact angle.

double correction(double angle) {
  static double curves[]={
-171.941,  0.0,            0.0,            0.0,            999.0,
-158.398,  1.2235133e-04,  1.3365506e-01,  3.3962705e+01,  2.5180426e+03,
-149.733,  1.7733999e-04,  1.2427505e-01,  2.5529382e+01,  1.6361009e+03,
-132.700,  4.7121875e-05,  4.9745142e-02,  1.1147217e+01,  7.1643139e+02,
-110.542, -6.8053565e-06,  2.0699868e-02,  5.4016802e+00,  3.3945060e+02,
 -77.476,  9.1190974e-05,  4.0487542e-02,  5.0634473e+00,  1.9263624e+02,
 -60.980, -9.4320860e-05, -1.3699779e-03,  1.3865677e+00,  7.2744909e+01,
 -52.708,  2.9829948e-04,  7.2375058e-02,  5.4117607e+00,  1.3300577e+02,
 -46.667,  0.0,            0.0,           -1.4290044e+00, -7.0169683e+01,
 -24.258,  0.0,            0.0,            0.0,            999.0,
 -15.746,  8.6216885e-04,  1.1066198e-01,  3.8468657e+00,  3.6617535e+01,
  -7.553, -5.9080109e-03, -1.5133790e-01, -5.2658494e-01,  6.2815674e+00,
  -5.290,  0.0,            0.0,           -3.2500000e+00, -2.0375000e+01,
   0.855,  0.0,            0.0,            0.0,            999.0,
   7.576, -1.9114391e-03, -1.1417202e-01,  1.3845249e+00, -3.5936932e+00,
  18.829, -2.8624572e-04, -8.0815048e-02,  2.1672999e+00, -1.2145713e+01,
  21.128,  0.0,            0.0,           -9.0168433e-02, -2.0160504e-01,
  28.587, -2.3707335e-03,  1.5004348e-01, -2.9575686e+00,  1.5761978e+01,
  43.697,  2.3969127e-04, -5.3041595e-02,  3.0328570e+00, -5.0505732e+01,
  62.352,  5.2489122e-05, -3.1063002e-02,  2.9487925e+00, -7.3179606e+01,
  77.427,  3.0839186e-05, -2.6617980e-02,  3.1497602e+00, -9.7743278e+01,
  88.407,  5.1570599e-04, -1.4169977e-01,  1.2657083e+01, -3.6901922e+02,
 130.939, -2.1417261e-03,  3.4081208e-01, -2.2504024e+01,  5.1328801e+02,
 155.084, -1.6512360e-02,  3.5636161e+00, -3.3866094e+02,  1.1962026e+04,
 159.466,  0.0,            0.0,            9.0450566e-01, -1.3704867e+02,
 159.848,  0.0,            0.0,            2.0851319e+00, -3.2531817e+02,
 180.000,  0.0,            0.0,            0.0,            999.0
};
  int i;
  double ans;

  for (i=0; i<27; i++) {
    if (angle < curves[i*5]) {
      i=i*5;
      ans=curves[i+1]*angle+curves[i+2];
      ans=ans*angle+curves[i+3];
      ans=ans*angle+curves[i+4];
      if (i == 110) {
        ans+=4.7665856e-06*angle*angle*angle*angle;
      } else if (i == 115) {
        ans+=2.8426489e-05*angle*angle*angle*angle;
      }
      return ans-123.0/28.4;
    }
  }
  return 999.0;
}

The code works by splitting the data into a number of different curves. The curves[] array contains the start angle of the curve and the x3, x2, x and constant terms of a polynomial fit to the data. The curves that start at 88.407 and 130.939 degrees have an x4 term in them.You will notice that I made an error when doing the fits - hence the 123.0/28.4 constant term subtracted from the final result.

Example

At the centre line at 13:00:00.0 UT, the contact angles are 90.923 degrees and 271.031 degrees (= -88.969 degrees). The output of the correction function for 90.923 is -3.77 seconds, and the output for -88.969 is -5.93 seconds. This compares to the values of -3.5 seconds and -6.0 seconds given by Fred above.

You can see it in action in my Javascript Eclipse calculator.

Request

If you use this code in some work of your own, please drop me a note. My email address is chris <at> obyrne <dot> com. Thanks!


Last Updated: 16 Feb 2001