5#ifndef SEVN_REVISED_UTILITIES_H
6#define SEVN_REVISED_UTILITIES_H
27#define _UNUSED __attribute__ ((unused))
28#define openfile(a, b) utilities::_openfile(a, b, __FILE__, __LINE__)
36 extern std::mt19937_64
mtrand;
38 #pragma omp threadprivate(utilities::mtrand)
59 constexpr double G = 3.925125598496094e8;
60 constexpr double yr_cgs = 3.1557600e7;
63 constexpr double Msun_cgs = 1.988409870698051e+33;
73 constexpr double c = 1.3598865132357053e7;
79 constexpr double tH = 13.7*1e3;
98 constexpr double TINY = 1e-15;
99 constexpr double DOUBLE_EPS = std::numeric_limits<double>::epsilon();
144 template <
typename T>
const std::string
n2s(T val,
const char* file_input,
const int line_input,
const unsigned int precision=6) {
147 std::ostringstream stream;
148 stream << std::scientific << std::setprecision(precision);
152 svlog.
critical(
"Cannot convert into a string", file_input, line_input);
176 double roche_lobe_Eg(
double Mass_primary,
double Mass_secondary,
double a);
215 double Reqc = 1.5 *Rpolar;
224 std::cout<<
"\nWaiting"<<std::endl;
230 template<
typename T,
typename... Tail>
232 std::cout << head <<
" ";
246 std::cout<<
"\nWaiting"<<std::endl;
259 template<
typename T,
typename... Tail>
262 std::cout << head <<
" ";
279 template <
typename T>
285 template <
typename T,
typename... ListP>
294 template <
class System,
typename... ListP>
297 std::stringstream ss;
300 std::string id_str=std::to_string(
get_ID(system));
303 return get_name(system) +
";" +id_str +
";" +label +
";" + time +
";" + ss.str();
307 template <
class System,
typename... ListP>
311 std::string id_str=std::to_string(
get_ID(system));
314 return get_name(system) +
";" +id_str +
";" +label +
";" + time +
";";
319 template <
typename... ListP>
325 template <
typename... ListP>
349 std::string keys_init =
"123456789";
350 std::string keys =
"0123456789";
352 std::uniform_int_distribution<int> unifo_keys_init(0, (
int)keys_init.size()-1);
353 std::uniform_int_distribution<int> unifo_keys(0, (
int)keys.size()-1);
355 std::string key =
"";
356 key += keys_init[(unifo_keys_init(*
mtrand))];
357 for(
int i = 0; i < 14; i++){
358 int position = unifo_keys(*
mtrand);
359 key += keys[position];
366 std::vector<std::string>
split(
const std::string& s,
char delimiter);
374 template <
typename T>
size_t binary_search(T *array,
const size_t left,
const size_t right,
const T value){
377 if (right > left+1) {
379 const size_t mid = left + ((right - left)>>1);
385 if(array[mid] > value)
387 else if (array[mid] == value)
393 if(array[left] == value)
return left;
394 else if(array[right] == value)
return right;
403 std::stringstream stream(str);
406 return (!stream.fail() and stream.eof()) ;
419 inline double kepler(
const double &ecc,
const double &m,
const double tol = 1e-6,
const int maxit = 50) {
427 double sinem = sin(em);
433 double f = em - ecc*sinem - m;
434 double f1 = 1.0 - ecc*cos(em);
435 double f2 = ecc*sinem;
436 double fsquare=f1*f1 - 2*f*f2;
437 auto check_problem = [&f2,&fsquare](){
return f2==0 or fsquare<=0;};
443 em = em + (-f1 + sqrt(fsquare))/f2;
446 while(fabs(f) > tol && k < maxit){
451 f = em - ecc*sinem - m;
452 f1 = 1.0 - ecc*cos(em);
454 fsquare=f1*f1 - 2*f*f2;
460 em = em + (-f1 + sqrt(fsquare))/f2;
472 template <
typename T>
const T
s2n(std::string &str,
const char* file_input,
const int line_input) {
478 std::stringstream stream(str);
489 template <
typename T>
void _openfile(T &in,
const std::string f,
const char* file_input,
const int line_input){
493 if(in.is_open()) in.close();
494 if(utilities::isifstream<T>())
495 in.open(f.c_str(), std::ios::in);
497 in.open(f.c_str(), std::ios::out);
509 template <
typename T> T
dirname2n(std::string str,
const char* file_input,
const int line_input){
511 std::size_t found = str.find(
'.');
512 if (found == std::string::npos)
515 return utilities::s2n<T>(str, file_input, line_input);
526 for (
auto& element : v)
527 std::cout << element <<
" ";
528 std::cout<<
"]"<<std::endl;
540 inline std::string
gen_filename(
const std::string &_folder,
const std::string &_fname,
bool print_threads=
true){
542 std::string return_string;
543 std::string folder = _folder.back()==
'/' ? _folder.substr(0, _folder.length()-1) : _folder;
547 std::size_t found_extension;
550 for ( std::size_t pos=0; pos!=std::string::npos; pos=_fname.find(
'.',pos+1)) found_extension = pos;
551 if (found_extension==0) found_extension = _fname.length();
554 int num_thread=omp_get_thread_num();
559 return_string = folder +
"/" + _fname.substr(0, found_extension) +
"_" + std::to_string(num_thread) + _fname.substr(found_extension);
562 return_string = folder +
"/" + _fname;
565 return return_string;
574 std::string here_token =
"include/";
575 std::string sevn_path = __FILE__;
576 std::size_t found = sevn_path.find(
"/src/");
580 if (found!=std::string::npos){
581 sevn_path = sevn_path.substr(0,found);
584 svlog.
critical(
"Error in the initialisation of parameter myself (path of the SEVN folder)."
585 " The path finding it is based on the fact that the utilities.h file is inside the folder include "
602 inline int find_line(
const double & x1,
const double & x2,
const double & y1,
const double & y2,
double & slope,
double & intercept){
603 slope = (y2 - y1)/(x2-x1);
604 intercept = y2 -slope*x2;
612 return fabs( (val1-val2)/val1 );
628 inline std::string
trim(
const std::string& s) {
629 return std::regex_replace(s, std::regex(
"^[ \\s]+|[ \\s]+$"), std::string(
""));
641 template<
typename T,
typename Iter>
644 return std::find(it, end, element)!=end;
653 inline std::string
make_pfile_str(
const double plife,
const size_t Phase,
const unsigned int min_precision=6){
659 unsigned int precision;
660 unsigned int digit_0= std::ceil(std::abs(std::log10(std::abs(plife-0))));
661 unsigned int digit_1= std::ceil(std::abs(std::log10(std::abs(plife-1))));
662 precision=std::max(std::max(digit_0,digit_1),min_precision);
665 std::stringstream tini_ss;
667 tini_ss <<
"%" << std::setprecision(precision) << plife * 100 <<
":" <<
Phase;
669 return tini_ss.str();
684 template <
typename T> T
interpolate_1D(T xp, std::vector<T>& x_interp, std::vector<T>& y_interp,
bool equispaced_interval=
false,
bool ext_raise=
false){
687 if (xp<x_interp[0] and ext_raise)
688 throw sevnstd::sevnerr(
"Error in interpolate_1D in utility.h: xp is out of boundary.");
689 else if (xp<=x_interp[0])
692 if (xp>x_interp.back() and ext_raise)
693 throw sevnstd::sevnerr(
"Error in interpolate_1D in utility.h: xp is out of boundary.");
694 else if (xp>=x_interp.back())
695 return y_interp.back();
698 if (equispaced_interval){
699 double dx = x_interp[1]-x_interp[0];
700 pos = int( (xp-x_interp[0])/dx);
705 return (y_interp[pos+1]-y_interp[pos])/(x_interp[pos+1]-x_interp[pos])*(xp-x_interp[pos])+y_interp[pos];
714 inline std::string
get_subpath(std::string path, std::string split_string,
bool include_split_string=
true){
716 size_t tt= path.find(split_string);
719 if (include_split_string){
720 subpath = path.substr(0,tt+split_string.size());
722 subpath = path.substr(0,tt);
734 template <
typename T>
735 void transpose(std::vector<std::vector<T>>& MatrixT, std::vector<std::vector<T>>& Matrix){
737 MatrixT.resize(Matrix.size());
739 for (
auto& Matrix_row : Matrix){
740 for (
int j=0; j<(int)Matrix_row.size(); j++)
741 MatrixT[j].push_back(Matrix_row[j]);
755 template <
typename T>
756 int findInVector(
const std::vector<T> & vecOfElements,
const T & element)
760 auto it = std::find(vecOfElements.begin(), vecOfElements.end(), element);
761 if (it != vecOfElements.end())
763 result = distance(vecOfElements.begin(), it);
774 template <
typename Key,
typename Value>
775 std::map<Value,Key>
flip_map(
const std::map<Key,Value> &original_map){
776 std::map<Value,Key> flipped_map;
778 for (
auto& pair : original_map){
779 flipped_map[pair.second] = pair.first;
814 template<
typename T,
typename... Args>
816 return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
836 std::vector<double>::iterator
begin;
837 std::vector<double>::iterator
end;
859 explicit ListGenerator(
double _vstep,
double _vstep_max=std::nan(
""),
double _vstep_min=std::nan(
""))
863 throw std::runtime_error(
"ListGenerator::vstep cannot be negative or zero");
864 if (std::isnan(
vmin))
866 if (std::isnan(
vmax))
870 throw std::runtime_error(
"ListGenerator::vmin cannot be larger than ListGenerator::vmax");
882 if (!std::is_sorted(
vlist.begin(),
vlist.end()))
883 throw std::runtime_error(
"The input vector in the ListGenerator constructor is not sorted");
893 static std::unique_ptr<ListGenerator>
make_unique(
double _vstep,
double _vstep_max=std::nan(
""),
double _vstep_min=std::nan(
""));
894 static std::unique_ptr<ListGenerator>
make_unique(std::vector<double> _vlist);
896 inline double get()
const{
898 throw std::out_of_range(
"The list of times reached the end. The current value is undefined");
908 throw std::out_of_range(
"The list of times reached the end. The next value is undefined");
913 else if(!std::isnan(
vstep))
944 else if(!std::isnan(
vstep))
#define _UNUSED
Definition: BinaryProperty.h:20
Definition: property.h:776
Definition: property.h:881
Definition: property.h:1700
void critical(std::string errstate, const char *file_input=nullptr, int line_input=-1) const
Definition: sevnlog.cpp:85
Class to handle the generation of a list of values.
Definition: utilities.h:825
std::vector< double >::iterator end
Definition: utilities.h:837
static std::unique_ptr< ListGenerator > make_unique(double _vstep, double _vstep_max=std::nan(""), double _vstep_min=std::nan(""))
Definition: utilities.cpp:158
double operator++(int)
Definition: utilities.h:929
double vmin
Definition: utilities.h:832
std::vector< double > vlist
Definition: utilities.h:835
void next()
Definition: utilities.h:905
double forecast() const
Definition: utilities.h:938
double get() const
Definition: utilities.h:896
ListGenerator(double _vstep, double _vstep_max=std::nan(""), double _vstep_min=std::nan(""))
Definition: utilities.h:859
std::vector< double >::iterator current
Definition: utilities.h:838
double get_max() const
Definition: utilities.h:901
double get_min() const
Definition: utilities.h:902
bool empty() const
Definition: utilities.h:904
double vstep
Definition: utilities.h:831
ListGenerator(const std::vector< double > &_tlist)
Definition: utilities.h:880
ListGenerator()
Definition: utilities.h:847
std::vector< double >::iterator begin
Definition: utilities.h:836
bool end_of_list
Definition: utilities.h:839
double operator++()
Definition: utilities.h:925
double vmax
Definition: utilities.h:833
void initialise_tlist_iterators()
Definition: utilities.h:841
double vcurrent
Definition: utilities.h:829
Definition: utilities.h:33
constexpr double Myr_to_yr
Definition: utilities.h:68
constexpr int SNII_EXPLODE
Definition: utilities.h:116
std::string trim(const std::string &s)
Definition: utilities.h:628
bool areEqual(double x, double y)
Definition: utilities.cpp:141
constexpr double G
Fundamental quantitis.
Definition: utilities.h:59
constexpr double c
Definition: utilities.h:73
double kepler(const double &ecc, const double &m, const double tol=1e-6, const int maxit=50)
Definition: utilities.h:419
T interpolate_1D(T xp, std::vector< T > &x_interp, std::vector< T > &y_interp, bool equispaced_interval=false, bool ext_raise=false)
Definition: utilities.h:684
double smallestSignificativeStep(double x)
Definition: utilities.cpp:150
constexpr double G_cgs
Definition: utilities.h:64
std::string get_name(Star *s)
Definition: utilities.cpp:76
void hardwait()
Definition: utilities.h:223
double Hfrac(Star *s)
Definition: utilities.cpp:120
static double omega_crit(double Mass, double Rpolar)
Definition: utilities.h:214
std::string make_pfile_str(const double plife, const size_t Phase, const unsigned int min_precision=6)
Definition: utilities.h:653
constexpr int RLO_FALSE
Definition: utilities.h:121
constexpr int SINGLE_STEP_EVOLUTION
Definition: utilities.h:104
constexpr double DOUBLE_EPS
Definition: utilities.h:99
double R_Alfven(Star *s, double dMdt, bool get0=false)
Definition: utilities.cpp:55
std::map< Value, Key > flip_map(const std::map< Key, Value > &original_map)
Definition: utilities.h:775
constexpr size_t NULL_SINT
Definition: utilities.h:91
void wait()
Definition: utilities.h:244
std::string common_log_print(const std::string &label, System *system, ListP... args)
Definition: utilities.h:295
std::string get_absolute_SEVN_path()
Definition: utilities.h:573
constexpr double Sigma_StefBoltz
Definition: utilities.h:67
constexpr double kms_to_RSunyr
Definition: utilities.h:71
constexpr int NULL_INT
Definition: utilities.h:90
constexpr double Rsun_cgs
Definition: utilities.h:62
constexpr int REPEATED_EVOLUTION
Definition: utilities.h:105
bool bse_evolution
Definition: utilities.h:125
void _log_print_core(std::stringstream &ss, T t)
Definition: utilities.h:280
constexpr int BIN_EV_DONE
Definition: utilities.h:126
constexpr int BIN_EV_SETBROKEN
Definition: utilities.h:128
bool isinlist(T element, Iter it, Iter end)
Definition: utilities.h:642
double get_current_time(Star *s)
Definition: utilities.cpp:88
constexpr int BIN_EV_NOT_DONE
Definition: utilities.h:127
constexpr double parsec_to_Rsun
Definition: utilities.h:75
constexpr double tH
Definition: utilities.h:79
constexpr int RLO_TRUE
Definition: utilities.h:122
int find_line(const double &x1, const double &x2, const double &y1, const double &y2, double &slope, double &intercept)
Definition: utilities.h:602
const std::string n2s(T val, const char *file_input, const int line_input, const unsigned int precision=6)
Definition: utilities.h:144
constexpr double g_to_MSun
Definition: utilities.h:76
const std::string random_keygen(std::mt19937_64 *mtrand)
Definition: utilities.h:346
constexpr double yr_cgs
Definition: utilities.h:60
int findInVector(const std::vector< T > &vecOfElements, const T &element)
Definition: utilities.h:756
long get_ID(Star *s)
Definition: utilities.cpp:79
unsigned int evolution
Definition: utilities.h:103
double maxwellian_pdf(double x, double sigma)
Definition: utilities.cpp:35
std::vector< std::string > split(const std::string &s, char delimiter)
Definition: utilities.cpp:19
constexpr int JUMP
Definition: utilities.h:110
constexpr double G_over_c2
Definition: utilities.h:77
constexpr double LSun_to_Solar
Definition: utilities.h:72
constexpr double parsec_cgs
Definition: utilities.h:61
void transpose(std::vector< std::vector< T > > &MatrixT, std::vector< std::vector< T > > &Matrix)
Definition: utilities.h:735
std::string gen_filename(const std::string &_folder, const std::string &_fname, bool print_threads=true)
Definition: utilities.h:540
constexpr double G3_over_c5
Definition: utilities.h:78
constexpr double km_to_RSun
Definition: utilities.h:74
std::string log_print(const std::string &label, Star *star, ListP... args)
Definition: utilities.h:320
double dMdt_Eddington_accretion(Star *donor, Star *accretor, double eddfact=1.0)
Definition: utilities.cpp:125
unsigned int jump_convergence
Definition: utilities.h:108
constexpr double TINY
Definition: utilities.h:98
void swap_stars(Star *&s1, Star *&s2)
Definition: utilities.h:617
double R_Schwarzschild(double Mass)
Definition: utilities.h:132
const std::string PLACEHOLDER
Definition: utilities.h:85
const std::string NULL_STR
Definition: utilities.h:93
unsigned int sn_explosion
Definition: utilities.h:114
T dirname2n(std::string str, const char *file_input, const int line_input)
Definition: utilities.h:509
constexpr double Mchandra
Definition: utilities.h:80
constexpr double Msun_cgs
Definition: utilities.h:63
size_t binary_search(T *array, const size_t left, const size_t right, const T value)
Definition: utilities.h:374
const std::string SEVN_NAME
Definition: utilities.h:49
constexpr double yr_to_Myr
Definition: utilities.h:69
constexpr int SN_NOT_EXPLODE
Definition: utilities.h:117
constexpr int SNIA_EXPLODE
Definition: utilities.h:115
unsigned int rlo
Definition: utilities.h:120
constexpr double NULL_DOUBLE
Definition: utilities.h:89
constexpr double AU_to_RSun
Definition: utilities.h:70
std::string log_star_info(Star *s, bool oldstep=false)
Definition: utilities.cpp:96
std::unique_ptr< T > make_unique(Args &&... args)
Definition: utilities.h:815
constexpr int JUMP_CONVERGE
Definition: utilities.h:109
double maxwellian_cdf(double x, double sigma)
Definition: utilities.cpp:30
bool wayToSort(int i, int j)
Definition: utilities.h:506
unsigned long gen_rseed()
Definition: utilities.cpp:11
bool isifstream< std::ifstream >()
Definition: utilities.h:371
void print_vector(const std::vector< T > &v)
Definition: utilities.h:524
void _openfile(T &in, const std::string f, const char *file_input, const int line_input)
Definition: utilities.h:489
constexpr int NO_JUMP
Definition: utilities.h:111
const T s2n(std::string &str, const char *file_input, const int line_input)
Definition: utilities.h:472
double rel_difference(T val1, T val2)
Definition: utilities.h:610
constexpr double DIFF_TOLL
Definition: utilities.h:96
std::mt19937_64 mtrand
Definition: utilities.cpp:9
bool string_is_number(std::string str)
Definition: utilities.h:400
std::string get_subpath(std::string path, std::string split_string, bool include_split_string=true)
Definition: utilities.h:714
constexpr double LARGE
Definition: utilities.h:97
double roche_lobe_Eg(double Mass_primary, double Mass_secondary, double a)
Definition: utilities.cpp:41
Definition: utilities.h:163
const double Mass
Definition: utilities.h:164
const double MHE
Definition: utilities.h:165
const double MCO
Definition: utilities.h:166