@@ -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 //
0 commit comments