Skip to content

Commit 97bfc0f

Browse files
authored
Merge pull request #520 from TeamCOMPAS/lambda_enhancements
Lambda enhancements
2 parents 121a795 + 3ad498c commit 97bfc0f

38 files changed

+1688
-166
lines changed

online-docs/pages/User guide/Program options/program-options-list-defaults.rst

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,22 @@ Default = 0.1
137137
Multiplicative constant to be applied to the common envelope lambda parameter for any prescription. |br|
138138
Default = 1.0
139139

140+
**--common-envelope-lambda-nanjing-enhanced** |br|
141+
Continuous extrapolation beyond maximum radius range in Nanjing lambda's as implemented in StarTrack. Only used when ``--common-envelope-lambda-prescription = LAMBDA_NANJING``. |br|
142+
Default = FALSE
143+
144+
**--common-envelope-lambda-nanjing-interpolate-in-mass** |br|
145+
Interpolate Nanjing lambda parameters across different mass models. Only used when ``--common-envelope-lambda-prescription = LAMBDA_NANJING``. |br|
146+
Default = FALSE
147+
148+
**--common-envelope-lambda-nanjing-interpolate-in-metallicity** |br|
149+
Interpolate Nanjing lambda parameters across population I and population II metallicity models. Only used when ``--common-envelope-lambda-prescription = LAMBDA_NANJING``. |br|
150+
Default = FALSE
151+
152+
**--common-envelope-lambda-nanjing-use_rejuvenated-mass** |br|
153+
Use rejuvenated or effective ZAMS mass instead of true birth mass when computing Nanjing lambda parameters. Only used when ``--common-envelope-lambda-prescription = LAMBDA_NANJING``. |br|
154+
Default = FALSE
155+
140156
**--common-envelope-lambda-prescription** |br|
141157
CE lambda (envelope binding energy) prescription. |br|
142158
Options: { LAMBDA_FIXED, LAMBDA_LOVERIDGE, LAMBDA_NANJING, LAMBDA_KRUCKOW, LAMBDA_DEWI } |br|
@@ -955,7 +971,7 @@ Go to :ref:`the top of this page <options-props-top>` for the full alphabetical
955971

956972
--circulariseBinaryDuringMassTransfer, --angular-momentum-conservation-during-circularisation
957973

958-
--envelope-state-prescription, --common-envelope-alpha, --common-envelope-alpha-thermal, --common-envelope-lambda-prescription, --common-envelope-lambda, --common-envelope-slope-kruckow, --common-envelope-lambda-multiplier, --common-envelope-allow-main-sequence-survive, --common-envelope-allow-radiative-envelope-survive*, --common-envelope-allow-immediate-RLOF-post-CE-survive, --common-envelope-mass-accretion-prescription, --common-envelope-mass-accretion-constant, --common-envelope-mass-accretion-min, --common-envelope-mass-accretion-max, --common-envelope-recombination-energy-density, --maximum-mass-donor-nandez-ivanova, --revised-energy-formalism-nandez-ivanova
974+
--envelope-state-prescription, --common-envelope-alpha, --common-envelope-alpha-thermal, --common-envelope-lambda-prescription, --common-envelope-lambda, --common-envelope-slope-kruckow, --common-envelope-lambda-multiplier, --common-envelope-lambda-nanjing-enhanced, --common-envelope-lambda-nanjing-interpolate-in-mass, --common-envelope-lambda-nanjing-interpolate-in-metallicity, --common-envelope-lambda-nanjing-use_rejuvenated-mass, --common-envelope-allow-main-sequence-survive, --common-envelope-allow-radiative-envelope-survive*, --common-envelope-allow-immediate-RLOF-post-CE-survive, --common-envelope-mass-accretion-prescription, --common-envelope-mass-accretion-constant, --common-envelope-mass-accretion-min, --common-envelope-mass-accretion-max, --common-envelope-recombination-energy-density, --maximum-mass-donor-nandez-ivanova, --revised-energy-formalism-nandez-ivanova
959975

960976
:ref:`Back to Top <options-props-top>`
961977

src/BaseBinaryStar.cpp

100755100644
File mode changed.

src/BaseBinaryStar.h

100755100644
File mode changed.

src/BaseStar.cpp

Lines changed: 156 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ BaseStar::BaseStar(const unsigned long int p_RandomSeed,
223223

224224

225225
/*
226-
* Determine the value of the requested property of the constitusnt star (parameter p_Property)
226+
* Determine the value of the requested property of the constituent star (parameter p_Property)
227227
*
228228
* The property is a boost variant variable, and is one of the following types:
229229
*
@@ -1084,6 +1084,161 @@ double BaseStar::CalculateLambdaLoveridgeEnergyFormalism(const double p_EnvMass,
10841084
}
10851085

10861086

1087+
/*
1088+
* Wrapper function to return Nanjing lambda based on options
1089+
*
1090+
*
1091+
* double BaseStar::CalculateLambdaNanjing()
1092+
*
1093+
* @return Common envelope lambda parameter
1094+
*/
1095+
double BaseStar::CalculateLambdaNanjing() const {
1096+
1097+
double mass = m_MZAMS;
1098+
double lambda = 0.0;
1099+
if (OPTIONS->CommonEnvelopeLambdaNanjingUseRejuvenatedMass()) {mass = m_Mass0;} // Use rejuvenated mass to calculate lambda instead of true birth mass
1100+
1101+
if (OPTIONS->CommonEnvelopeLambdaNanjingEnhanced()) { // If using enhanced Nanjing lambda's
1102+
if (OPTIONS->CommonEnvelopeLambdaNanjingInterpolateInMass()) {
1103+
if (OPTIONS->CommonEnvelopeLambdaNanjingInterpolateInMetallicity()) {
1104+
lambda = BaseStar::CalculateMassAndZInterpolatedLambdaNanjing(mass, m_Metallicity);
1105+
}
1106+
else {
1107+
int Zind = 0;
1108+
if (utils::Compare(m_Metallicity, LAMBDA_NANJING_ZLIMIT) < 0) {Zind = 0;} else {Zind = 1;}
1109+
lambda = BaseStar::CalculateMassInterpolatedLambdaNanjing(mass, Zind);
1110+
}
1111+
}
1112+
else {
1113+
int massInd = BaseStar::FindLambdaNanjingNearestMassIndex(mass); // Do not interpolate in mass, so need to use nearest mass bin
1114+
if (OPTIONS->CommonEnvelopeLambdaNanjingInterpolateInMetallicity()) {
1115+
lambda = BaseStar::CalculateZInterpolatedLambdaNanjing(m_Metallicity, massInd);
1116+
}
1117+
else {
1118+
int Zind = 0;
1119+
if (utils::Compare(m_Metallicity, LAMBDA_NANJING_ZLIMIT) < 0) {Zind = 0;} else {Zind = 1;}
1120+
lambda = BaseStar::CalculateLambdaNanjingEnhanced(massInd, Zind);
1121+
}
1122+
}
1123+
}
1124+
else { lambda = CalculateLambdaNanjingStarTrack(mass, m_Metallicity); }
1125+
return lambda;
1126+
}
1127+
1128+
1129+
/*
1130+
* Calculate mass- and metallicity-interpolated Nanjing lambda
1131+
*
1132+
*
1133+
* double BaseStar::CalculateMassAndZInterpolatedLambdaNanjing(const double p_Mass, const double p_Z)
1134+
*
1135+
* @return Common envelope lambda parameter
1136+
*/
1137+
double BaseStar::CalculateMassAndZInterpolatedLambdaNanjing(const double p_Mass, const double p_Z) const {
1138+
1139+
double lambda = 0.0;
1140+
if (utils::Compare(m_Metallicity, LAMBDA_NANJING_POPII_Z) < 0) {
1141+
lambda = BaseStar::CalculateMassInterpolatedLambdaNanjing(p_Mass, 0); // Use lambda for pop. II metallicity
1142+
}
1143+
else if (utils::Compare(m_Metallicity, LAMBDA_NANJING_POPI_Z) > 0) {
1144+
lambda = BaseStar::CalculateMassInterpolatedLambdaNanjing(p_Mass, 1); // Use lambda for pop. I metallicity
1145+
}
1146+
else { // Linear interpolation in logZ between pop. I and pop. II metallicities
1147+
const double logZ = log(m_Metallicity);
1148+
double lambdaLow = BaseStar::CalculateMassInterpolatedLambdaNanjing(p_Mass, 0);
1149+
double lambdaUp = BaseStar::CalculateMassInterpolatedLambdaNanjing(p_Mass, 1);
1150+
lambda = lambdaLow + (logZ - LAMBDA_NANJING_POPII_LOGZ) / (LAMBDA_NANJING_POPI_LOGZ - LAMBDA_NANJING_POPII_LOGZ) * (lambdaUp - lambdaLow);
1151+
}
1152+
return lambda;
1153+
}
1154+
1155+
1156+
/*
1157+
* Interpolate Nanjing lambda in mass for a given metallicity
1158+
*
1159+
*
1160+
* double BaseStar::CalculateMassInterpolatedLambdaNanjing(const int p_Zind)
1161+
*
1162+
* @param [IN] p_Zind Index of metallicity (0 = pop II metallicity, 1 = pop I metallicity)
1163+
* @param [IN] p_Mass Mass / Msun to evaluate lambda with
1164+
* @return Common envelope lambda parameter
1165+
*/
1166+
double BaseStar::CalculateMassInterpolatedLambdaNanjing(const double p_Mass, const int p_Zind) const {
1167+
1168+
double lambda = 0.0;
1169+
std::vector<int> ind = utils::binarySearch(NANJING_MASSES, p_Mass);
1170+
int low = ind[0];
1171+
int up = ind[1];
1172+
if ( (low < 0) && (up >= 0) ) { // Mass below range calculated by Xu & Li (2010)
1173+
lambda = CalculateLambdaNanjingEnhanced(0, p_Zind); // Use lambda for minimum mass
1174+
}
1175+
else if ( (low >= 0) && (up < 0) ) { // Mass above range calculated by Xu & Li (2010)
1176+
lambda = CalculateLambdaNanjingEnhanced(NANJING_MASSES.size() - 1, p_Zind); // Use lambda for maximum mass
1177+
}
1178+
else if (low == up) { // Mass is exactly equal to the mass of a model evolved by Xu & Li (2010)
1179+
lambda = CalculateLambdaNanjingEnhanced(low, p_Zind);
1180+
}
1181+
else { // Linear interpolation between upper and lower mass bins
1182+
double lambdaLow = CalculateLambdaNanjingEnhanced(low, p_Zind);
1183+
double lambdaUp = CalculateLambdaNanjingEnhanced(up, p_Zind);
1184+
lambda = lambdaLow + (p_Mass - NANJING_MASSES[low]) / (NANJING_MASSES[up] - NANJING_MASSES[low]) * (lambdaUp - lambdaLow);
1185+
}
1186+
return lambda;
1187+
}
1188+
1189+
1190+
/*
1191+
* Interpolate Nanjing lambda in metallicity for a given mass
1192+
*
1193+
*
1194+
* double BaseStar::CalculateZInterpolatedLambdaNanjing(const int p_Zind)
1195+
*
1196+
* @param [IN] p_Z Metallicity
1197+
* @param [IN] p_MassInd Index specifying donor mass (see NANJING_MASSES in constants.h)
1198+
* @return Common envelope lambda parameter
1199+
*/
1200+
double BaseStar::CalculateZInterpolatedLambdaNanjing(const double p_Z, const int p_MassInd) const {
1201+
1202+
double lambda = 0.0;
1203+
if (utils::Compare(m_Metallicity, LAMBDA_NANJING_POPII_Z) < 0) {
1204+
lambda = CalculateLambdaNanjingEnhanced(p_MassInd, 0); // Use lambda for pop. II metallicity
1205+
}
1206+
else if (utils::Compare(m_Metallicity, LAMBDA_NANJING_POPI_Z) > 0) {
1207+
lambda = CalculateLambdaNanjingEnhanced(p_MassInd, 1); // Use lambda for pop. I metallicity
1208+
}
1209+
else { // Linear interpolation in logZ between pop. I and pop. II metallicities
1210+
const double logZ = log(m_Metallicity);
1211+
double lambdaLow = CalculateLambdaNanjingEnhanced(p_MassInd, 0);
1212+
double lambdaUp = CalculateLambdaNanjingEnhanced(p_MassInd, 1);
1213+
lambda = lambdaLow + (logZ - LAMBDA_NANJING_POPII_LOGZ) / (LAMBDA_NANJING_POPI_LOGZ - LAMBDA_NANJING_POPII_LOGZ) * (lambdaUp - lambdaLow);
1214+
}
1215+
return lambda;
1216+
}
1217+
1218+
1219+
/*
1220+
* Returns index in NANJING_MASSES corresponding to nearest mass model computed by Xu & Li (2010)
1221+
*
1222+
*
1223+
* double BaseStar::FindLambdaNanjingNearestMassIndex(const double p_Mass)
1224+
*
1225+
* @return Index in NANJING_MASSES
1226+
*/
1227+
double BaseStar::FindLambdaNanjingNearestMassIndex(const double p_Mass) const {
1228+
1229+
if (p_Mass < NANJING_MASSES_MIDPOINTS[0]) { // M < 1.5 Msun, use lambda for the 1 Msun model
1230+
return 0;
1231+
}
1232+
else if (p_Mass >= NANJING_MASSES_MIDPOINTS.back()) { // M >= 75 Msun, use lambda for the 100 Msun model
1233+
return NANJING_MASSES.size() - 1;
1234+
}
1235+
else { // Search for upper and lower mass bin edges
1236+
std::vector<int> ind = utils::binarySearch(NANJING_MASSES_MIDPOINTS, p_Mass);
1237+
return ind[1];
1238+
}
1239+
}
1240+
1241+
10871242
///////////////////////////////////////////////////////////////////////////////////////
10881243
// //
10891244
// ZETA CALCULATIONS //

src/BaseStar.h

100755100644
Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,8 @@ class BaseStar {
386386
virtual double CalculateLambdaDewi() const { SHOW_WARN(ERROR::NO_LAMBDA_DEWI, "Default used: 1.0"); return 1.0; } // Not supported: show error
387387
double CalculateLambdaKruckow(const double p_Radius, const double p_Alpha) const;
388388
double CalculateLambdaLoveridgeEnergyFormalism(const double p_EnvMass, const double p_IsMassLoss = false) const;
389-
virtual double CalculateLambdaNanjing() const { SHOW_WARN(ERROR::NO_LAMBDA_NANJING, "Default used: 1.0"); return 1.0; } // Not supported: show error
389+
virtual double CalculateLambdaNanjingStarTrack(const double p_Mass, const double p_Metallicity) const { SHOW_WARN(ERROR::NO_LAMBDA_NANJING, "Default used: 1.0"); return 1.0; } // Not supported: show error
390+
virtual double CalculateLambdaNanjingEnhanced(const int p_MassInd, const int p_Zind) const { SHOW_WARN(ERROR::NO_LAMBDA_NANJING, "Default used: 1.0"); return 1.0; } // Not supported: show error
390391

391392
void CalculateLCoefficients(const double p_LogMetallicityXi, DBL_VECTOR &p_LCoefficients);
392393

@@ -401,6 +402,10 @@ class BaseStar {
401402
double CalculateLuminosityGivenCoreMass(const double p_CoreMass) const;
402403
virtual double CalculateLuminosityOnPhase() const { return m_Luminosity; } // Default is NO-OP
403404

405+
double CalculateMassAndZInterpolatedLambdaNanjing(const double p_Mass, const double p_Z) const;
406+
double CalculateMassInterpolatedLambdaNanjing(const double p_Mass, const int p_Zind) const;
407+
double CalculateZInterpolatedLambdaNanjing(const double p_Z, const int p_MassInd) const;
408+
404409
void CalculateMassCutoffs(const double p_Metallicity, const double p_LogMetallicityXi, DBL_VECTOR &p_MassCutoffs);
405410

406411
static double CalculateMassLoss_Static(const double p_Mass, const double p_Mdot, const double p_Dt);
@@ -498,12 +503,14 @@ class BaseStar {
498503
const double p_EjectaMass,
499504
const double p_RemnantMass) const;
500505

506+
double CalculateLambdaNanjing() const;
501507
virtual void EvolveOneTimestepPreamble() { }; // Default is NO-OP
502508

503509
STELLAR_TYPE EvolveOnPhase();
504510

505511
virtual STELLAR_TYPE EvolveToNextPhase() { return m_StellarType; }
506512

513+
double FindLambdaNanjingNearestMassIndex(const double p_Mass) const;
507514

508515
virtual bool IsEndOfPhase() const { return false; }
509516
virtual bool IsSupernova() const { return false; }

src/BinaryConstituentStar.cpp

100755100644
File mode changed.

src/BinaryConstituentStar.h

100755100644
File mode changed.

src/BinaryStar.cpp

100755100644
File mode changed.

0 commit comments

Comments
 (0)