Exemplo n.º 1
0
def _EOM_dxdv(x,t,pot):
    """
    NAME:
       _EOM_dxdv
    PURPOSE:
       implements the EOM, i.e., the right-hand side of the differential 
       equation, for integrating phase space differences, rectangular
    INPUT:
       x - current phase-space position
       t - current time
       pot - (list of) Potential instance(s)
    OUTPUT:
       dy/dt
    HISTORY:
       2011-10-18 - Written - Bovy (NYU)
    """
    #x is rectangular so calculate R and phi
    R= nu.sqrt(x[0]**2.+x[1]**2.)
    phi= nu.arccos(x[0]/R)
    sinphi= x[1]/R
    cosphi= x[0]/R
    if x[1] < 0.: phi= 2.*nu.pi-phi
    #calculate forces
    Rforce= _evaluateplanarRforces(pot,R,phi=phi,t=t)
    phiforce= _evaluateplanarphiforces(pot,R,phi=phi,t=t)
    R2deriv= _evaluateplanarPotentials(pot,R,phi=phi,t=t,dR=2)
    phi2deriv= _evaluateplanarPotentials(pot,R,phi=phi,t=t,dphi=2)
    Rphideriv= _evaluateplanarPotentials(pot,R,phi=phi,t=t,dR=1,dphi=1)
    #Calculate derivatives and derivatives+time derivatives
    dFxdx= -cosphi**2.*R2deriv\
           +2.*cosphi*sinphi/R**2.*phiforce\
           +sinphi**2./R*Rforce\
           +2.*sinphi*cosphi/R*Rphideriv\
           -sinphi**2./R**2.*phi2deriv
    dFxdy= -sinphi*cosphi*R2deriv\
           +(sinphi**2.-cosphi**2.)/R**2.*phiforce\
           -cosphi*sinphi/R*Rforce\
           -(cosphi**2.-sinphi**2.)/R*Rphideriv\
           +cosphi*sinphi/R**2.*phi2deriv
    dFydx= -cosphi*sinphi*R2deriv\
           +(sinphi**2.-cosphi**2.)/R**2.*phiforce\
           +(sinphi**2.-cosphi**2.)/R*Rphideriv\
           -sinphi*cosphi/R*Rforce\
           +sinphi*cosphi/R**2.*phi2deriv
    dFydy= -sinphi**2.*R2deriv\
           -2.*sinphi*cosphi/R**2.*phiforce\
           -2.*sinphi*cosphi/R*Rphideriv\
           +cosphi**2./R*Rforce\
           -cosphi**2./R**2.*phi2deriv
    return nu.array([x[2],x[3],
                     cosphi*Rforce-1./R*sinphi*phiforce,
                     sinphi*Rforce+1./R*cosphi*phiforce,
                     x[6],x[7],
                     dFxdx*x[4]+dFxdy*x[5],
                     dFydx*x[4]+dFydy*x[5]])
Exemplo n.º 2
0
 def E(self, *args, **kwargs):
     """
     NAME:
        E
     PURPOSE:
        calculate the energy
     INPUT:
        pot=
        t= time at which to evaluate E
     OUTPUT:
        energy
     HISTORY:
        2010-09-15 - Written - Bovy (NYU)
     """
     if not 'pot' in kwargs or kwargs['pot'] is None:
         try:
             pot = self._pot
         except AttributeError:
             raise AttributeError("Integrate orbit or specify pot=")
         if 'pot' in kwargs and kwargs['pot'] is None:
             kwargs.pop('pot')
     else:
         pot = kwargs.pop('pot')
     if isinstance(pot, Potential):
         thispot = toPlanarPotential(pot)
     elif isinstance(pot, list):
         thispot = []
         for p in pot:
             if isinstance(p, Potential):
                 thispot.append(toPlanarPotential(p))
             else:
                 thispot.append(p)
     else:
         thispot = pot
     if len(args) > 0:
         t = args[0]
     else:
         t = 0.
     #Get orbit
     thiso = self(*args, **kwargs)
     onet = (len(thiso.shape) == 1)
     if onet:
         return _evaluateplanarPotentials(thispot,thiso[0],
                                         phi=thiso[3],t=t)\
                                         +thiso[1]**2./2.\
                                         +thiso[2]**2./2.
     else:
         return nu.array([_evaluateplanarPotentials(thispot,thiso[0,ii],
                                                   phi=thiso[3,ii],
                                                   t=t[ii])\
                              +thiso[1,ii]**2./2.\
                              +thiso[2,ii]**2./2. for ii in range(len(t))])
Exemplo n.º 3
0
 def E(self,*args,**kwargs):
     """
     NAME:
        E
     PURPOSE:
        calculate the energy
     INPUT:
        pot=
        t= time at which to evaluate E
     OUTPUT:
        energy
     HISTORY:
        2010-09-15 - Written - Bovy (NYU)
     """
     if not 'pot' in kwargs or kwargs['pot'] is None:
         try:
             pot= self._pot
         except AttributeError:
             raise AttributeError("Integrate orbit or specify pot=")
         if 'pot' in kwargs and kwargs['pot'] is None:
             kwargs.pop('pot')          
     else:
         pot= kwargs.pop('pot')
     if isinstance(pot,Potential):
         thispot= toPlanarPotential(pot)
     elif isinstance(pot,list):
         thispot= []
         for p in pot:
             if isinstance(p,Potential): thispot.append(toPlanarPotential(p))
             else: thispot.append(p)
     else:
         thispot= pot
     if len(args) > 0:
         t= args[0]
     else:
         t= 0.
     #Get orbit
     thiso= self(*args,**kwargs)
     onet= (len(thiso.shape) == 1)
     if onet:
         return _evaluateplanarPotentials(thispot,thiso[0],
                                         phi=thiso[3],t=t)\
                                         +thiso[1]**2./2.\
                                         +thiso[2]**2./2.
     else:
         return nu.array([_evaluateplanarPotentials(thispot,thiso[0,ii],
                                                   phi=thiso[3,ii],
                                                   t=t[ii])\
                              +thiso[1,ii]**2./2.\
                              +thiso[2,ii]**2./2. for ii in range(len(t))])
Exemplo n.º 4
0
def potentialAxi(R,pot,vc=1.,ro=1.):
    """
    NAME:
       potentialAxi
    PURPOSE:
       return the potential
    INPUT:
       R - Galactocentric radius (/ro)
       pot - potential
       vc - circular velocity
       ro - reference radius
    OUTPUT:
       Phi(R)
    HISTORY:
       2010-11-30 - Written - Bovy (NYU)
    """
    return _evaluateplanarPotentials(pot,R)