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

Topocentric ও Geocentric Position: Moon, Parallax ও Panchanga-তে কোনটি ব্যবহার করবেন?

Geocentric ও topocentric position-এর পার্থক্য, lunar parallax, তিথি-নক্ষত্রে geocentric longitude এবং rise/set-এ observer-dependent position ব্যবহারের production guide।

Geocentric এবং topocentric—দুটিই বৈধ position। পার্থক্য হলো observer কোথায় বসানো হয়েছে। Earth-এর কেন্দ্র থেকে দেখা direction একরকম, আর ঢাকা, কলকাতা বা নিউইয়র্কে Earth-এর surface থেকে দেখা direction সামান্য অন্যরকম। কাছের Moon-এর ক্ষেত্রে এই difference বড়; দূরের planet-এর ক্ষেত্রে সাধারণত ছোট।

Geocentric ও topocentric: দুটি coordinate origin

Geocentric position

Geocentric coordinate-এ ideal observer-কে Earth-এর center-এ ধরা হয়। Sun, Moon ও planet-এর longitude, latitude, right ascension বা declination একটি common Earth-centered origin থেকে প্রকাশ করা যায়। ফলে পৃথিবীর সব শহরের জন্য একই instant-এ একই geocentric ecliptic longitude পাওয়া উচিত—অবশ্য engine, ephemeris, time scale, reference frame ও correction flags একই হলে।

Topocentric position

Topocentric coordinate-এ origin হলো Earth-এর surface-এ নির্দিষ্ট observer। তাই latitude, longitude এবং elevation প্রয়োজন। JPL Solar System Dynamics glossary-ও topocentric system-কে পৃথিবীর একটি নির্দিষ্ট location-কেন্দ্রিক reference system হিসেবে সংজ্ঞায়িত করে।

একই UTC instant-এ ঢাকা ও নিউইয়র্কের observer Earth-এর কেন্দ্রের দুই ভিন্ন দিকে অবস্থান করেন। তাদের line of sight কাছের object-এর দিকে parallel নয়। ফলে apparent celestial direction বদলে যায়। এই effect-ই diurnal বা topocentric parallax-এর মূল।

বিষয় Geocentric Topocentric
Origin Earth-এর center Observer-এর location
Location input Position-এর জন্য লাগে না Latitude, longitude, height লাগে
একই instant-এ city পরিবর্তন Longitude অপরিবর্তিত Direction পরিবর্তিত
Moon-এ difference Common phase geometry বিশেষত horizon-এর কাছে বড়
প্রধান ব্যবহার তিথি, নক্ষত্র, যোগ, planetary longitude Rise/set, altitude/azimuth, local eclipse

Parallax কী?

একটি কাছের object-কে দুই ভিন্ন স্থান থেকে দেখলে background-এর তুলনায় তার direction বদলে যায়। Earth-এর center এবং surface observer—এই দুই viewpoint-এর angular difference হলো topocentric parallax। Object যত কাছে, parallax তত বড়।

Horizontal parallax হলো এমন একটি standard angle, যখন body observer-এর astronomical horizon-এ থাকে। সরল spherical approximation:

horizontal parallax = asin(Earth radius ÷ geocentric distance)

π = asin(REarth ÷ Δ)

এটি full coordinate conversion নয়; concept বোঝার approximation। Accurate calculation-এ oblate Earth, geodetic latitude, observer elevation, sidereal time এবং three-dimensional vector ব্যবহার করা হয়।

Horizon-এর কাছে effect বেশি কেন?

Observer-এর displacement vector line of sight-এর perpendicular হলে angular shift সর্বাধিক। Body horizon-এর কাছে থাকলে surface observer ও Earth center-এর viewpoint difference প্রায় সর্বোচ্চ হয়। Zenith-এর কাছে একই displacement মূলত distance বদলায়, direction কম বদলায়।

Moon-এর ক্ষেত্রে বিষয়টি এত গুরুত্বপূর্ণ কেন?

Moon পৃথিবীর সবচেয়ে কাছের প্রধান celestial body। তার geocentric distance প্রায় 60 Earth radii-এর order-এ; তাই horizontal parallax প্রায় এক degree-এর কাছাকাছি হতে পারে। এটি Moon-এর apparent diameter-এর চেয়েও বড় হতে পারে।

ফলে Moon-এর geocentric altitude zero হলেই surface observer-এর জন্য moonrise হয়েছে—এমন নয়। Rise/set solver-কে topocentric direction, selected limb, lunar semidiameter এবং refraction profile বিচার করতে হয়। Moon-এর distance orbit জুড়ে বদলায় বলে parallax ও angular diameter-ও বদলায়।

Sun ও planet-এর ক্ষেত্রে

Sun-এর finite distance-এর কারণে solar parallax আছে, কিন্তু Moon-এর তুলনায় অনেক ছোট। Planet-এর topocentric correction তাদের distance অনুযায়ী বদলায়; অধিকাংশ সাধারণ Panchanga longitude-এ effect ক্ষুদ্র হলেও precise horizon, occultation বা eclipse কাজে তা প্রাসঙ্গিক। “Moon ছাড়া কারও parallax নেই” বলা যেমন ভুল, তেমনি সব body-তে effect সমান বলা আরও ভুল।

Origin এবং apparent/true একই প্রশ্ন নয়

একটি position বর্ণনা করতে একাধিক স্বাধীন decision লাগে। Geocentric বনাম topocentric শুধু origin ঠিক করে। নিচের প্রশ্নগুলো আলাদা:

  • Geocentric, topocentric, heliocentric না barycentric?
  • Tropical না sidereal/nirayana zodiac?
  • Geometric/true না apparent?
  • Mean equinox না true equinox of date?
  • Ecliptic না equatorial coordinates?
  • Center of body না visible limb?
  • Refraction included না excluded?

তাই “topocentric = apparent” নয়। Topocentric geometric এবং topocentric apparent—দুটিই সম্ভব। একইভাবে geocentric apparent ও geocentric astrometric position-ও সম্ভব। USNO-র geocentric service apparent ও astrometric position আলাদাভাবে দেয়; topocentric service observer-dependent right ascension/declination বা zenith distance/azimuth দেয়।

Panchanga-তে কোন calculation কোন origin ব্যবহার করবে?

ফল প্রধান position/origin Location কোথায় লাগে?
তিথি Geocentric Sun–Moon nirayana elongation Sunrise instant ও local display-এ
করণ Geocentric elongation-এর 6° অংশ Day-rule evaluation instant-এ
নক্ষত্র Geocentric nirayana Moon longitude Sunrise/selected instant-এ
যোগ Geocentric nirayana Sun + Moon longitude Evaluation instant-এ
গ্রহস্ফুট/রাশি সাধারণত geocentric nirayana longitude Instant conversion-এ
সূর্যোদয়/সূর্যাস্ত Declared horizon profile; সাধারণ astronomy-তে topocentric apparent Lat/lon/height/horizon অপরিহার্য
চন্দ্রোদয়/চন্দ্রাস্ত Topocentric Moon + limb/refraction profile Lat/lon/height অপরিহার্য
লগ্ন ও ভাব Local horizon/meridian ও sidereal rotation Latitude, longitude ও time অপরিহার্য
Local solar eclipse contacts Topocentric Sun–Moon apparent geometry Observer location অপরিহার্য

এই table default engineering policy। কোনো বিশেষ শাস্ত্রীয় বা আঞ্চলিক প্রথা অন্য সংজ্ঞা নিলে সেটি আলাদা named calculation profile হিসেবে লিখতে হবে। Silent flag change করা উচিত নয়।

তিথি-at-sunrise: একই গণনায় দুই reference

এই অংশেই implementation error বেশি হয়। “সূর্যোদয়ের তিথি” বের করতে দুটি স্বতন্ত্র calculation লাগে:

  1. নির্দিষ্ট শহরের sunrise instant নির্ণয় করুন—এটি observer-dependent event;
  2. সেই UTC/TT instant-এ geocentric Sun ও Moon longitude দিয়ে elongation গণনা করুন;
  3. Elongation-কে 12° ভাগে ভাগ করে তিথি নির্ণয় করুন;
  4. প্রয়োজন হলে আগের/পরের boundary solve করে end time local zone-এ দেখান।

sunrise = TopocentricEvent(date, observer, sunriseProfile)

elongation = Normalize(MoonGeo(sunrise) − SunGeo(sunrise))

tithi = floor(elongation ÷ 12°) + 1

Location এখানে তিথির longitude definition বদলায় না; location sunrise-এর instant বদলায়। ঢাকা ও নিউইয়র্কে একই civil date-এর sunrise আলাদা UTC instant-এ ঘটে, তাই geocentric elongation-ও ওই দুটি instant-এ আলাদা। এভাবেই local Panchanga result বদলায়—Moon longitude-কে জোর করে topocentric না করেও।

Rise/set, altitude–azimuth ও visibility

Rise/set হলো local horizon crossing। তাই observer-এর position ছাড়া এর physical অর্থ অসম্পূর্ণ। সাধারণ astronomical moonrise calculation-এ প্রয়োজন হতে পারে:

  • Topocentric apparent right ascension ও declination;
  • Local apparent sidereal time;
  • Observer-এর geodetic latitude, longitude ও elevation;
  • Moon-এর distance-dependent semidiameter;
  • Atmospheric refraction;
  • Upper limb, center বা lower limb convention;
  • Terrain horizon বা horizon altitude mask।

অন্যদিকে কোনো traditional profile Sun center, no refraction এবং geocentric latitude ignored ধরনের convention নিতে পারে। Swiss Ephemeris-এ Hindu rising-এর জন্য বিশেষ flag combination-ও document করা আছে। কাজেই “rise/set সব সময় topocentric apparent upper limb” বলা যাবে না; বরং profile name ও flags প্রকাশ করতে হবে।

Eclipse: global geometry ও local circumstances

Solar eclipse-এর global path নির্ণয়ে Earth–Moon–Sun-এর বৃহৎ-scale geometry দরকার। কিন্তু কোনো শহরে eclipse দেখা যাবে কি না, contact কখন হবে, Sun-এর altitude কত থাকবে—এসব local circumstances topocentric। USNO-র Solar Eclipse Computer local maximum ও contact খুঁজতে Sun ও Moon-এর topocentric position iteratively গণনা করে।

Lunar eclipse-এ Moon পৃথিবীর shadow-তে প্রবেশ করে; global phase times geocentric geometry-তে নির্ণীত হতে পারে। কিন্তু নির্দিষ্ট location-এ Moon তখন horizon-এর ওপরে কি না, moonrise-এর আগে না পরে—এটি topocentric/local horizon প্রশ্ন।

Occultation ও close conjunction

Moon কোনো star বা planet ঢেকে দেবে কি না তা observer location-এ অত্যন্ত sensitive। Geocentric close approach দেখে occultation ঘোষণা করা যাবে না। একই event এক শহরে occultation, অন্য শহরে near miss হতে পারে।

Swiss Ephemeris-এ safe implementation

Swiss Ephemeris documentation অনুযায়ী topocentric planet position চাইলে প্রথমে swe_set_topo(longitude, latitude, altitude) call করতে হয়, তারপর calculation flag-এ SEFLG_TOPOCTR যোগ করতে হয়। Longitude ও latitude degree-এ, altitude meter-এ।

// Topocentric position — conceptual C# wrapper
lock (SwissGlobalStateLock)
{
    swe_set_topo(observer.LongitudeDeg,
                 observer.LatitudeDeg,
                 observer.HeightMeters);

    int flags = SEFLG_SWIEPH
              | SEFLG_SPEED
              | SEFLG_TOPOCTR;

    return swe_calc_ut(jdUt, body, flags, values, error);
}

শুধু swe_set_topo call করলেই calculation topocentric হয় না; flag-ও লাগবে। আবার flag থাকলেও observer set না করলে intended location নিশ্চিত হয় না। Documentation আরও জানায়, swe_set_topo-তে set করা parameters swe_close()-এর পরেও থাকে। তাই shared web application-এ global mutable state race condition তৈরি করতে পারে।

Thread safety ও state leakage

  • প্রতিটি topocentric call-এর আগে observer explicitly set করুন;
  • Global native state থাকলে lock বা isolated engine instance ব্যবহার করুন;
  • এক user-এর Dhaka observer যেন পরের user-এর New York calculation-এ থেকে না যায়;
  • Geocentric method-এ SEFLG_TOPOCTR কখনো inherited flag হিসেবে রাখবেন না;
  • Returned flags inspect করুন—library incompatible flag বাদ দিতে পারে;
  • Audit trace-এ origin, flags, coordinates ও ephemeris লিখুন।

swe_rise_trans

swe_rise_trans observer-এর longitude, latitude ও height-এর geopos array গ্রহণ করে। Pressure, temperature, disc-center এবং no-refraction options rise/set definition বদলায়। অতএব position method-এর SEFLG_TOPOCTR flag এবং rise/set method-এর geopos/rsmi options-কে এক জিনিস মনে করবেন না।

C# engine-এ origin type-safe করুন

একটি generic GetLongitude() method-এর optional boolean flag পরে ভুলের উৎস হয়। Origin, zodiac এবং correction profile স্পষ্ট type-এ রাখুন:

public enum PositionOrigin
{
    Geocentric,
    Topocentric
}

public sealed class CoordinateProfile
{
    public PositionOrigin Origin { get; set; }
    public bool Sidereal { get; set; }
    public bool Apparent { get; set; }
    public string AyanamsaId { get; set; }
    public string Purpose { get; set; }
}

public static CoordinateProfile PanchangaLongitude()
{
    return new CoordinateProfile
    {
        Origin = PositionOrigin.Geocentric,
        Sidereal = true,
        Apparent = true,
        AyanamsaId = "DeclaredProjectAyanamsa",
        Purpose = "Tithi/Nakshatra/Karana/Yoga"
    };
}

public static CoordinateProfile LocalHorizon()
{
    return new CoordinateProfile
    {
        Origin = PositionOrigin.Topocentric,
        Sidereal = false,
        Apparent = true,
        Purpose = "Rise/Set/Altitude/Azimuth"
    };
}

Guard clause

static void RequirePanchangaOrigin(CoordinateProfile profile)
{
    if (profile == null || profile.Origin != PositionOrigin.Geocentric)
        throw new InvalidOperationException(
            "Panchanga longitude must use the declared geocentric profile.");
}

static void RequireObserver(CoordinateProfile profile, Observer observer)
{
    if (profile.Origin == PositionOrigin.Topocentric && observer == null)
        throw new ArgumentNullException("observer");
}

Horizontal parallax diagnostic

static double HorizontalParallaxDegrees(
    double geocentricDistanceKm,
    double earthRadiusKm = 6378.137)
{
    if (geocentricDistanceKm <= earthRadiusKm)
        throw new ArgumentOutOfRangeException("geocentricDistanceKm");

    return Math.Asin(earthRadiusKm / geocentricDistanceKm)
         * 180.0 / Math.PI;
}

এই diagnostic result production topocentric longitude-এর বিকল্প নয়। এটি distance/units ভুল ধরতে useful। Distance যদি AU-তে আসে কিন্তু km মনে করে formula-তে পাঠানো হয়, result সম্পূর্ণ অবাস্তব হবে।

Result metadata

public sealed class CalculatedPosition
{
    public DateTime UtcInstant { get; set; }
    public int BodyId { get; set; }
    public PositionOrigin Origin { get; set; }
    public double LongitudeDeg { get; set; }
    public double LatitudeDeg { get; set; }
    public double DistanceAu { get; set; }
    public string ReferenceFrame { get; set; }
    public string Flags { get; set; }
    public Observer Observer { get; set; } // null for geocentric
}

HTML, XML ও API-তে শুধু angle না দিয়ে অন্তত origin, zodiac, ayanamsa, instant এবং applicable observer metadata রাখুন। এতে ভবিষ্যতে mismatch trace করা সহজ হবে।

Validation checklist

  1. Geocentric longitude city পরিবর্তনে অপরিবর্তিত থাকে;
  2. Topocentric Moon position city পরিবর্তনে বদলায়;
  3. একই instant সব comparison-এ ব্যবহৃত হয়;
  4. UTC ও TT conversion একবারই হয়;
  5. Topocentric flag geocentric path-এ leak করে না;
  6. প্রতি topocentric call-এর আগে observer set হয়;
  7. Longitude east-positive convention যাচাই করা হয়;
  8. Latitude north-positive convention যাচাই করা হয়;
  9. Altitude meter-এ পাঠানো হয়;
  10. Distance AU বনাম km unit test আছে;
  11. Moon near horizon test করা হয়;
  12. Moon near zenith test করা হয়;
  13. Perigee ও apogee distance cases test করা হয়;
  14. Dhaka ও New York-এর একই UTC instant compare করা হয়;
  15. Tithi method geocentric Sun ও Moon দুটিই ব্যবহার করে;
  16. Nakshatra method geocentric nirayana Moon ব্যবহার করে;
  17. Yoga method একই origin-এর Sun ও Moon যোগ করে;
  18. Karana method geocentric elongation ভাগ করে;
  19. Sunrise instant location-dependent solver থেকে আসে;
  20. Sunrise-এর পরে Panchanga angle সেই exact instant-এ evaluate হয়;
  21. Moonrise topocentric position ব্যবহার করে;
  22. Lunar semidiameter double-applied হয় না;
  23. Refraction on/off profile আলাদা থাকে;
  24. Disc center/upper limb option trace-এ থাকে;
  25. Terrain horizon standard horizon থেকে পৃথক;
  26. Rise/set no-event status engine error থেকে পৃথক;
  27. Solar eclipse local contact topocentric test আছে;
  28. Lunar eclipse visibility horizon দিয়ে test হয়;
  29. Occultation city-to-city difference test করা হয়;
  30. Geocentric apparent বনাম astrometric label পৃথক;
  31. Tropical বনাম sidereal flag পৃথক;
  32. Ayanamsa topocentric correction-এর সঙ্গে গুলিয়ে যায় না;
  33. Reference-frame metadata result-এ থাকে;
  34. Returned Swiss flags যাচাই করা হয়;
  35. Shared native state concurrent-request test করা হয়;
  36. Dhaka request-এর state New York request-এ leak করে না;
  37. Cache key-তে origin ও observer থাকে;
  38. Geocentric cache location-independent রাখা হয়;
  39. Topocentric cache location/profile-dependent রাখা হয়;
  40. Rounded display value থেকে boundary solve করা হয় না;
  41. Boundary-এর দুই পাশে raw value test করা হয়;
  42. USNO topocentric result matching profile-এ compare করা হয়;
  43. Swiss Ephemeris version metadata-তে থাকে;
  44. API field-এ origin প্রকাশিত হয়;
  45. XML export observer profile preserve করে;
  46. Printed report method label দেখায়;
  47. Regression snapshot একই flags দিয়ে তৈরি হয়;
  48. Historical calculation-এ location availability নথিবদ্ধ হয়;
  49. Custom traditional sunrise profile আলাদা নামে থাকে;
  50. Mismatch report-এ instant, origin, flags ও units একসঙ্গে লেখা হয়।

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

ভুল ফল সমাধান
সব local result-এ topocentric longitude তিথি/নক্ষত্রের standard definition বদলে যায় Event instant ও Panchanga angle আলাদা করুন
Moonrise-এ geocentric Moon Parallaxজনিত বড় time error Topocentric horizon solver
Topocentric flag state leak User/location অনুযায়ী অনিয়মিত result Lock, explicit flags ও typed methods
Topocentric = apparent ধরে নেওয়া Correction profile অস্পষ্ট Origin ও apparent/true পৃথক fields
AU-কে km হিসেবে ব্যবহার অবাস্তব parallax Strong unit types ও validation
Sunrise time round করে তিথি evaluate Boundary-এর কাছে ভুল দিন Raw instant দিয়ে calculation
Local eclipse geocentric contact Visibility/contact mismatch Topocentric local circumstances
Method না লিখে angle প্রকাশ Research comparison অসম্ভব Origin/frame/flags metadata

উপসংহার

Geocentric ও topocentric result-এর মধ্যে কোনোটি স্বয়ংক্রিয়ভাবে বেশি “সত্য” নয়। তারা ভিন্ন প্রশ্নের উত্তর দেয়। Earth-centered phase relationship জানতে geocentric position উপযুক্ত; নির্দিষ্ট observer আকাশে কোথায় body দেখবেন জানতে topocentric position দরকার।

Panchanga-তে তিথি, করণ, নক্ষত্র ও যোগের core angular definitions সাধারণত geocentric nirayana longitude-নির্ভর। কিন্তু কোন তিথি স্থানীয় সূর্যোদয়ে উপস্থিত, কখন Moon উঠবে, কোনো eclipse দেখা যাবে কি না বা local contact কখন—এসবের event layer observer-dependent।

সুতরাং reliable architecture হলো: প্রথমে location অনুযায়ী event instant নির্ণয়, তারপর প্রতিটি Panchanga quantity তার declared coordinate profile-এ evaluate করা। Origin, frame, flags ও observer metadata স্পষ্ট রাখলে একদিকে traditional rule অক্ষুণ্ণ থাকে, অন্যদিকে আধুনিক local astronomy-ও যথাযথ হয়।

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

  1. NASA/JPL Solar System Dynamics—Topocentric; observer-centered reference system-এর সংজ্ঞা।
  2. U.S. Naval Observatory—Topocentric Positions; observer location, height, right ascension/declination, zenith distance ও azimuth।
  3. U.S. Naval Observatory—Geocentric Positions; geocentric apparent ও astrometric position এবং center-of-Earth distance।
  4. U.S. Naval Observatory—Solar Eclipse Computer; local circumstances-এ topocentric Sun–Moon position ও contact iteration।
  5. Swiss Ephemeris Programmer’s Documentation; swe_set_topo, SEFLG_TOPOCTR এবং swe_rise_trans।

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