Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
b94e0b7
Initial import Metisse interface
rieder Feb 13, 2025
aee7cc5
remove file
rieder Feb 13, 2025
a74c50d
update interface
rieder Feb 13, 2025
b87f8b0
Stub interface
rieder Feb 13, 2025
112cce7
standard imports
rieder Feb 13, 2025
b69bd94
update interface with particle set
rieder Feb 13, 2025
ad1aaff
Updates to Metisse interface
rieder Feb 14, 2025
9c7de5a
Interface updates
rieder Feb 17, 2025
2256960
add getters/setters
rieder Feb 17, 2025
e70640d
small updates
rieder Feb 17, 2025
212d9bd
update literature
rieder Feb 17, 2025
1abca6c
Updates
rieder Feb 17, 2025
186fd73
add parameter setters/getters
rieder Feb 19, 2025
8363f30
cleanup and fixes to resize
rieder Feb 26, 2025
4549b19
interface updates
rieder Feb 26, 2025
c0042f6
Prevent hanging when t_end > t_nuc
rieder Mar 4, 2025
8d75358
remove python particleset
rieder Mar 4, 2025
279e79d
add units used, start with a small timestep
rieder Mar 4, 2025
100d32a
Merge remote-tracking branch 'lourens/issue-1024-new-build-system' in…
rieder Apr 8, 2025
a57a35f
fix allocation bug
rieder Apr 8, 2025
3fab0cc
Fix Ubuntu MPI hang
LourensVeen Jun 3, 2025
a4cbc1a
Merge commit '450d20c0b542be53ff6fdf82bb6c2cce1c80c7bf' into add/metisse
rieder Jun 18, 2025
d3f86bf
Add ext tests
LourensVeen Jun 10, 2025
a438d18
move files to new structure
rieder Jun 19, 2025
359245b
update to new dir structure (2)
rieder Jun 19, 2025
542abff
move to new dir structure (3)
rieder Jun 19, 2025
fd6bfde
small updates for newer METISSE
rieder Jun 23, 2025
0e8f6c6
updates for memory management
rieder Jun 23, 2025
9f1f9da
add test script for metisse
rieder Jun 23, 2025
79e2bed
Add code tests
LourensVeen Jun 21, 2025
0293c2e
updated way of setting the metallicity/track dirs
rieder Jun 24, 2025
12c746a
Set correct unit for evolving!
rieder Jul 1, 2025
1261d47
remove debug print
rieder Jul 1, 2025
170c709
ignore data files
rieder Jul 1, 2025
d4b48dc
Merge commit '79e2bed8d8930ab68b09d8df9bdd7e42e0820a92' into add/metisse
rieder Jul 10, 2025
cb36a3c
Merge remote-tracking branch 'upstream/main' into add/metisse
rieder Jul 14, 2025
bf27508
remove duplicates
rieder Jul 14, 2025
a57acfe
update test
rieder Jul 14, 2025
20f2c5f
add plotting script
rieder Jul 14, 2025
cf3d4a0
Merge remote-tracking branch 'upstream/main' into add/metisse
rieder Apr 14, 2026
2ecb5e7
remove workflows from another branch
rieder Apr 14, 2026
64e868a
undo another external commit
rieder Apr 14, 2026
bacb301
another external change
rieder Apr 14, 2026
e04527c
that's all of them, I think
rieder Apr 14, 2026
725e811
final 2
rieder Apr 14, 2026
9957513
Merge remote-tracking branch 'upstream/main' into add/metisse
rieder May 19, 2026
0d46763
Add/update examples for Metisse
rieder May 19, 2026
26956f3
update Makefile
rieder May 20, 2026
1598169
Update to fix bugs
rieder Jun 4, 2026
66e0fc3
download the amuse version of METISSE
rieder Jun 4, 2026
24f602f
consistency change: initial_metallicity renamed to metallicity
rieder Jul 7, 2026
a7469bd
ensure stars already have properties when added
rieder Jul 7, 2026
5d139a1
Update METISSE interface to enable more evolve steps on the same set
rieder Jul 22, 2026
0972780
Set default dir for tracks
rieder Jul 29, 2026
47d3758
Download data files on first run
rieder Jul 29, 2026
d44aeb6
cleanup
rieder Jul 29, 2026
e49a8c8
move examples
rieder Jul 29, 2026
a88d794
examples update?
rieder Sep 10, 2026
f230af2
wip
rieder Sep 10, 2026
d975988
add missing download script
rieder Sep 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -455,3 +455,5 @@ packages/dist

# standard directory for a virtualenv
env/
src/amuse_metisse/data
src/amuse_metisse/src/METISSE
1 change: 0 additions & 1 deletion examples

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fortran python cmake install download
294 changes: 294 additions & 0 deletions src/amuse/examples/example_metisse.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,294 @@
import logging

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this go with the other examples in src/amuse/examples rather than here?

import argparse

import numpy as np

from amuse.units import units, nbody_system
from amuse.datamodel import Particles

from amuse_metisse import Metisse

from amuse.ic.kroupa import new_kroupa_mass_distribution
# from amuse.ic.plummer import new_plummer_model

from amuse.io import write_set_to_file

logger = logging.getLogger("amuse")
# logger.setLevel(logging.DEBUG)
# logging.basicConfig(level=logging.DEBUG)


def new_argument_parser():
result = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
result.add_argument("--seed", type=int, default=127)
result.add_argument("-n", "--number_of_stars", type=int, default=10000)
result.add_argument(
"-t",
"--time_end",
type=units.Myr,
default=100.0 | units.Myr,
help="The time to evolve to",
)
result.add_argument(
"-s",
"--number_of_steps",
type=int,
default=100,
help="Number of time steps (in logspace)",
)
result.add_argument(
"-m",
"--mass_min",
type=units.MSun,
default=0.1 | units.MSun,
help="The minimum mass",
)
result.add_argument(
"-M",
"--mass_max",
type=units.MSun,
default=100.0 | units.MSun,
help="The maximum mass",
)
result.add_argument(
"--metallicity_dir",
type=str,
default="/Users/rieder/Code/UvA/Toonen/tres3.0/amuse/src/amuse_metisse/data/Hydrogen",
help="The metallicity directory",
)
result.add_argument(
"--metallicity_dir_he",
type=str,
default="/Users/rieder/Code/UvA/Toonen/tres3.0/amuse/src/amuse_metisse/data/Helium",
help="The metallicity-He directory",
)
return result


def setup_metisse(metallicity_dir=None, metallicity_dir_he=None, **kwargs):
# instance = Metisse(redirection="file")
# instance = Metisse(redirection="none")
instance = Metisse()

# print(f"Setting parameters: {metallicity_dir=}, {metallicity_dir_he=}")
# instance.parameters.metallicity_dir = metallicity_dir
# instance.parameters.metallicity_dir_he = metallicity_dir_he

# instance.parameters.wd_mass_scheme = "Modified_mestel"
# instance.parameters.bhns_mass_scheme = "Belczynski2008"
# instance.parameters.metallicity = 0.02

# instance.commit_parameters()
return instance


def test_metisse_sun(**kwargs):
instance = setup_metisse(**kwargs)
star = Particles(1)
# star.mass = 4.7893208794726441 | units.MSun
star.mass = 1.0 | units.MSun

stars_in_metisse = instance.particles.add_particles(star)
print(instance.parameters)
assert stars_in_metisse[0].mass == 1.0 | units.MSun
# assert stars_in_metisse[0].mass == 4.7893208794726441 | units.MSun
print(stars_in_metisse[0])
print("Evolving...")
instance.evolve_model(1000.0 | units.yr)
# instance.evolve_one_step(1)
print(stars_in_metisse[0])
print("Done")
instance.stop()


def test_metisse_twostars(**kwargs):
instance = setup_metisse(**kwargs)
star = Particles(2)
star.mass = [0.3, 2.5] | units.MSun

stars_in_metisse = instance.particles.add_particles(star)
print(stars_in_metisse[0])
print("Evolving...")
instance.evolve_model(1000.0 | units.yr)
print(stars_in_metisse.stellar_type)
print("Done")
instance.stop()

def test_metisse_kroupa(**kwargs):
instance = setup_metisse(**kwargs)
number_of_stars = 1000
star = Particles(number_of_stars)
star.mass = new_kroupa_mass_distribution(number_of_stars, mass_min=0.3 | units.MSun, mass_max=10.0 | units.MSun)

stars_in_metisse = instance.particles.add_particles(star)
print(stars_in_metisse[0])
print("Evolving...")
instance.evolve_model(1000.0 | units.yr)
print(stars_in_metisse)
print("Done")
instance.stop()


def evolve_stars_with_metisse(stars, age, **kwargs):
instance = setup_metisse(**kwargs)
stars_in_metisse = instance.particles.add_particles(stars)
instance.evolve_model(age)
stars_after_evolution = stars_in_metisse.copy()
instance.stop()
return stars_after_evolution


def evolve_stars_with_metisse_channel(stars, age, **kwargs):
instance = setup_metisse(**kwargs)
stars.mass = stars.mass_initial # !!! PAY ATTENTION HERE !!!
stars_in_metisse = instance.particles.add_particles(stars)
if age > 0 | units.Myr:
instance.evolve_model(age)
print(stars[0])
stars_in_metisse.new_channel_to(stars).copy_attributes(
[
"mass",
"luminosity",
"temperature",
"radius",
]
)
print(stars[0])
# import matplotlib.pyplot as plt
# plt.scatter(
# stars.mass.value_in(units.MSun),
# stars.stellar_type.value_in(units.stellar_type),
# )
# ax = plt.gca()
# ax.set_xscale("log")
# #ax.set_yscale("log")
# plt.show()
# stars_after_evolution = stars_in_metisse.copy()
instance.stop()
return stars


def evolve_stars_metisse(
number_of_stars=100,
time_end=100.0 | units.Myr,
number_of_steps=100,
mass_min=0.1 | units.MSun,
mass_max=100.0 | units.MSun,
**kwargs
):
mass = np.logspace(
np.log10(mass_min.value_in(units.MSun)),
np.log10(mass_max.value_in(units.MSun)),
number_of_stars
) | units.MSun
stars = Particles(number_of_stars)
stars.mass = mass

times = np.logspace(
np.log10((time_end / (number_of_steps**1.5)).value_in(units.Myr)),
np.log10(time_end.value_in(units.Myr)),
number_of_steps
) | units.Myr
i = 0
for time in times:
print(f"Evolving to time: {time}")
stars_metisse = evolve_stars_with_metisse(stars, time, **kwargs)
stars_metisse.age = time
write_set_to_file(
stars_metisse, f"stars_metisse_{i:06d}.amuse"
)
i += 1

def evolve_stars_metisse_channels(
number_of_stars=100,
time_end=100.0 | units.Myr,
number_of_steps=100,
mass_min=0.1 | units.MSun,
mass_max=100.0 | units.MSun,
**kwargs
):
mass = np.logspace(
np.log10(mass_min.value_in(units.MSun)),
np.log10(mass_max.value_in(units.MSun)),
number_of_stars
) | units.MSun
stars = Particles(number_of_stars)
stars.mass_initial = mass

times = np.logspace(
np.log10((time_end / (number_of_steps**1.5)).value_in(units.Myr)),
np.log10(time_end.value_in(units.Myr)),
number_of_steps
) | units.Myr
i = 0
stars = evolve_stars_with_metisse_channel(stars, 0 | units.Myr, **kwargs)
for time in times:
print(f"Evolving to time: {time}")
stars = evolve_stars_with_metisse_channel(stars, time, **kwargs)
# stars_metisse.age = time
write_set_to_file(
stars, f"stars3_metisse_{i:06d}.amuse"
)
i += 1

def evolve_stars_metisse_continuous(
number_of_stars=100,
time_end=100.0 | units.Myr,
number_of_steps=100,
mass_min=0.1 | units.MSun,
mass_max=100.0 | units.MSun,
**kwargs
):
"""
Set up METISSE once and keep evolving the stars
"""
mass = np.logspace(
np.log10(mass_min.value_in(units.MSun)),
np.log10(mass_max.value_in(units.MSun)),
number_of_stars
) | units.MSun
stars = Particles(number_of_stars)
stars.mass_initial = mass
stars.mass = mass

times = np.logspace(
np.log10((time_end / (number_of_steps**1.5)).value_in(units.Myr)),
np.log10(time_end.value_in(units.Myr)),
number_of_steps
) | units.Myr
i = 0
evo = setup_metisse(**kwargs)
stars_in_metisse = evo.particles.add_particles(stars)
channel_from_evo = stars_in_metisse.new_channel_to(stars)
channel_from_evo.copy()
for time in times:
print(f"Evolving to time: {time}")
evo.evolve_model(time)
channel_from_evo.copy()
# stars_metisse.age = time
write_set_to_file(
stars, f"stars6_metisse_{i:06d}.amuse"
)
i += 1


def main():
args = new_argument_parser().parse_args()
np.random.seed(args.seed)

# test_metisse_sun(**vars(args))
# test_metisse_twostars(**vars(args))
# test_metisse_kroupa(**vars(args))
# evolve_stars_metisse(start=0, **vars(args))
# evolve_stars_metisse_channels(start=0, **vars(args))
evolve_stars_metisse_continuous(start=0, **vars(args))

# TODO:
# METISSE tracks have a minimum mass, below that mass channels return zeros
# So need to be able to return what this minimum (and maximum) mass is.


if __name__ == "__main__":
main()
Loading
Loading