예제 #1
0
파일: Table.cpp 프로젝트: DJPapale/GalSim
 Table<V,A>::Table(const std::vector<A>& aa, const std::vector<V>& vv, interpolant in) : 
     iType(in), isReady(false)
 {
     v.reserve(aa.size());
     if (vv.size() != aa.size()) 
         throw TableError("input vector lengths don't match");
     if (iType == spline && vv.size() < 3)
         throw TableError("input vectors are too short to spline interpolate");
     if (vv.size() < 2 &&  (iType == linear || iType == ceil || iType == floor))
         throw TableError("input vectors are too short for interpolation");
     typename std::vector<A>::const_iterator aptr=aa.begin();
     typename std::vector<V>::const_iterator vptr=vv.begin();
     for (size_t i=0; i<aa.size(); i++, ++aptr, ++vptr) {
         Entry e(*aptr,*vptr);
         v.push_back(e);
     }
 }
예제 #2
0
    void Table<V,A>::setup() const 
    {
        if (isReady) return;

        if (v.size() <= 1) 
            throw TableError("Trying to use a null Table (need at least 2 entries)");

        sortIt();
        lastIndex = 1; // Start back at the beginning for the next search.

        // See if arguments are equally spaced
        // ...within this fractional error:
        const double tolerance = 0.01;
        dx = (v.back().arg - v.front().arg) / (v.size()-1);
        if (dx == 0.) 
            throw TableError("First and last Table entry are equal.");
        equalSpaced = true;
        for (int i=1; i<int(v.size()); i++) {
            if ( std::abs( ((v[i].arg-v[0].arg)/dx - i)) > tolerance) equalSpaced = false;
            if (v[i].arg == v[i-1].arg)
                throw TableError("Table has repeated arguments.");
        }

        switch (iType) {
          case linear:
               interpolate = &Table<V,A>::linearInterpolate;
               break;
          case spline : 
               setupSpline();
               interpolate = &Table<V,A>::splineInterpolate;
               break;
          case floor:
               interpolate = &Table<V,A>::floorInterpolate;
               break;
          case ceil:
               interpolate = &Table<V,A>::ceilInterpolate;
               break;
          default:
               throw TableError("interpolation method not yet implemented");
        }
        isReady = true;
    }
예제 #3
0
 Table<V,A>::Table(const std::vector<A>& aa, const std::vector<V>& vv, interpolant in) : 
     iType(in), isReady(false)
 {
     v.reserve(aa.size());
     if (vv.size() != aa.size()) 
         throw TableError("input vector lengths don't match");
     typename std::vector<A>::const_iterator aptr=aa.begin();
     typename std::vector<V>::const_iterator vptr=vv.begin();
     for (size_t i=0; i<aa.size(); i++, ++aptr, ++vptr) {
         Entry e(*aptr,*vptr);
         v.push_back(e);
     }
 }