double calcSunsetUTC(double JD, double latitude, double longitude) { double t = calcTimeJulianCent(JD); // *** First pass to approximate sunset double eqTime = calcEquationOfTime(t); double solarDec = calcSunDeclination(t); double hourAngle = calcHourAngleSunset(latitude, solarDec); double delta = longitude - radToDeg(hourAngle); double timeDiff = 4 * delta; // in minutes of time double timeUTC = 720 + timeDiff - eqTime; // in minutes double newt = calcTimeJulianCent(calcJDFromJulianCent(t) + timeUTC/1440.0); eqTime = calcEquationOfTime(newt); solarDec = calcSunDeclination(newt); hourAngle = calcHourAngleSunset(latitude, solarDec); delta = longitude - radToDeg(hourAngle); timeDiff = 4 * delta; timeUTC = 720 + timeDiff - eqTime; // in minutes // printf("************ eqTime = %f \nsolarDec = %f \ntimeUTC = %f\n\n",eqTime,solarDec,timeUTC); return timeUTC; }
double calcSolarZenith(double latitude, double longitude, int year, int month, int day, int timeUTC){ double T, trueSolarTime, hourAngle, solarDec, csz, zenith, exoatmElevation, te, refractionCorrection; T=jd2jcent(mdy2jd(year, month, day) + timeUTC/1440.0); trueSolarTime = timeUTC + calcEquationOfTime(T) - 4.0 * longitude; hourAngle = trueSolarTime / 4.0 - 180.0; solarDec = calcSunDeclination(T); csz = sin(deg2rad(latitude)) * sin(deg2rad(solarDec)) + cos(deg2rad(latitude)) * cos(deg2rad(solarDec)) * cos(deg2rad(hourAngle)); zenith=rad2deg(acos(csz)); exoatmElevation = 90.0 - zenith; if (exoatmElevation > 85.0) { refractionCorrection = 0.0; } else { te = tan(deg2rad(exoatmElevation)); if (exoatmElevation > 5.0) { refractionCorrection = 58.1/te - 0.07/(te*te*te) + 0.000086/(te*te*te*te*te); } else if (exoatmElevation > -0.575) { refractionCorrection = 1735.0 + exoatmElevation*(-518.2 + exoatmElevation*(103.4 + exoatmElevation*(-12.79 + exoatmElevation*0.711))); } else { refractionCorrection = -20.774 / te; } refractionCorrection = refractionCorrection / 3600.0; } return zenith - refractionCorrection; }