Program Listing for File ThreadedInterpolation.h

Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/StellarEvolution/ThreadedInterpolation.h)

#include "../Core/SharedLibraryExportMacros.h"
#include "InterpolationQuantities.h"
#include "../Core/InterpolatingFunctionALGLIB.h"

#ifndef TOOLCHAIN_MSVC
    #include <pthread.h>
#endif

#include <vector>
#include <list>

namespace StellarEvolution {

    class LIB_LOCAL InterpolationQueue {
    private:
        std::list<const double *> __x;

        std::list<const double *> __y;

        std::list<size_t> __npoints;

        std::list<int> __nodes;

        std::list<double> __smoothing;

        std::list<int> __quantity_id;

        std::list<int> __grid_index;

        std::vector<Core::InterpolatingFunctionALGLIB*> __result;

#ifndef TOOLCHAIN_MSVC
        pthread_mutex_t __sync_mutex;
#endif

#ifndef NDEBUG
        std::list<int>::const_iterator __quantity_id_iter;
#endif

        void interpolate_thread();

    public:
        InterpolationQueue()
        {
#ifndef TOOLCHAIN_MSVC
            pthread_mutex_init(&__sync_mutex, NULL);
#endif
        }

        void push_back(const double *x,
                       const double *y,
                       size_t npoints,
                       int nodes,
                       double smoothing,
                       int quantity_id,
                       int grid_index);

        void calculate(unsigned num_threads);

        int quantity_id() const {return __quantity_id.front();}

        int grid_index() const {return __grid_index.front();}

        Core::InterpolatingFunctionALGLIB* result() const
        {return __result[__result.size() - __quantity_id.size()];}

        void pop_front();

        operator bool() const {return __quantity_id.size();}

        friend void *do_interpolation(void *);

    };//End InterpolationQueue class.

} //End StellarEvolution namespace.