Program Listing for File MESAIO.h¶
↰ Return to documentation for file (/home/kpenev/projects/git/poet/poet_src/StellarEvolution/MESAIO.h)
#ifndef __MESAIO_H
#define __MESAIO_H
#include "../Core/SharedLibraryExportMacros.h"
#include "Interpolator.h"
#include "../IO/IOUtil.h"
#include "../Core/Common.h"
#include "../Core/AstronomicalConstants.h"
#include "../Core/Error.h"
#include "dirent_hacked.h"
#include <iostream>
#include <iomanip>
#include <fstream>
#include <string>
#include <cassert>
#include <vector>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/serialization/base_object.hpp>
namespace StellarEvolution {
namespace MESA {
const double Yprimordial = 0.249;
const double Yprotosun = 0.2612;
const double Zprotosun = 0.0150;
const double Xprotosun = 1.0 - Yprotosun - Zprotosun;
LIB_LOCAL double metallicity_from_feh(double feh);
//interpolation parameter.
LIB_LOCAL double feh_from_metallicity(double metallicity);
enum Column {
MTRACK,
AGE,
LOG_RSTAR,
RSTAR,
LOG_LSTAR,
LSTAR,
MRAD,
RRAD,
ICONV,
IRAD,
NUM_COLUMNS
};
class LIB_LOCAL Header {
private:
std::vector<std::string> __column_names;
std::vector<int> __column_numbers;
void read_column_numbers(std::istream &track,
const std::string &filename, unsigned &line_number);
void set_column_names();
public:
Header(std::ifstream &track, const std::string &filename);
int get_column(MESA::Column quantity) const
{return __column_numbers[quantity];}
const std::vector<int> &get_all_columns() const
{return __column_numbers;}
};
class LIB_LOCAL EvolutionIterator {
public:
EvolutionIterator() : quantity_iter(NUM_QUANTITIES) {}
std::list<double>::iterator mass_iter;
std::list<double>::iterator feh_iter;
std::list< std::valarray<double> >::iterator age_iter;
std::vector< std::list< std::valarray<double> >::iterator >
quantity_iter;
EvolutionIterator(const EvolutionIterator &orig) :
mass_iter(orig.mass_iter),
feh_iter(orig.feh_iter),
age_iter(orig.age_iter),
quantity_iter(orig.quantity_iter)
{}
EvolutionIterator &operator=(const EvolutionIterator &rhs);
EvolutionIterator &operator++();
EvolutionIterator operator++(int)
{EvolutionIterator result(*this); ++(*this); return result;}
bool operator==(const EvolutionIterator &rhs)
{return mass_iter == rhs.mass_iter;}
bool operator!=(const EvolutionIterator &rhs)
{return !((*this) == rhs);}
};
class LIB_PUBLIC Interpolator : public StellarEvolution::Interpolator {
private:
static const std::vector<QuantityID> __column_to_quantity;
static const std::vector<double> __default_smoothing;
static const std::vector<int> __default_nodes;
static const std::vector<bool> __default_vs_log_age;
static const std::vector<bool> __default_log_quantity;
std::list<double> __mass_list;
std::list<double> __feh_list;
std::list< std::valarray<double> > __track_ages;
std::vector< std::list< std::valarray<double> > >
__track_quantities;
bool parse_model_file_name(const std::string &filename);
void sort_last_track_by_age();
void read_model_file(const std::string &filename);
#ifndef NDEBUG
void log_current_age_ranges() const;
#endif
void get_mass_feh_grid(
std::valarray<double> &masses,
std::valarray<double> &feh
);
EvolutionIterator begin();
EvolutionIterator end();
void move(EvolutionIterator &dest, EvolutionIterator &source);
void sort_tracks();
public:
Interpolator() {};
Interpolator(
const std::string &model_directory,
unsigned num_threads,
const std::vector<double> &smoothing = __default_smoothing,
const std::vector<int> &nodes = __default_nodes,
const std::vector<bool> &vs_log_age = __default_vs_log_age,
const std::vector<bool> &log_quantity =__default_log_quantity
);
static double default_smoothing(
StellarEvolution::QuantityID quantity
)
{return __default_smoothing[quantity];}
static const std::vector<double> &default_smoothing()
{return __default_smoothing;}
static int default_nodes(
StellarEvolution::QuantityID quantity
)
{return __default_nodes[quantity];}
static const std::vector<int> &default_nodes()
{return __default_nodes;}
static bool default_vs_log_age(
StellarEvolution::QuantityID quantity
)
{return __default_vs_log_age[quantity];}
static const std::vector<bool> &default_vs_log_age()
{return __default_vs_log_age;}
static bool default_log_quantity(
StellarEvolution::QuantityID quantity
)
{return __default_log_quantity[quantity];}
static const std::vector<bool> &default_log_quantity()
{return __default_log_quantity;}
};
} //End MESA namespace.
} //End StellarEvolution namespace.
std::ostream &operator<<(std::ostream &os,
StellarEvolution::MESA::Column col);
#endif