B
    d(                 @   s|   d Z ddlmZ ddlZddlZddlmZm	Z	m
Z
mZ ddlmZ ddlmZ dd Zd	d
 Zdd Zdd Zdd ZdS )z
Code to use post-Newtonian equations [from Ajith, PRD 84, 084037 (2011), arXiv:1107.1267] to evolve spins in a binary black hole

P. Ajith, A. Gupta, and N. K. Johnson-McDaniel, 04.2016, based on earlier code
    )odeN)PIMTSUN_SIMSUN_SIGAMMA)log)normc       	   	   C   s   || }|| }|| || d  }| d | d|d  d| | d  | d|  |d  dt ||| |  | | |   | d dd| d  |d d	  d
| | d  d| | d |   |   S )zA Eqs.(3.8) of Ajith (2011) (http://arxiv.org/pdf/1107.1267v2.pdf)g       @g      @g      ?g      @g      @g      ?g      g      ?g      8@g      "@g      0@g       @)npdot)	vm1m2S1S2LnmZdeltameta r   g/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/lalinference/imrtgr/pneqns.pyOmega   s    r   c	             C   s  | |  }	|	|  }
|
|  }||  }||  }||  }||	 }d } } } } } } }}|dkrldd|  }|dkrdd| d  }|d	krd
| | d |dd| d    dt   }|dkrRdd| | d  d| | | d  |dd|    || d|d    |dd| d    d| d  d| | d  || dd|    }|dkr|| dd | d!   |dd"| d#  d$| | d!    d%t  d&  d'| t  d(  }|d)krd*d+| | d,  d-| | | d.  d/t  t  d  |d0d1t  t  d    d2t d3  }d4}|d krXd5t  d6 d7| t  d8  d9| | t  d:  }|| d;||	  ||
  ||  ||  ||td|    |  ||   S )<z@ Eqs.(3.2) of Ajith (2011) http://arxiv.org/pdf/1107.1267v2.pdf g        r   g      g      @@   g0ð@   g      @   q   g      (@gUUUUU"@g      3@g      @   gx/ @   g      H@g     x@gj@g      $@gUUUUUg      8@g      @g     5@g     @ii  g      b@g      >@   g~}-R@   g       @i  g      2@   i1  g      @   g       @   gzk\ik;  g      @ic  g     @@    g;c"p@i  i  g     @Z@gNN0@g   hmg     /Ag    p{@g     @g    @g     @g      ?)r   r   r   )r   r   deltachiadLchisdLchiasqrchissqr	chisdchiaorderZv2Zv3Zv4Zv5Zv6Zv7Zv9ZdEbF0ZdEbF2ZdEbF3ZdEbF4ZdEbF5ZdEbF6ZdEbF6LZdEbF7r   r   r   denergy_by_flux   s2           ,
z
X
\
0r)   c       &      C   s  |\
}}}}}}	}
}}}|| }|| }|| }|| || d  }|| ||  }t |||g}t |||g}t ||	|
g}|| }|| }|| d }|| d }t ||}t ||}t ||}t ||}t ||}||d  | dd|d  |d    }t||||||} t||||||}!t | |}"t |!|}#|"|#  | }$d|t||||||||d	  }%|%|"d |"d	 |"d |#d |#d	 |#d |$d |$d	 |$d g
S )
z The coupled set of ODEs containing the PN precession eqns as well as the evolution of dv/dt
	    All these equations are listed in Ajith (2011) (http://arxiv.org/pdf/1107.1267v2.pdf).
	r   g       @g      ?g      ?g      @g      r   r      )r	   arrayr
   r   crossr)   )&tZy_vecr   r   r   ZS1xZS1yZS1zZS2xZS2yZS2zZLxZLyZLzm1_sqrm2_sqrr   r   r"   r   r   r   Zchi1Zchi2Zchi_sZchi_ar#   r$   r&   r%   r'   ZLmagZOmega1ZOmega2ZdS1_dtZdS2_dtZdL_dtZdv_dtr   r   r   precession_eqns=   s4    ( r0   c       1      C   s`  d}d}d}d}d}d}d}|dk r,t d|dk r<t d	|d
 |d
  |d
  dkr`t d|d
 |d
  |d
  dkrt d|dk rt d|| }|| }| || || || || || || |	|
|g
}d}t||||}dt| d t||  t  |t |t |d t }d}d}d}tt}|j	|||d |
|| ||| g }g } || | | d}!d}"d}#x| rN|jd| k rN|!|krN|"dkrN|"|k rNt|#d |k rN|j|j| dd ||j | |j |j| }!t|j|j||| }"t|j| d
 |j| d
  |j| d
  }#qW t|}$t| }%|$j| d }&t|&| |kr|"dks|"|krtj|$ddd}$td|&||||"t|%|$d |||  nt d|'d t||t|#d |krt d|t|#d |$j\
}'}(})}*}+},}-}.}/}0|'|(| |)| |*| |+| |,| |-| |.|/|0f
S )zK evolve the spins and orb ang momentum according to the PN precession eqns.g-C6?g{Gz?g:0yE>r   r      	   zERROR: mass1 is negativezERROR: mass2 is negativer   g      ?z+ERROR: magnitude of spin1 is greater than 1z+ERROR: magnitude of spin2 is greater than 1zERROR: time step is negativeg        g       @g      @gư>Zdopri5)ZatolZrtolgh㈵>r*   )step)ZaxiszWarning: Integration stopped at v_max = {0}, more than {1} different from v_final = {2}, because dv/dt became negative or exceeded {3}, with a value of {4}. The final value used is {5}.zav_max = {0} is more than {1} different from v_final = {2} and dv/dt is positive and less than {3}zCnorm of Ln is more than {0:e} different from 1, with distance {1:e})
ValueErrorlalsimZ(SimInspiralTaylorF2ReducedSpinComputeChiZ'SimInspiralTaylorF2ReducedSpinChirpTimer   r   r   r   r0   Zset_integratorZset_initial_valueZset_f_paramsappendZ
successfulr-   absZ	integrateyr	   sqrtr+   TdeleteprintformatZdelta_vf)1v0r   r   chi1xchi1ychi1zchi2xchi2ychi2zLnxLnyLnzv_finaldtZdvdt_maxZdelta_vf_maxZdelta_Lnorm_maxZV_POSZLNX_POSZLNY_POSZLNZ_POSr.   r/   Zy_vec0t0Zchi_effZT_MAXZR_TOLZA_TOLbackendZsolverZy_resultZt_outputZ	v_currentZdvdt_currentZLnorm_currentYr-   Zv_lastv_vZS1x_vZS1y_vZS1z_vZS2x_vZS2y_vZS2z_vZLx_vZLy_vZLz_vr   r   r   evolve_spins_dtp   sp    06

L
6

,rO   c       $      C   sN  t d| ||||||||f	  t| |||||||||	|
|||\
}}}}}}}}}}t|d |d |d g}t|d |d |d g}t|d |d |d g}t|}t|}|t| }t||}t||}|||  }|||  } || }!|| }"t|| t|t|   }#t d|!|"|#f  t|!t|"t|#fS )zt given the spins and ang momentum at a given frequency, find the tilt and in-plane spin angles at a later frequency zav0 = %f, m1 = %f, m2 = %f, chi1x = %f, chi1y = %f, chi1z = %f, chi2x = %f, chi2y = %f, chi2z = %fr4   z.cos tilt1 = %f, cos tilt2 = %f, cos phi12 = %f)r=   rO   r	   r+   r   r
   Zarccos)$r?   r   r   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rN   Zchi1x_vZchi1y_vZchi1z_vZchi2x_vZchi2y_vZchi2z_vZLnx_vZLny_vZLnz_vZchi1_vZchi2_vZLn_vZ	chi1_normZ	chi2_normZchi1dL_vZchi2dL_vZchi1inplaneZchi2inplaneZ	cos_tilt1Z	cos_tilt2Z	cos_phi12r   r   r   find_tilts_and_phi12_at_freq   s"    6rP   )__doc__Zscipy.integrater   numpyr	   Zlalsimulationr6   Zlalr   r   r   r   r   Znumpy.linalgr   r   r)   r0   rO   rP   r   r   r   r   <module>   s   "3g