
    R1i7:                     >   d Z ddlmZmZmZ ddlmZmZ ddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" eez  Z#dd
Z$ G d de%      Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d Z.d dZ/d Z0d Z1d Z2d Z3d Z4d Z5d Z6d Z7d Z8y	)!z>Computation of osculating elements that matches NASA HORIZONS.   )dots	length_ofangle_between)DAY_Stau)GM_dict)DistanceAngleVelocity)reify    )arrayarctan2sinarctantaninfrepeatfloat64sinhsqrtarccosarctanh
zeros_like	ones_likedividewherepicrossNc                 L   |t        | j                  t              st        d      t	        j
                  | j                  d      }d| j                  cxk  xr dk  nc }|s#|t	        j
                  | j                  d      z  }|dk(  rt        d      |]t        |j                  | j                  j                              }t        |j                  | j                  j                              }n| j                  }| j                  }t        ||| j                  |      S )a  Produce the osculating orbital elements for a position.

    `position` is an instance of :class:`~skyfield.positionlib.ICRF`.
    These are commonly returned by the ``at()`` method of any
    Solar System body. ``reference_frame`` is an optional argument
    and is a 3x3 numpy array. The reference frame by default
    is the ICRF. Commonly used reference frames are found in
    skyfield.data.spice.inertial_frames. ``gm_km3_s2`` is an optional
    float argument representing the gravitational parameter (G*M) in
    units of km^3/s^2, which is the sum of the masses of the orbiting
    object and the object being orbited. If not specified, this is
    calculated for you.

    This function returns an instance of :class:`~skyfield.elementslib.OsculatingElements`

    zmSkyfield is unable to calculate a value for GM. You should specify one using the `gm_km3_s2` keyword argumentg        r   	   )
isinstancecenterint
ValueErrorr   gettargetr	   dotpositionaur   velocityau_per_dOsculatingElementst)r)   reference_frame	gm_km3_s2orbits_barycenterposition_vecvelocity_vecs         X/home/cursorai/projects/iching/venv/lib/python3.12/site-packages/skyfield/elementslib.pyosculating_elements_ofr5      s	   " (//3/ Q R RKK5	5A5 X__c::I> Q R R " 3 3H4E4E4H4H IJ 3 3H4E4E4N4N OP((((l*&jj') )    c                   L   e Zd ZdZd Zed        Zed        Zed        Zed        Z	ed        Z
ed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zd Zy)r-   a  One or more sets of osculating orbital elements.

    An ``OsculatingElements`` object can be initialized with the
    following parameters:

    position : Distance object
        Position vector with shape (3,) or (3, n)
    velocity : Velocity object
        Velocity vector with shape (3,) or (3, n)
    time: Time object
        The times of the position and velocity vectors
    mu_km_s: float
        Gravitational parameter (G*M) in units of km^3/s^2

    c                    |dk  rt        d      |j                  | _        |j                  | _        || _        || _        |t        z  | _        t        | j                  | j                  dd      j                  | _        t        | j                  | j                  | j                        | _        t        | j                        | _        y )Nr   zZ`mu_km_s` (the standard gravitational parameter in km^3/s^2) must be positive and non-zero)r%   km_pos_veckm_per_s_vel_vectime_mu_DAY_S_SQUARED_mu_km_dr   T_h_vececcentricity_vector_e_vecnode_vector_n_vec)selfr)   r+   r=   mu_km_ss        r4   __init__zOsculatingElements.__init__I   s    a< J K K ! ))	.0DMM4==!Q?AA)$--Q!$++.r6   c                 n    t        | j                  j                  | j                        }t	        |      S N)r9   )apoapsis_distancesemi_latus_rectumr9   eccentricityr	   )rG   Qs     r4   rL   z$OsculatingElements.apoapsis_distanceX   s*    d44779J9JK1~r6   c                     | j                   j                  }| j                  j                  }||z   t        z  }t	        |      S N)radians)argument_of_periapsisrR   true_anomalyr   r
   )rG   wvus       r4   argument_of_latitudez'OsculatingElements.argument_of_latitude]   s<    &&..%%qS#IQr6   c                     t        | j                  | j                  | j                  | j                        }t        |      S rQ   )rS   rF   rD   r:   r<   r
   )rG   rU   s     r4   rS   z(OsculatingElements.argument_of_periapsisd   s-    !$++t{{DMM4==YQr6   c                     t        | j                  j                  | j                  | j                  j
                        }t        |      S rQ   )eccentric_anomalyrT   rR   rN   rM   r9   r
   )rG   Es     r4   r[   z$OsculatingElements.eccentric_anomalyi   s?    d//77"//"44779 Qr6   c                 ,    t        | j                        S N)r   rD   rG   s    r4   rN   zOsculatingElements.eccentricityp   s    %%r6   c                 D    t        | j                        }t        |      S rQ   )inclinationrB   r
   )rG   is     r4   ra   zOsculatingElements.inclinationt   s    $Qr6   c                 n    t        | j                  j                  | j                        }t	        |      S rQ   )longitude_of_ascending_nodera   rR   rB   r
   )rG   Oms     r4   rd   z.OsculatingElements.longitude_of_ascending_nodey   s)    ()9)9)A)A4;;OR  r6   c                     | j                   j                  }| j                  j                  }||z   t        z  }t	        |      S rQ   )rd   rR   rS   r   r
   )rG   re   rU   lps       r4   longitude_of_periapsisz)OsculatingElements.longitude_of_periapsis~   s<    --55&&..1fc\R  r6   c                 n    t        | j                  j                  | j                        }t	        |      S rQ   )mean_anomalyr[   rR   rN   r
   )rG   Ms     r4   rj   zOsculatingElements.mean_anomaly   s+    //779J9JKQr6   c                     | j                   j                  | j                  j                  z   | j                  j                  z   t        z  }t        |      S rQ   )rd   rR   rS   rj   r   r
   )rG   Ls     r4   mean_longitudez!OsculatingElements.mean_longitude   sP    --55**223!!))*+./ Qr6   c                 |    t        | j                  j                  | j                        }t	        |t
        z        S rQ   )mean_motionsemi_major_axisr9   r>   r
   r   )rG   ns     r4   mean_motion_per_dayz&OsculatingElements.mean_motion_per_day   s0    ,,//"QuW%%r6   c                 n    t        | j                  j                  | j                        }t	        |      S rK   )periapsis_distancerM   r9   rN   r	   )rG   qs     r4   ru   z%OsculatingElements.periapsis_distance   s*    t5588$:K:KL1~r6   c                    t        | j                  j                  | j                  d      }t	        || j
                  j                  | j                  j                  | j                  j                  | j                        }| j                  j                  }| j                  j                  |z
  }|j                  |      S )NF)shift)jd)rj   r[   rR   rN   time_since_periapsisrs   rT   rM   r9   r@   r=   tstdb)rG   rk   tpr{   timess        r4   periapsis_timez!OsculatingElements.periapsis_time   s    ""**

 "$$,,%%""%%MM
 YY\\		"vvvr6   c                 h    t        | j                  j                  | j                        }|t        z  S r^   )periodrq   r9   r>   r   )rG   Ps     r4   period_in_daysz!OsculatingElements.period_in_days   s'    4''**DHH5wr6   c                 Z    t        | j                  | j                        }t        |      S rK   )rM   rB   r>   r	   )rG   ps     r4   rM   z$OsculatingElements.semi_latus_rectum   s     dkk48841~r6   c                 n    t        | j                  j                  | j                        }t	        |      S rK   )rq   rM   r9   rN   r	   )rG   as     r4   rq   z"OsculatingElements.semi_major_axis   *    D2255t7H7HI1~r6   c                 n    t        | j                  j                  | j                        }t	        |      S rK   )semi_minor_axisrM   r9   rN   r	   )rG   bs     r4   r   z"OsculatingElements.semi_minor_axis   r   r6   c                     t        | j                  | j                  | j                  | j                        }t        |      S rQ   )rT   rD   r:   r<   rF   r
   )rG   rV   s     r4   rT   zOsculatingElements.true_anomaly   s-    dmmT]]DKKPQr6   c                     | j                   j                  }| j                  j                  }| j                  j                  }||z   |z   t        z  }t        |      S rQ   )rd   rR   rS   rT   r   r
   )rG   re   rU   rV   ls        r4   true_longitudez!OsculatingElements.true_longitude   sR    --55&&..%%!VaZQr6   c                 `    dj                  | j                  j                  j                        S )Nz<Elements {0} sets>)formatr=   ttsizer_   s    r4   __repr__zOsculatingElements.__repr__   s!    $++DIILL,=,=>>r6   N)__name__
__module____qualname____doc__rI   r   rL   rX   rS   r[   rN   ra   rd   rh   rj   rn   rs   ru   r   r   rM   rq   r   rT   r   r    r6   r4   r-   r-   9   s   /               & &     ! ! ! !         & &
      "                ?r6   r-   c                 0    | t         z   t        z  t         z
  S r^   )r   r   )nums    r4   normpir      s    "Hc>Br6   c                     | j                   dk(  r%|dk  r| d|z   z  d|dz  z
  z  S t        t              S t        | d|z   z  d|dz  z
  t	        t        | j
                        |dk        S )Nr   r      ?outr   ndimr   r   r   r   shaper   es     r4   rL   rL      sg    vv{#$q5q!A#w!Q$:gcl:a1gqAv6#qww+?q'{SSr6   c                    | j                   dk(  rt        |      dk  ryt        |       dk  rCt        |d   |d         t        z  }t	        ||dd      j
                  d   dk\  r|S | t        z  S t        | |      }|d   dkD  r|S | t        z  S t        |d         }t        |       dk  }t        |      dk  }| |z  }t        |d   |   |d   |         t        z  }t	        |d d |f   |d d |f   dd      j
                  d   dk\  }	t        |	|| t        z        ||<   | | z  }t        | d d |f   |d d |f         }|d   |   dkD  }	t        |	|| t        z        ||<   |S )Nr   V瞯<r   r   )	r   r   r   r   r   rA   r   r   r   )
n_vece_vecpos_vecvel_vecanglerU   
equatorialcircularinds	conditions
             r4   rS   rS      s   zzQUe#u%E!HeAh/3E!'7Aq9;;A>!C5S%PSS "%/E!!HqL58ufSj8wqz"u%-
U#e+y#aa7;'!T'*GAtG,<aCEEaHAM		55&*5$y*$eAtGneAtGn=!HTNQ&		55&*5$r6   c                 0   |j                   dk(  rr|dk  r/dt        t        d|z
  d|z   z        t        | dz        z        z  S |dkD  r8t	        dt        t        | dz        t        |dz   |dz
  z        z        z        S yt        |      }|dk  }dt        t        d||   z
  d||   z   z        t        | |   dz        z        z  ||<   |dkD  }t	        dt        t        | |   dz        t        ||   dz   ||   dz
  z        z        z        ||<   |S Nr   r   r   )r   r   r   r   r   r   r   )rV   r   r   r\   r   s        r4   r[   r[     s    vv{q5VD!A#!-AaC8999U!GC!HT1Q31+->$>??@@qM!F41T7QqwY 783qwqy>IJJ$!73qwqy>$$	AdGAI7N2O#OPPQ$r6   c                     | dz  ||z  z  dk  }| j                   dk(  r$|rt        d| dz  ||z  z  z
        S t        d      S t        d| dz  ||z  z  z
  t        |       |      S )Nr   r   r   r   r   r   r   r   )hr   mur   s       r4   rN   rN   /  sl    Aqt!Ivv{(1tA1adO$AwqzAA1adOAiHHr6   c                 p    t        |       }t        |      }|dz  ||z  z
  | z  t        | |      |z  z
  |z  S Nr   )r   r   )r   r   r   rrV   s        r4   rC   rC   7  sC    'A'ATBqD['!D'$:7$BBBFFr6   c                 ~    t        t        | d         t        | d         t        | d         g      }t        | |      S )Nr   )r   r   r   r   )h_veck_vecs     r4   ra   ra   =  s;    :eAh'E!H)=yq?RSTE&&r6   c                     | j                   dk(  r*| dk7  rt        |d   |d          t        z  S t        d      S t        |d   |d    t	        |       | dk7        t        z  S )Nr   r   r   )r   r   r   r   r   )rb   r   s     r4   rd   rd   B  s`    vv{346wuQx%(+C/IwqzIuQx%(
1QTJ3NNr6   c                    |j                   dk(  rM|dk  r| |t        |       z  z
  t        z  S |dkD  r |t        |       z  | z
  }|rt	        |      S |S t        d      S t        |      }|dk  }| |   ||   t        | |         z  z
  t        z  ||<   |dkD  }|r(t	        ||   t        | |         z  | |   z
        ||<   |S ||   t        | |         z  | |   z
  ||<   |S )Nr   r   )r   r   r   r   r   r   r   )r\   r   rx   rk   r   s        r4   rj   rj   I  s    vv{q5#a&L#%%U$q'	AA %6!9,1,1:qM!T7QtWS4\1136$!QtWT!D']2QtW<=AdG  gd1T7m+ag5AdGr6   c                 6    t        |t        |       dz  z        S )N   )r   absr   r   s     r4   rp   rp   a  s    3q619r6   c                     t        | d    | d   t        | d         g      }t        |      }| j                  dk(  r|dk7  r||z  S |S t	        ||||dk7        S )Nr   r   r   )r   r   r   r   r   )r   r   rr   s      r4   rE   rE   e  se    E!H9eAh
58(<=>E%AzzQQ$uQw)E)eQEA66r6   c                     | j                   dk(  r|dk7  r| d|z
  z  d|dz  z
  z  S | dz  S t        | d|z
  z  d|dz  z
  | dz  |dk7        S Nr   r   r   r   )r   r   r   s     r4   ru   ru   o  s`    vv{%&Tq!A#w!AqD&!2qs2a1g!Q$QqS1==r6   c                     | j                   dk(  r,| dkD  rt        t        | dz  |z        z  S t        t              S t        t        | dz  |z  t        t        | j                        | dkD        z  S )Nr   r   r   )r   r   r   r   r   r   r   r   s     r4   r   r   v  s^    vv{$%aCs41R= 9WS\941RVC%91EEEr6   c                 $    t        |       dz  |z  S r   )r   )r   r   s     r4   rM   rM   }  s    UQr!!r6   c                     | j                   dk(  r|dk7  r| d|dz  z
  z  S t        t              S t        | d|dz  z
  t	        t        | j
                        |dk7        S r   r   r   s     r4   rq   rq     sV    vv{ !tq!ad(|55aQTvc177';1a4HHr6   c                 f   |j                   dk(  rF|dk  r| t        d|dz  z
        z  S |dkD  r| t        |dz  dz
        z  d|dz  z
  z  S t        d      S t        |      }|dk  }| |   t        d||   dz  z
        z  ||<   |dkD  }| |   t        ||   dz  dz
        z  d||   dz  z
  z  ||<   |S r   r   )r   r   r   r   s       r4   r   r     s    vv{q5T!ad(^##UT!Q$(^#q1a4x001:qM!D'$q1T7A:~..$!D'$qwzA~..!agqj.A$r6   c                 N   d}|j                   dk(  r;||k\  r| |z  S t        |dz        }t        d|dz  dz  z  |z        ||dz  dz  z   z  S ||k  }t        | |t	        |      |       }t        ||   dz        }t        d||   dz  dz  z  |z        ||dz  dz  z   z  ||<   |S )Ng_Kt=r   r   r   r   )r   r   r   r   r   )	rk   rr   rV   r   r   	too_smallD	parabolicr.   s	            r4   rz   rz     s     Ivv{	>Q3JAaCA1Q3(
2&AqDF
33]	1aZ]9*=)QAq|A~11"45q1a46zB)r6   c                    |j                   dk(  rt        |       dkD  r(t        | |      }t        ||      dkD  r|n	| t        z  }n]t        |      dk  r/t        |d   t        |      z        }|d   dk  r|n	| t        z  }n t        ||      }|d   dk\  r|n	| t        z  }t        |       dk  r|S t        |      S t        |d         }t        |       dk  }t        |      dk  }| }t        | d d |f   |d d |f         }t        |d d |f   |d d |f         dkD  }	t        |	|| t        z        ||<   ||z  }t        |d   |   t        |      |   z        }|d   |   dk  }	t        |	|| t        z        ||<   || z  }t        |d d |f   |d d |f         }|d   |   dk\  }	t        |	|| t        z        ||<   t        |       dkD  }t        ||         ||<   |S )Nr   r   r   r   r   )	r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   rV   r   r   r   r   s
             r4   rT   rT     s   ||qUe#!%1Egw/!3%Au%71:i&889E aeVCZA "%1E qufSjAe$g.q=F1I=wqz"e$U*&u,
yeAtGngag.>?'!T'*GAtG,<=A		55&*5$
"wqz$'	'(:4(@@AAJt$q(		55&*5$#eAtGngag.>?AJt$)		55&*5$)4/$r6   )NN)T)9r   	functionsr   r   r   	constantsr   r   data.gravitational_parametersr   unitsr	   r
   r   descriptorlibr   numpyr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r?   r5   objectr-   r   rL   rS   r[   rN   rC   ra   rd   rj   rp   rE   ru   r   rM   rq   r   rz   rT   r   r6   r4   <module>r      s    D 5 5 ! 2 , ,  % % % % % ()VW? W?rT<(IG'
O07>F"I(*&r6   