সূর্য সিদ্ধান্ত পঞ্জিকা সকল প্রবন্ধ

Observer Location, Elevation ও Horizon: সূর্যোদয়-চন্দ্রোদয়ের সময় কেন বদলায়?

Latitude, longitude, observer elevation, horizon dip, refraction, upper limb, disc center, lunar parallax ও terrain obstruction কীভাবে sunrise, sunset, moonrise ও moonset বদলায়।

Rise বা set হলো কোনো celestial body নির্ধারিত horizon condition অতিক্রম করার instant। Clock time কেবল সেই instant-এর local representation। তাই time zone সূর্যোদয়ের physical instant তৈরি করে না; observer coordinates, Earth orientation, body position এবং adopted horizon model সেটি নির্ধারণ করে।

“সূর্য উঠেছে”—কোন সংজ্ঞায়?

সাধারণ দৃশ্যমান sunrise বলতে প্রায়ই Sun-এর upper limb standard atmospheric refraction-সহ apparent horizon স্পর্শ করাকে বোঝানো হয়। কিন্তু astronomical বা traditional calculation অন্য definition নিতে পারে:

Profile Body point Refraction ব্যবহার
Apparent upper-limb sunrise Sun-এর উপর প্রান্ত Standard সাধারণ almanac/দৃশ্যমান sunrise
Geometric center sunrise Sun center None Declared traditional/research profile
Apparent disc-center Center Standard Coordinate comparison
Twilight Sun center Defined depression Civil, nautical, astronomical twilight
Custom terrain rise Center/limb Chosen model বাস্তব পাহাড়/ভবনের horizon

দুটি profile-এর time না মিললেই কোনোটি ভুল নয়। ভুল হবে যদি profile প্রকাশ না করে শুধু “সূর্যোদয়” লেখা হয় অথবা upper-limb result-কে center/no-refraction result-এর সঙ্গে সরাসরি তুলনা করা হয়।

Latitude ও longitude কী বদলায়?

Longitude

Longitude মূলত local meridian-এর Earth-rotation phase বদলায়। কাছাকাছি latitude-এ eastward location-এ একই celestial geometry সাধারণত আগে ঘটে। আনুমানিক চার মিনিট প্রতি degree ধারণা useful হলেও sunrise-এর exact shift declination, latitude ও horizon crossing angle-এর ওপর নির্ভর করে।

Latitude

Latitude Sun/Moon-এর diurnal path horizon-কে কী angle-এ কাটবে তা বদলায়। উচ্চ latitude-এ:

  • দিনের দৈর্ঘ্যের seasonal পরিবর্তন বড় হয়;
  • Body horizon-কে shallow angle-এ অতিক্রম করতে পারে;
  • ছোট refraction বা altitude change বড় time shift তৈরি করতে পারে;
  • কখনও rise বা set event ঘটেই না;
  • Twilight সারারাত চলতে পারে।

Coordinate precision

City-center coordinate, observatory coordinate এবং user GPS coordinate এক নয়। Seconds-level result প্রকাশের আগে coordinate source ও precision যাচাই করুন। চার decimal degree প্রায় meter-level দাবি মনে হতে পারে, কিন্তু source যদি কেবল city centroid হয় তবে এত decimal বাস্তব accuracy বোঝায় না।

Observer elevation ও geometric horizon dip

উঁচু observer দূরের horizon দেখতে পান। Unobstructed sea horizon নিচে নেমে যায়; ফলে sunrise আগে এবং sunset পরে দেখা যেতে পারে। Spherical Earth approximation:

dip = arccos(R ÷ (R + h))

small-height approximation: dip ≈ √(2h ÷ R) radians

dip arcminutes ≈ 1.76 × √h, যখন h meter-এ

উদাহরণ হিসেবে ১০০ m elevation-এ ideal geometric dip প্রায় ১৭.৬ arcminute। কিন্তু এই formula তখনই meaningful যখন observer-এর সামনে সত্যিই দূরবর্তী নিচু horizon আছে। পাহাড়ের ওপর দাঁড়িয়েও সামনে আরেকটি উঁচু ridge থাকলে terrain horizon dip-কে বাতিল বা উল্টো করতে পারে।

Astronomical horizon বনাম বাস্তব terrain horizon

Standard almanac সাধারণত unobstructed astronomical horizon ধরে। বাস্তবে eastern horizon-এ পাহাড়, গাছ বা ভবন থাকলে দৃশ্যমান sunrise পরে হবে; western obstruction sunset আগে ঘটাবে। Terrain-aware calculation-এ একটি azimuth-dependent horizon mask দরকার:

effective altitude threshold = horizon altitude at event azimuth

event when apparent body altitude − effective threshold = 0

একটি scalar “horizon = 2°” পুরো দিগন্তের জন্য যথেষ্ট নয়। পূর্বে ৪° পাহাড় এবং পশ্চিমে ০° সমুদ্র থাকতে পারে। Horizon profile ideally azimuth–altitude pairs হিসেবে সংরক্ষণ করুন এবং interpolation করুন।

Digital elevation model-এর সীমা

  • DEM resolution ছোট ভবন/গাছ ধরতে পারে না;
  • Observer height ground elevation-এর সঙ্গে যোগ করতে হয়;
  • Earth curvature ও atmospheric bending model লাগতে পারে;
  • Near obstacle-এর angular height survey coordinate থেকে ভালো পাওয়া যায়;
  • Historical landscape বর্তমান terrain/building-এর মতো নাও ছিল।

Atmospheric refraction

Horizon-এর কাছে atmosphere আলো বাঁকিয়ে body-কে geometric অবস্থানের চেয়ে উপরে দেখায়। Standard sunrise convention-এ refraction গুরুত্বপূর্ণ; কিন্তু বাস্তব refraction temperature, pressure, humidity, vertical temperature gradient ও weather condition-এ বদলায়।

Common almanac convention-এ Sun-এর center-এর জন্য প্রায় 90°50′ true zenith distance নেওয়া হয়—প্রায় 34′ horizontal refraction এবং 16′ solar semidiameter-এর সমষ্টি। NOAA calculator আরেকটি standard approximation হিসেবে sunrise/sunset-এ 0.833° ব্যবহার করে। এগুলো observed atmosphere-এর guarantee নয়।

উচ্চ latitude-এ sensitivity

Body যদি horizon-কে steep angle-এ কাটে, altitude-এর সামান্য error দ্রুত অতিক্রম হয়। কিন্তু shallow crossing-এ একই angular error অনেক মিনিট time shift করতে পারে। তাই polar circle-এর কাছে standard refraction variation event তৈরি বা বিলুপ্তও করতে পারে।

Refraction disabled মানে কী?

No-refraction profile physical vacuum geometry দেয়। এটি “খারাপ calculation” নয়—কিন্তু visible sunrise নয়। Traditional rule engine যদি intentionally Sun center/no-refraction ব্যবহার করে, UI-তে সেই label রাখতে হবে এবং generic weather/almanac service-এর upper-limb apparent time-এর সঙ্গে পার্থক্য প্রত্যাশিত।

Disc center, upper limb ও lower limb

Sun ও Moon point object নয়। তাদের apparent angular radius আছে। Rise/set instant নির্ধারণে কোন অংশ horizon স্পর্শ করছে তা বলতে হবে:

Definition Rise ordering Set ordering
Upper limb সবার আগে দেখা যায় সবার শেষে অদৃশ্য হয়
Disc center Upper limb-এর পরে Upper-limb set-এর আগে
Lower limb পুরো disc ওঠার কাছাকাছি প্রথমে horizon ছোঁয়

Solar angular radius সামান্য বদলায়; lunar angular radius আরও বেশি বদলায়, কারণ Moon-এর geocentric distance উল্লেখযোগ্যভাবে পরিবর্তিত হয়। Fixed 16′ radius Moon-এর জন্য যথেষ্ট নয়।

Moonrise/Moonset কেন আরও কঠিন?

Moon পৃথিবীর খুব কাছে বলে observer location অনুযায়ী apparent position-এ বড় parallax হয়। Geocentric Moon center horizon-এ পৌঁছানোর সময় এবং topocentric apparent limb দেখা দেওয়ার সময় একই নয়। সঠিক moonrise calculation-এ সাধারণত দরকার:

  • Geocentric lunar ephemeris;
  • Observer-এর geodetic latitude, longitude ও elevation;
  • Topocentric parallax;
  • Moon-এর instantaneous distance ও semidiameter;
  • Atmospheric refraction profile;
  • Upper-limb/center definition;
  • Azimuth-dependent horizon;
  • Event search window, কারণ successive moonrises প্রায় ২৪ ঘণ্টার বেশি ব্যবধানে হতে পারে।

একটি civil date-এ moonrise field blank মানেই calculation failure নয়; event আগের বা পরের civil day-এ পড়তে পারে, অথবা high latitude-এ Moon সারাদিন horizon-এর এক পাশে থাকতে পারে। আপনার দৈনিক পঞ্জিকায় sunrise-to-next-sunrise window scan করার কারণও এটি।

আপনার পঞ্জিকার দুটি deliberate profile

এই প্রকল্পে পূর্বনির্ধারিত calculation profile:

Body Disc Refraction Purpose
Sun Center No refraction Declared traditional calculation boundary
Moon Apparent edge/limb Apparent/refraction profile Observed moonrise/moonset ordering

দুটি body-তে একই flag জোর করে ব্যবহার করার প্রয়োজন নেই; উদ্দেশ্য আলাদা হতে পারে। তবে report header-এ profile স্পষ্ট করুন—যেমন Sun: center/no-refraction · Moon: apparent limb। Comparison page-এ optional “civil apparent sunrise” পাশাপাশি দেখানো যেতে পারে, কিন্তু rule engine কোনটি ব্যবহার করেছে তা trace করতে হবে।

Swiss Ephemeris rise/set flags

swe_rise_trans()-এর mode bits দিয়ে rise/set, disc center এবং no-refraction নির্বাচন করা যায়। Wrapper অনুযায়ী নাম/constant binding যাচাই করুন:

int riseMode = SE_CALC_RISE;

// Project Sun profile: center, geometric, no refraction.
int sunMode = riseMode
    | SE_BIT_DISC_CENTER
    | SE_BIT_NO_REFRACTION;

// Apparent upper-limb profile: omit DISC_CENTER and NO_REFRACTION.
int apparentUpperLimbMode = riseMode;

Observer array সাধারণত longitude, latitude ও height in meters ধারণ করে। Longitude/latitude order এবং sign convention wrapper-এ নিশ্চিত করুন। Pressure/temperature parameters zero দিলে wrapper/library কী default নেয় তা documentation ও test দিয়ে যাচাই করুন; অনুমান করবেন না।

Event status-কে first-class result করুন

Rise/set function success/failure code ফিরিয়ে দিতে পারে। “No event in search interval”, “circumpolar”, “always below”, “invalid input” এবং engine error এক status-এ মিশিয়ে ফেলবেন না।

C#-এ explicit calculation profile

public enum DiscReference
{
    Center,
    UpperLimb,
    LowerLimb
}

public enum RefractionProfile
{
    None,
    Standard,
    MeasuredAtmosphere
}

public sealed class ObserverProfile
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
    public double ElevationMeters { get; set; }
    public double EyeHeightMeters { get; set; }
    public string CoordinateSource { get; set; }
}

public sealed class RiseSetProfile
{
    public DiscReference Disc { get; set; }
    public RefractionProfile Refraction { get; set; }
    public double PressureHpa { get; set; }
    public double TemperatureCelsius { get; set; }
    public bool ApplyGeometricHorizonDip { get; set; }
    public string HorizonProfileId { get; set; }
}

Geometric dip helper

static double HorizonDipDegrees(
    double observerHeightMeters,
    double earthRadiusMeters)
{
    if (observerHeightMeters < 0.0)
        throw new ArgumentOutOfRangeException("observerHeightMeters");
    if (earthRadiusMeters <= 0.0)
        throw new ArgumentOutOfRangeException("earthRadiusMeters");

    double ratio = earthRadiusMeters /
        (earthRadiusMeters + observerHeightMeters);
    double radians = Math.Acos(ratio);
    return radians * 180.0 / Math.PI;
}

Elevation above mean sea level এবং eye height above local ground আলাদা করুন। Sea-horizon geometry-তে total observer height দরকার হতে পারে; near terrain mask-এ eye height local obstacle angle-কে প্রভাবিত করে।

Horizon mask

public interface IHorizonProfile
{
    double GetAltitudeDegrees(double azimuthDegrees);
}

static double HorizonEventFunction(
    double bodyApparentAltitude,
    double bodyAzimuth,
    IHorizonProfile horizon)
{
    double obstruction = horizon.GetAltitudeDegrees(bodyAzimuth);
    return bodyApparentAltitude - obstruction;
}

Root solve-এর প্রতিটি iteration-এ altitude-এর সঙ্গে azimuth-ও পুনরায় হিসাব করুন। Event azimuth baseline থেকে নিয়ে fixed obstruction ব্যবহার করলে পাহাড়ি horizon-এ bias হতে পারে।

Result metadata

public sealed class RiseSetResult
{
    public string Body { get; set; }
    public string EventType { get; set; }
    public double JulianDayUt1 { get; set; }
    public DateTime LocalDisplayTime { get; set; }
    public double AzimuthDegrees { get; set; }
    public string Status { get; set; }
    public ObserverProfile Observer { get; set; }
    public RiseSetProfile Profile { get; set; }
    public string EngineVersion { get; set; }
}

Validation checklist

  1. Latitude range −90° to +90° validated;
  2. Longitude range and sign documented;
  3. Longitude/latitude argument order tested;
  4. Coordinate source recorded;
  5. Elevation unit is meters;
  6. Elevation datum documented;
  7. Eye height separated from ground elevation;
  8. Sea-level baseline test available;
  9. Horizon dip disabled/enabled comparison;
  10. 100 m dip sanity check;
  11. Flat horizon explicitly declared;
  12. Terrain mask identified by version;
  13. Horizon altitude varies with azimuth;
  14. Azimuth interpolation wraps at 0°/360°;
  15. Body altitude and azimuth recomputed per iteration;
  16. Sun center profile tested;
  17. Sun upper-limb profile tested;
  18. Moon limb profile tested;
  19. Lower-limb option separately tested;
  20. Refraction on/off comparison stored;
  21. Pressure unit validated;
  22. Temperature unit validated;
  23. Zero pressure behavior documented;
  24. Standard refraction profile versioned;
  25. Measured atmosphere missing-value policy defined;
  26. Solar semidiameter not double-applied;
  27. Lunar semidiameter is distance-dependent;
  28. Moon topocentric parallax enabled;
  29. Sun parallax/profile consistent;
  30. Geodetic/geocentric latitude conversion verified;
  31. UT1 input contract verified;
  32. ΔT not double-applied;
  33. Time zone applied after event solve;
  34. DST does not alter physical event instant;
  35. Search interval spans requested Vedic day;
  36. Moon event outside civil day handled;
  37. No-rise status distinguished;
  38. No-set status distinguished;
  39. Always-above status distinguished;
  40. Always-below status distinguished;
  41. Engine error not displayed as no event;
  42. High-latitude cases tested;
  43. Equatorial cases tested;
  44. Near-polar shallow crossing tested;
  45. Known USNO result compared with matching profile;
  46. NOAA comparison notes convention difference;
  47. Swiss flags written to audit trace;
  48. HTML profile label visible;
  49. XML/API observer metadata preserved;
  50. Regression snapshot includes engine/profile version।

সাধারণ ভুল ও সমাধান

ভুল ফল সমাধান
City name থেকে অজানা centroid Location-dependent time shift Coordinates ও source দেখান
Upper limb বনাম center না বলা Service comparison mismatch Disc profile label
Refraction default অনুমান কয়েক minute difference Explicit flag/parameters
Elevation দিলেই terrain ধরা হয়েছে মনে করা বাস্তব visible rise ভুল Horizon mask আলাদা
Moon-এর geocentric horizon crossing Large parallax error Topocentric Moon
Blank moonrise = engine failure ভুল error message Search-window/status analysis
Time zone দিয়ে sunrise solve Physical ও display layer মিশে যায় UT1 solve, পরে local display
দুটি ভিন্ন profile-এর ফল সরাসরি তুলনা False discrepancy Profile-normalized comparison

উপসংহার

সূর্যোদয় ও চন্দ্রোদয় কোনো শহরের স্থির property নয়; এগুলো নির্দিষ্ট observer, instant এবং horizon definition-এর ফল। Latitude body-এর daily path বদলায়, longitude local rotation phase বদলায়, elevation horizon dip সৃষ্টি করতে পারে এবং terrain সেই ideal horizon ঢেকে দিতে পারে।

Refraction ও limb convention apparent rise/set-এর অবিচ্ছেদ্য অংশ। Moon-এর ক্ষেত্রে topocentric parallax ও পরিবর্তনশীল semidiameter বিশেষভাবে গুরুত্বপূর্ণ। তাই একটি generic “sunrise” বা “moonrise” field-এর বদলে calculation profile সংরক্ষণ করা উচিত।

এই প্রকল্পে Sun center/no-refraction এবং Moon apparent limb profile deliberate ও traceable রাখা হলে traditional day boundary এবং observed moonrise—দুটি উদ্দেশ্য একসঙ্গে পূরণ করা যায়। ব্যবহারকারীও বুঝতে পারেন কেন অন্য weather site বা printed almanac-এর সঙ্গে কয়েক মিনিট পার্থক্য হয়েছে।

তথ্যসূত্র ও আরও পাঠ

  1. U.S. Naval Observatory—Rise, Set, and Twilight Definitions; horizon ও rise/set definitions.
  2. USNO—Astronomical Almanac Glossary; sunrise, moonrise, refraction ও semidiameter conventions.
  3. USNO—Rise/Set/Transit Times; observer height, flat horizon ও apparent-coordinate notes.
  4. NOAA/GML—Solar Calculator Details; 0.833° convention ও atmospheric variability.
  5. USNO—Sunrise and Sunset Near the Solstices; upper-limb/refraction definition ও seasonal geometry.
  6. Swiss Ephemeris Programmer’s Documentation; swe_rise_trans, disc-center ও no-refraction flags.

মন্তব্য, আলোচনা ও প্রশ্ন