Skip to content

Commit

Permalink
Merge pull request #17 from jfcarr-astronomy/coord/selenographic
Browse files Browse the repository at this point in the history
Calculate -> Selenographic (lunar) coordinates (sub-Earth and sub-Solar)
  • Loading branch information
Jim Carr committed Nov 25, 2020
2 parents 7675ddb + 9402f58 commit c920d79
Show file tree
Hide file tree
Showing 4 changed files with 398 additions and 2 deletions.
12 changes: 12 additions & 0 deletions PALib.Tests/PACoordinates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -135,5 +135,17 @@ public void CarringtonRotationNumber()
{
Assert.Equal(1624, _paCoordinates.CarringtonRotationNumber(27, 1, 1975));
}

[Fact]
public void SelenographicCoordinates1()
{
Assert.Equal((-4.88, 4.04, 19.78), _paCoordinates.SelenographicCoordinates1(1, 5, 1988));
}

[Fact]
public void SelenographicCoordinates2()
{
Assert.Equal((6.81, 83.19, 1.19), _paCoordinates.SelenographicCoordinates2(1, 5, 1988));
}
}
}
77 changes: 76 additions & 1 deletion PALib/PACoordinates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -646,7 +646,6 @@ public double MeanObliquityOfTheEcliptic(double greenwichDay, int greenwichMonth
var mDeg1 = 360 - (360 * (julianDateDays - 2398220) / 25.38);
var mDeg2 = mDeg1 - 360 * (mDeg1 / 360).Floor();
var l0Deg1 = mDeg2 + aDeg;
// var _l0_deg2 = l0_deg1 - 360.0 * (l0_deg1 / 360.0).floor();
var b0Rad = (((sunLongDeg - longAscNodeDeg).ToRadians()).Sine() * ((PAMacros.DegreesMinutesSecondsToDecimalDegrees(7, 15, 0)).ToRadians()).Sine()).ASine();
var theta1Rad = (-((sunLongDeg).ToRadians()).Cosine() * ((PAMacros.Obliq(gwdateDay, gwdateMonth, gwdateYear)).ToRadians()).Tangent()).AngleTangent();
var theta2Rad = (-((longAscNodeDeg - sunLongDeg).ToRadians()).Cosine() * ((PAMacros.DegreesMinutesSecondsToDecimalDegrees(7, 15, 0)).ToRadians()).Tangent()).AngleTangent();
Expand Down Expand Up @@ -679,5 +678,81 @@ public int CarringtonRotationNumber(double gwdateDay, int gwdateMonth, int gwdat

return crn;
}

/// <summary>
/// Calculate selenographic (lunar) coordinates (sub-Earth)
/// </summary>
/// <param name="gwdateDay"></param>
/// <param name="gwdateMonth"></param>
/// <param name="gwdateYear"></param>
/// <returns>sub-earth longitude, sub-earth latitude, and position angle of pole</returns>
public (double subEarthLongitude, double subEarthLatitude, double positionAngleOfPole) SelenographicCoordinates1(double gwdateDay, int gwdateMonth, int gwdateYear)
{
var julianDateDays = PAMacros.CivilDateToJulianDate(gwdateDay, gwdateMonth, gwdateYear);
var tCenturies = (julianDateDays - 2451545) / 36525;
var longAscNodeDeg = 125.044522 - 1934.136261 * tCenturies;
var f1 = 93.27191 + 483202.0175 * tCenturies;
var f2 = f1 - 360 * (f1 / 360).Floor();
var geocentricMoonLongDeg = PAMacros.MoonLong(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear);
var geocentricMoonLatRad = (PAMacros.MoonLat(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear)).ToRadians();
var inclinationRad = (PAMacros.DegreesMinutesSecondsToDecimalDegrees(1, 32, 32.7)).ToRadians();
var nodeLongRad = (longAscNodeDeg - geocentricMoonLongDeg).ToRadians();
var sinBe = -(inclinationRad).Cosine() * (geocentricMoonLatRad).Sine() + (inclinationRad).Sine() * (geocentricMoonLatRad).Cosine() * (nodeLongRad).Sine();
var subEarthLatDeg = PAMacros.Degrees((sinBe).ASine());
var aRad = (-(geocentricMoonLatRad).Sine() * (inclinationRad).Sine() - (geocentricMoonLatRad).Cosine() * (inclinationRad).Cosine() * (nodeLongRad).Sine()).AngleTangent2((geocentricMoonLatRad).Cosine() * (nodeLongRad).Cosine());
var aDeg = PAMacros.Degrees(aRad);
var subEarthLongDeg1 = aDeg - f2;
var subEarthLongDeg2 = subEarthLongDeg1 - 360 * (subEarthLongDeg1 / 360).Floor();
var subEarthLongDeg3 = (subEarthLongDeg2 > 180) ? subEarthLongDeg2 - 360 : subEarthLongDeg2;
var c1Rad = ((nodeLongRad).Cosine() * (inclinationRad).Sine() / ((geocentricMoonLatRad).Cosine() * (inclinationRad).Cosine() + (geocentricMoonLatRad).Sine() * (inclinationRad).Sine() * (nodeLongRad).Sine())).AngleTangent();
var obliquityRad = (PAMacros.Obliq(gwdateDay, gwdateMonth, gwdateYear)).ToRadians();
var c2Rad = ((obliquityRad).Sine() * ((geocentricMoonLongDeg).ToRadians()).Cosine() / ((obliquityRad).Sine() * (geocentricMoonLatRad).Sine() * ((geocentricMoonLongDeg).ToRadians()).Sine() - (obliquityRad).Cosine() * (geocentricMoonLatRad).Cosine())).AngleTangent();
var cDeg = PAMacros.Degrees(c1Rad + c2Rad);

var subEarthLongitude = Math.Round(subEarthLongDeg3, 2);
var subEarthLatitude = Math.Round(subEarthLatDeg, 2);
var positionAngleOfPole = Math.Round(cDeg, 2);

return (subEarthLongitude, subEarthLatitude, positionAngleOfPole);
}

/// <summary>
/// Calculate selenographic (lunar) coordinates (sub-Solar)
/// </summary>
/// <param name="gwdateDay"></param>
/// <param name="gwdateMonth"></param>
/// <param name="gwdateYear"></param>
/// <returns>sub-solar longitude, sub-solar colongitude, and sub-solar latitude</returns>
public (double subSolarLongitude, double subSolarColongitude, double subSolarLatitude) SelenographicCoordinates2(double gwdateDay, int gwdateMonth, int gwdateYear)
{
var julianDateDays = PAMacros.CivilDateToJulianDate(gwdateDay, gwdateMonth, gwdateYear);
var tCenturies = (julianDateDays - 2451545) / 36525;
var longAscNodeDeg = 125.044522 - 1934.136261 * tCenturies;
var f1 = 93.27191 + 483202.0175 * tCenturies;
var f2 = f1 - 360 * (f1 / 360).Floor();
var sunGeocentricLongDeg = PAMacros.SunLong(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear);
var moonEquHorParallaxArcMin = PAMacros.MoonHP(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear) * 60;
var sunEarthDistAU = PAMacros.SunDist(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear);
var geocentricMoonLatRad = (PAMacros.MoonLat(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear)).ToRadians();
var geocentricMoonLongDeg = PAMacros.MoonLong(0, 0, 0, 0, 0, gwdateDay, gwdateMonth, gwdateYear);
var adjustedMoonLongDeg = sunGeocentricLongDeg + 180 + (26.4 * (geocentricMoonLatRad).Cosine() * ((sunGeocentricLongDeg - geocentricMoonLongDeg).ToRadians()).Sine() / (moonEquHorParallaxArcMin * sunEarthDistAU));
var adjustedMoonLatRad = 0.14666 * geocentricMoonLatRad / (moonEquHorParallaxArcMin * sunEarthDistAU);
var inclinationRad = (PAMacros.DegreesMinutesSecondsToDecimalDegrees(1, 32, 32.7)).ToRadians();
var nodeLongRad = (longAscNodeDeg - adjustedMoonLongDeg).ToRadians();
var sinBs = -(inclinationRad).Cosine() * (adjustedMoonLatRad).Sine() + (inclinationRad).Sine() * (adjustedMoonLatRad).Cosine() * (nodeLongRad).Sine();
var subSolarLatDeg = PAMacros.Degrees((sinBs).ASine());
var aRad = (-(adjustedMoonLatRad).Sine() * (inclinationRad).Sine() - (adjustedMoonLatRad).Cosine() * (inclinationRad).Cosine() * (nodeLongRad).Sine()).AngleTangent2((adjustedMoonLatRad).Cosine() * (nodeLongRad).Cosine());
var aDeg = PAMacros.Degrees(aRad);
var subSolarLongDeg1 = aDeg - f2;
var subSolarLongDeg2 = subSolarLongDeg1 - 360 * (subSolarLongDeg1 / 360).Floor();
var subSolarLongDeg3 = (subSolarLongDeg2 > 180) ? subSolarLongDeg2 - 360 : subSolarLongDeg2;
var subSolarColongDeg = 90 - subSolarLongDeg3;

var subSolarLongitude = Math.Round(subSolarLongDeg3, 2);
var subSolarColongitude = Math.Round(subSolarColongDeg, 2);
var subSolarLatitude = Math.Round(subSolarLatDeg, 2);

return (subSolarLongitude, subSolarColongitude, subSolarLatitude);
}
}
}
Loading

0 comments on commit c920d79

Please sign in to comment.