def stars_with_mechanical_luminosity(self, particles): result = ParticlesOverlay(particles) def lmech_function(temperature, mass, luminosity, radius): T = temperature.value_in(units.K) M = mass.value_in(units.MSun) L = luminosity.value_in(units.LSun) R = radius.value_in(units.RSun) # Reimers wind below 8000K mass_loss = (4.0e-13 | units.MSun / units.yr) * L * R / M # ... wind above 8000K i = numpy.where(temperature > 8000 | units.K)[0] mass_loss[i] = (10**-24.06 | units.MSun / units.yr) * ( L**2.45 * M**(-1.1) * T.clip(1000, 8.0e4)**(1.31)) t4 = numpy.log10(T * 1.0e-4).clip(0.0, 1.0) v_terminal = (30 + 4000 * t4) | units.km / units.s return 0.5 * mass_loss * v_terminal**2 result.add_calculated_attribute( "mechanical_luminosity", lmech_function, attributes_names=["temperature", "mass", "luminosity", "radius"]) result.L_mech = result.mechanical_luminosity result.E_mech = (0.0 | units.Myr) * result.L_mech result.E_mech_last_feedback = result.E_mech result.previous_mass = result.mass # Store the mass of the star at the last moment of feedback return result