![]()  | 
  
    SMILE
    v2.5
    
   Schwarzschild Modelling Interactive expLoratory Environment 
   | 
 
spherical-harmonic expansion of potential with coefficients being spline functions of radius More...
#include <potential.h>


Public Member Functions | |
| template<typename NumT > | |
| CPotentialSpline (size_t _Ncoefs_radial, size_t _Ncoefs_angular, const CPointMassSet< NumT > &points, SYMMETRYTYPE _sym=ST_TRIAXIAL, double smoothfactor=0, const vectord *_gridradii=NULL) | |
| init potential from N point masses with given assumed symmetry type, may also provide desired grid radii (otherwise assigned automatically)  | |
| CPotentialSpline (const vectord &_gridradii, const std::vector< vectord > &_coefs) | |
| init potential from stored SHE coefficients at given radii  | |
| CPotentialSpline (size_t _Ncoefs_radial, size_t _Ncoefs_angular, const CDensity *density, const vectord *_gridradii=NULL) | |
| init potential from analytic mass model, may also provide desired grid radii (if not given, assign automatically)  | |
| template<typename NumT > | |
| CPotentialSpline (size_t _Ncoefs_angular, const CPointMassSet< NumT > &points, const vectord *radii, std::vector< vectord > *coefsArray) | |
| not really a constructor, but a way to compute potential expansion coefficients for a set of discrete point masses at given radii.  More... | |
| virtual CPotential * | clone () const | 
| Return a pointer to a copy of this instance of potential.  More... | |
| virtual POTENTIALTYPE | PotentialType () const | 
| enumerable potential type  | |
| virtual const char * | PotentialName () const | 
| string representation of potential type  | |
| virtual double | Mass (const double r) const | 
| faster estimate of M(r) using l=0 terms only  | |
| size_t | getNcoefs_radial () const | 
| return the number of radial points in the spline (excluding r=0)  | |
| void | getCoefs (vectord *radii, std::vector< vectord > *coefsArray, bool useNodes=true) const | 
| compute SHE coefficients at given radii.  More... | |
  Public Member Functions inherited from smile::CPotentialSH | |
| CPotentialSH (size_t _Ncoefs_angular) | |
| virtual SYMMETRYTYPE | symmetry () const | 
| returns symmetry type of this potential  | |
| virtual double | Rho (double X, double Y, double Z, double t=0) const | 
| returns density at given coordinates, this should obviously be overriden in derivative classes  | |
| virtual double | Phi (double X, double Y, double Z, double t=0) const | 
| Return potential at a given spatial point (possibly a time-varying one).  More... | |
| virtual void | Force (const double xyz[N_DIM], const double t, double *force, double *forceDeriv=NULL) const | 
| common function for all derivative classes  | |
| size_t | getNcoefs_angular () const | 
| return l_max – the order of angular expansion  | |
  Public Member Functions inherited from smile::CDensity | |
| virtual double | totalMass () const | 
| returns estimated M(r=infinity) or -1 if mass is infinite  | |
| double | getRadiusByMass (const double m) const | 
| solves for Mass(r)=m  | |
| void | getRadiiByMass (const vectord &masses, vectord *radii) const | 
| solves for Mass(r)=m for an array of sorted values of m (more efficient than doing it one-by-one)  | |
| bool | checkMassMonotonic () const | 
| safety measure: check (roughly) that mass is increasing with radius  | |
| bool | checkDensityNonzero () const | 
| another safety measure: check that density doesn't drop to zero along any of three axes (important to assess spherical-harmonic approximation quality)  | |
| virtual double | getGamma () const | 
| returns inner density slope estimate (only used in BSE potential expansion for the automatic selection of shape parameter Alpha)  | |
Static Public Member Functions | |
| static const char * | myName () | 
Private Member Functions | |
| virtual void | computeSHCoefs (const double r, double coefsF[], double coefsdFdr[], double coefsd2Fdr2[]) const | 
| reimplemented function to compute the coefficients of angular expansion of potential at the given radius  | |
| void | checkSymmetry (const std::vector< vectord > &coefsArray) | 
| assigns symmetry class if some coefficients are (near-)zero.  More... | |
| void | initDefault () | 
| called as a default initialization when everything else fails  | |
| void | initSpline (const vectord &radii, const std::vector< vectord > &coefsArray) | 
| create spline objects for all non-zero spherical harmonics from the supplied radii and coefficients.  More... | |
| template<typename NumT > | |
| void | computeCoefsFromPoints (const CPointMassSet< NumT > &points, const vectord *srcradii, vectord *outradii, std::vector< vectord > *outcoefs) | 
| calculate (non-smoothed) spherical harmonic coefs for a discrete point mass set.  More... | |
| template<typename NumT > | |
| void | prepareCoefsDiscrete (const CPointMassSet< NumT > &points, double smoothfactor, const vectord *userradii) | 
| create smoothing splines from the coefficients computed at each particle's radius.  More... | |
| void | prepareCoefsAnalytic (const CDensity *density, const vectord *srcradii) | 
| compute expansion coefficients from an analytical mass profile.  More... | |
| void | coef0 (double r, double *val, double *der, double *der2) const | 
| evaluate value and optionally up to two derivatives of l=0 coefficient, taking into account extrapolation beyond the grid definition range and log-scaling of splines  | |
| void | coeflm (size_t lm, double r, double xi, double *val, double *der, double *der2, double c0val, double c0der=0, double c0der2=0) const | 
| evaluate value, and optionally first and second derivative of l>0 coefficients (lm is the combined index of angular harmonic >0); corresponding values for 0th coef must be known  | |
Private Attributes | |
| size_t | Ncoefs_radial | 
| number of radial coefficients (excluding the one at r=0)  | |
| vectord | gridradii | 
| defines nodes of radial grid in splines  | |
| double | minr | 
| double | maxr | 
| definition range of splines; extrapolation beyond this radius  | |
| double | gammain | 
| double | coefin | 
| slope and coef. for extrapolating potential inside minr (spherically-symmetric part, l=0)  | |
| double | gammaout | 
| double | coefout | 
| double | der2out | 
| slope and coef. for extrapolating potential outside maxr (spherically-symmetric part, l=0)  | |
| double | potcenter | 
| double | potmax | 
| double | potminr | 
| (abs.value) potential in the center (for transformation of l=0 spline), at the outermost spline node, and at 1st spline node  | |
| std::vector< gsl_spline * > | splines | 
| spline coefficients at each harmonic  | |
| vectord | slopein | 
| vectord | slopeout | 
| slope of coefs for l>0 for extrapolating inside rmin/outside rmax  | |
Additional Inherited Members | |
  Public Types inherited from smile::CDensity | |
| enum | POTENTIALTYPE {  PT_UNKNOWN, PT_DIRECT, PT_COMPOSITE, PT_COEFS, PT_NB, PT_BSE, PT_BSECOMPACT, PT_SPLINE, PT_CYLSPLINE, PT_LOG, PT_HARMONIC, PT_SCALEFREE, PT_SCALEFREESH, PT_SPHERICAL, PT_DEHNEN, PT_MIYAMOTONAGAI, PT_FERRERS, PT_PLUMMER, PT_ISOCHRONE, PT_PERFECTELLIPSOID, PT_NFW, PT_SERSIC, PT_EXPDISK, PT_ELLIPSOIDAL, PT_MGE }  | 
| list of all existing types of density or density/potential models, each of them implemented in its own class  More... | |
| enum | SYMMETRYTYPE {  ST_NONE = 0, ST_REFLECTION = 1, ST_PLANESYM = 2, ST_ZROTSYM = 4, ST_SPHSYM = 8, ST_TRIAXIAL = ST_REFLECTION | ST_PLANESYM, ST_AXISYMMETRIC = ST_TRIAXIAL | ST_ZROTSYM, ST_SPHERICAL = ST_AXISYMMETRIC | ST_SPHSYM, ST_DEFAULT = ST_TRIAXIAL }  | 
| Type of symmetry.  More... | |
  Protected Member Functions inherited from smile::CPotentialSH | |
| void | assignlmrange () | 
| assigns the above variables based on mysymmetry, should be called whenever mysymmetry has changed  | |
  Protected Attributes inherited from smile::CPotentialSH | |
| size_t | Ncoefs_angular | 
| l_max, the order of angular expansion (0 means spherically symmetric model)  | |
| SYMMETRYTYPE | mysymmetry | 
| may have different type of symmetry  | |
| int | lmax | 
| int | lstep | 
| int | mmin | 
| int | mmax | 
| int | mstep | 
| range of angular coefficients used for given symmetry  | |
spherical-harmonic expansion of potential with coefficients being spline functions of radius
| smile::CPotentialSpline::CPotentialSpline | ( | size_t | _Ncoefs_angular, | 
| const CPointMassSet< NumT > & | points, | ||
| const vectord * | radii, | ||
| std::vector< vectord > * | coefsArray | ||
| ) | 
not really a constructor, but a way to compute potential expansion coefficients for a set of discrete point masses at given radii.
| [in] | points | contains the source set of point masses; | 
| [in] | _Ncoefs_angular | is the order of angular expansion (l_max); | 
| [in] | radii | contains the array of radii at which the coefficients should be computed; | 
| [out] | coefsArray | contains the computed coefficients. Smoothing is not performed, splines are not initialized and the potential is not usable after this call! | 
      
  | 
  private | 
assigns symmetry class if some coefficients are (near-)zero.
called on an intermediate step after computing coefs but before initializing splines
      
  | 
  virtual | 
Return a pointer to a copy of this instance of potential.
A standard copy constructor or assignment is disabled because of different amount of data needed to be copied in different derived classes).
Implements smile::CPotential.
      
  | 
  private | 
calculate (non-smoothed) spherical harmonic coefs for a discrete point mass set.
| [in] | points | contains the positions and masses of particles that serve as the input. There are two modes of operation, depending on the content of "outradii" vector: | 
| [in] | srcradii | may contain user-defined set of radii to compute the expansion coefficients. | 
| [out] | outradii | points to an existing array to be filled with radial grid points. | 
| [out] | outcoefs | points to an existing 2d array that will contain computed coefficients. | 
| void smile::CPotentialSpline::getCoefs | ( | vectord * | radii, | 
| std::vector< vectord > * | coefsArray, | ||
| bool | useNodes = true  | 
        ||
| ) | const | 
compute SHE coefficients at given radii.
| [in] | useNodes | tells whether the radii in question are the original spline nodes (true) or user-specified radii (true); | 
| [in,out] | radii | if useNodes=true, this array is filled with spline nodes [output parameter, but must point to an existing array], otherwise the coefficients are computed at the supplied radii [input parameter]; | 
| [out] | coefsArray | is filled by the computed coefficients (must point to an existing array) | 
      
  | 
  private | 
create spline objects for all non-zero spherical harmonics from the supplied radii and coefficients.
radii should have "Ncoefs_radial" elements and coefsArray - "Ncoefs_radial * (Ncoefs_angular+1)^2" elements
      
  | 
  private | 
compute expansion coefficients from an analytical mass profile.
| [in] | density | is the density profile to be approximated | 
| [in] | srcradii | may contain the radial grid; if NULL then it is assigned automatically. | 
      
  | 
  private | 
create smoothing splines from the coefficients computed at each particle's radius.
| [in] | points | is the array of particle coordinates and masses | 
| [in] | userradii | may contain the radial grid to construct the splines; if it is NULL then the radial grid is constructed automatically taking into account the range of radii covered by source points. | 
| [in] | smoothfactor | determines how much smoothing is applied to the spline (good results are obtained for smoothfactor=1-2). | 
!!FIXME: what happens if the outermost pointRadius is < outerBinRadius ?
 1.8.8