diff --git a/src/HeMS.cpp b/src/HeMS.cpp index a7420e3ab..96e7f0580 100755 --- a/src/HeMS.cpp +++ b/src/HeMS.cpp @@ -719,13 +719,13 @@ double HeMS::InterpolateGeEtAlQCrit() { double logRadius = log10(m_Radius); double qCritLowerMass = (logRadius < lowerLogRadiusLowerMass) ? qLowLow : (logRadius > upperLogRadiusLowerMass) ? qLowUpp - : qLowLow + (upperLogRadiusLowerMass - logRadius) / (upperLogRadiusLowerMass - lowerLogRadiusLowerMass) * (qLowUpp - qLowLow); + : qLowLow + (logRadius - lowerLogRadiusLowerMass) / (upperLogRadiusLowerMass - lowerLogRadiusLowerMass) * (qLowUpp - qLowLow); double qCritUpperMass = (logRadius < lowerLogRadiusUpperMass) ? qUppLow : (logRadius > upperLogRadiusUpperMass) ? qUppUpp - : qUppLow + (upperLogRadiusUpperMass - logRadius) / (upperLogRadiusUpperMass - lowerLogRadiusUpperMass) * (qUppUpp - qUppLow); + : qUppLow + (logRadius - lowerLogRadiusUpperMass) / (upperLogRadiusUpperMass - lowerLogRadiusUpperMass) * (qUppUpp - qUppLow); double logMass = log10(m_Mass); return (logMass < logLowerMass) ? qCritLowerMass : (logMass > logUpperMass) ? qCritUpperMass - : qCritLowerMass + (logUpperMass - logMass) / (logUpperMass - logLowerMass) * (qCritUpperMass - qCritLowerMass); + : qCritLowerMass + (logMass - logLowerMass) / (logUpperMass - logLowerMass) * (qCritUpperMass - qCritLowerMass); } diff --git a/src/MainSequence.cpp b/src/MainSequence.cpp index 6315b0ae7..fd04da585 100644 --- a/src/MainSequence.cpp +++ b/src/MainSequence.cpp @@ -1305,26 +1305,28 @@ double MainSequence::InterpolateGeEtAlQCrit(const QCRIT_PRESCRIPTION p_qCritPres double logRadius = log10(m_Radius); double qCritUpperEffLowerMass = (logRadius < lowerLogRadiusLowerMass) ? qUppLowLow : (logRadius > upperLogRadiusLowerMass) ? qUppLowUpp - : qUppLowLow + (upperLogRadiusLowerMass - logRadius) / (upperLogRadiusLowerMass - lowerLogRadiusLowerMass) * (qUppLowUpp - qUppLowLow); + : qUppLowLow + (logRadius - lowerLogRadiusLowerMass) / (upperLogRadiusLowerMass - lowerLogRadiusLowerMass) * (qUppLowUpp - qUppLowLow); double qCritUpperEffUpperMass = (logRadius < lowerLogRadiusUpperMass) ? qUppUppLow : (logRadius > upperLogRadiusUpperMass) ? qUppUppUpp - : qUppUppLow + (upperLogRadiusUpperMass - logRadius) / (upperLogRadiusUpperMass - lowerLogRadiusUpperMass) * (qUppUppUpp - qUppUppLow); + : qUppUppLow + (logRadius - lowerLogRadiusUpperMass) / (upperLogRadiusUpperMass - lowerLogRadiusUpperMass) * (qUppUppUpp - qUppUppLow); double qCritLowerEffLowerMass = (logRadius < lowerLogRadiusLowerMass) ? qLowLowLow : (logRadius > upperLogRadiusLowerMass) ? qLowLowUpp - : qLowLowLow + (upperLogRadiusLowerMass - logRadius) / (upperLogRadiusLowerMass - lowerLogRadiusLowerMass) * (qLowLowUpp - qLowLowLow); + : qLowLowLow + (logRadius - lowerLogRadiusLowerMass) / (upperLogRadiusLowerMass - lowerLogRadiusLowerMass) * (qLowLowUpp - qLowLowLow); double qCritLowerEffUpperMass = (logRadius < lowerLogRadiusUpperMass) ? qLowUppLow : (logRadius > upperLogRadiusUpperMass) ? qLowUppUpp - : qLowUppLow + (upperLogRadiusUpperMass - logRadius) / (upperLogRadiusUpperMass - lowerLogRadiusUpperMass) * (qLowUppUpp - qLowUppLow); + : qLowUppLow + (logRadius - lowerLogRadiusUpperMass) / (upperLogRadiusUpperMass - lowerLogRadiusUpperMass) * (qLowUppUpp - qLowUppLow); double logMass = log10(m_Mass); double interpolatedQCritUpperEff = (logMass < logLowerMass) ? qCritUpperEffLowerMass : (logMass > logUpperMass) ? qCritUpperEffUpperMass - : qCritUpperEffLowerMass + (logUpperMass - logMass) / (logUpperMass - logLowerMass) * (qCritUpperEffUpperMass - qCritUpperEffLowerMass); + : qCritUpperEffLowerMass + (logMass - logLowerMass) / (logUpperMass - logLowerMass) * (qCritUpperEffUpperMass - qCritUpperEffLowerMass); double interpolatedQCritLowerEff = (logMass < logLowerMass) ? qCritLowerEffLowerMass : (logMass > logUpperMass) ? qCritLowerEffUpperMass - : qCritLowerEffLowerMass + (logUpperMass - logMass) / (logUpperMass - logLowerMass) * (qCritLowerEffUpperMass - qCritLowerEffLowerMass); - - double interpolatedQCritForZ = p_massTransferEfficiencyBeta * interpolatedQCritUpperEff + (1.0 - p_massTransferEfficiencyBeta) * interpolatedQCritLowerEff; // Don't need to use nearest neighbor for this, beta is always between 0 and 1 + : qCritLowerEffLowerMass + (logMass - logLowerMass) / (logUpperMass - logLowerMass) * (qCritLowerEffUpperMass - qCritLowerEffLowerMass); + + double fBeta = (p_massTransferEfficiencyBeta > 0.5) ? (p_massTransferEfficiencyBeta - 0.5) / 0.5 //define a local interpolation factor from 0 to 1 within the selected beta interval + : p_massTransferEfficiencyBeta / 0.5; + double interpolatedQCritForZ = fBeta * interpolatedQCritUpperEff + (1.0 - fBeta) * interpolatedQCritLowerEff; // Don't need to use nearest neighbor for this, beta is always between 0 and 1 qCritPerMetallicity[ii] = interpolatedQCritForZ; } double logZlo = -3; // log10(0.001) diff --git a/src/changelog.h b/src/changelog.h index 20cd4638c..f2a2285ff 100644 --- a/src/changelog.h +++ b/src/changelog.h @@ -1705,6 +1705,8 @@ // - Corrected the M&M NS remnant mass prescription to never return a remnant mass larger than the CO core mass (see issue #1468) // 03.29.05 AG - May 26, 2026 - Defect repair: // - Fix for generalized issue #1378: reinstate "false" fallback option for SN kick angle options (mistakenly changed to "true" in v03.00.00) +// 03.29.06 DH - September 23, 2026 - Defect repair: +// - Fix for issue #1484: reversed interpolation factors for mass transfer stability with Ge's model q_crit, in MainSequence and HeMS // // Version string format is MM.mm.rr, where // @@ -1715,7 +1717,7 @@ // if MM is incremented, set mm and rr to 00, even if defect repairs and minor enhancements were also made // if mm is incremented, set rr to 00, even if defect repairs were also made -const std::string VERSION_STRING = "03.29.05"; +const std::string VERSION_STRING = "03.29.06"; # endif // __changelog_h__