From a7175bf443cc44b0512262fd9e8b1aad66e25fb0 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 10:44:00 -0400 Subject: [PATCH 01/61] Basic skeleton --- tardis/workflows/__init__.py | 0 .../workflows/standard_simulation_solver.py | 99 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 tardis/workflows/__init__.py create mode 100644 tardis/workflows/standard_simulation_solver.py diff --git a/tardis/workflows/__init__.py b/tardis/workflows/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py new file mode 100644 index 00000000000..79927b259dd --- /dev/null +++ b/tardis/workflows/standard_simulation_solver.py @@ -0,0 +1,99 @@ +import logging +from astropy import units as u + +from tardis.simulation.convergence import ConvergenceSolver + +# logging support +logger = logging.getLogger(__name__) + + +class StandardSimulationSolver: + def __init__(self, convergence_strategy): + self.simulation_state = None + self.spectrum_solver = None + self.transport_solver = None + self.luminosity_requested = 0 * u.erg / u.s + + # Convergence + self.convergence_strategy = convergence_strategy + self.converged = False + self.consecutive_converges_count = 0 + + # Convergence solvers + self.t_rad_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_rad + ) + self.w_convergence_solver = ConvergenceSolver( + self.convergence_strategy.w + ) + self.t_inner_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_inner + ) + + def _get_convergence_status( + self, t_rad, w, t_inner, estimated_t_rad, estimated_w, estimated_t_inner + ): + t_rad_converged = self.t_rad_convergence_solver.get_convergence_status( + t_rad.value, + estimated_t_rad.value, + self.simulation_state.no_of_shells, + ) + + w_converged = self.w_convergence_solver.get_convergence_status( + w, estimated_w, self.simulation_state.no_of_shells + ) + + t_inner_converged = ( + self.t_inner_convergence_solver.get_convergence_status( + t_inner.value, + estimated_t_inner.value, + 1, + ) + ) + + if np.all([t_rad_converged, w_converged, t_inner_converged]): + hold_iterations = self.convergence_strategy.hold_iterations + self.consecutive_converges_count += 1 + logger.info( + f"Iteration converged {self.consecutive_converges_count:d}/{(hold_iterations + 1):d} consecutive " + f"times." + ) + # If an iteration has converged, require hold_iterations more + # iterations to converge before we conclude that the Simulation + # is converged. + return self.consecutive_converges_count == hold_iterations + 1 + + self.consecutive_converges_count = 0 + return False + + def check_convergence(self, emitted_luminosity): + ( + estimated_t_rad, + estimated_dilution_factor, + ) = self.transport_solver.transport_state.calculate_radiationfield_properties() + + estimated_t_inner = self.estimate_t_inner( + self.simulation_state.t_inner, + self.luminosity_requested, + emitted_luminosity, + t_inner_update_exponent=self.convergence_strategy.t_inner_update_exponent, + ) + + converged = self._get_convergence_status( + self.simulation_state.t_radiative, + self.simulation_state.dilution_factor, + self.simulation_state.t_inner, + estimated_t_rad, + estimated_dilution_factor, + estimated_t_inner, + ) + + return converged + + def solve(self): + while not converged: + solve_plasma() + run_montecarlo() + converged = check_convergence() + + run_montecarlo(final=True) From 032f34b299f7fbd8b6c0ee6d1f440a069555653c Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 11:39:28 -0400 Subject: [PATCH 02/61] Lots of progress Solvers pass info to each other Simplified some parts --- .../workflows/standard_simulation_solver.py | 238 ++++++++++++++++-- 1 file changed, 216 insertions(+), 22 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 79927b259dd..1e778d28b9f 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -1,46 +1,68 @@ import logging + +import numpy as np from astropy import units as u +from tardis.io.atom_data.base import AtomData from tardis.simulation.convergence import ConvergenceSolver +from tardis.spectrum.formal_integral import FormalIntegrator # logging support logger = logging.getLogger(__name__) class StandardSimulationSolver: - def __init__(self, convergence_strategy): + def __init__(self, convergence_strategy, atom_data_path): + self.atom_data_path = atom_data_path self.simulation_state = None + self.atom_data = None self.spectrum_solver = None self.transport_solver = None + self.plasma_solver = None self.luminosity_requested = 0 * u.erg / u.s + self.integrated_spectrum_settings = None # Convergence self.convergence_strategy = convergence_strategy - self.converged = False self.consecutive_converges_count = 0 + self.converged = False + self.total_iterations = 1 + self.completed_iterations = 0 # Convergence solvers - self.t_rad_convergence_solver = ConvergenceSolver( - self.convergence_strategy.t_rad + self.t_radiative_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_radiative ) - self.w_convergence_solver = ConvergenceSolver( - self.convergence_strategy.w + self.dilution_factor_convergence_solver = ConvergenceSolver( + self.convergence_strategy.dilution_factor ) self.t_inner_convergence_solver = ConvergenceSolver( self.convergence_strategy.t_inner ) def _get_convergence_status( - self, t_rad, w, t_inner, estimated_t_rad, estimated_w, estimated_t_inner + self, + t_radiative, + dilution_factor, + t_inner, + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, ): - t_rad_converged = self.t_rad_convergence_solver.get_convergence_status( - t_rad.value, - estimated_t_rad.value, - self.simulation_state.no_of_shells, + t_radiative_converged = ( + self.t_radiative_convergence_solver.get_convergence_status( + t_radiative.value, + estimated_t_radiative.value, + self.simulation_state.no_of_shells, + ) ) - w_converged = self.w_convergence_solver.get_convergence_status( - w, estimated_w, self.simulation_state.no_of_shells + dilution_factor_converged = ( + self.dilution_factor_convergence_solver.get_convergence_status( + dilution_factor, + estimated_dilution_factor, + self.simulation_state.no_of_shells, + ) ) t_inner_converged = ( @@ -51,7 +73,13 @@ def _get_convergence_status( ) ) - if np.all([t_rad_converged, w_converged, t_inner_converged]): + if np.all( + [ + t_radiative_converged, + dilution_factor_converged, + t_inner_converged, + ] + ): hold_iterations = self.convergence_strategy.hold_iterations self.consecutive_converges_count += 1 logger.info( @@ -66,9 +94,28 @@ def _get_convergence_status( self.consecutive_converges_count = 0 return False - def check_convergence(self, emitted_luminosity): + def _get_atom_data(self): + try: + self.atom_data = AtomData.from_hdf(self.atom_data_path) + except TypeError: + logger.debug("Atom Data Cannot be Read from HDF.") + + def estimate_t_inner( + self, + input_t_inner, + luminosity_requested, + emitted_luminosity, + t_inner_update_exponent=-0.5, + ): + luminosity_ratios = ( + (emitted_luminosity / luminosity_requested).to(1).value + ) + + return input_t_inner * luminosity_ratios**t_inner_update_exponent + + def get_convergence_estimates(self, emitted_luminosity): ( - estimated_t_rad, + estimated_t_radiative, estimated_dilution_factor, ) = self.transport_solver.transport_state.calculate_radiationfield_properties() @@ -78,22 +125,169 @@ def check_convergence(self, emitted_luminosity): emitted_luminosity, t_inner_update_exponent=self.convergence_strategy.t_inner_update_exponent, ) + return ( + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) + def check_convergence( + self, + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ): converged = self._get_convergence_status( self.simulation_state.t_radiative, self.simulation_state.dilution_factor, self.simulation_state.t_inner, - estimated_t_rad, + estimated_t_radiative, estimated_dilution_factor, estimated_t_inner, ) return converged + def solve_plasma( + self, + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ): + next_t_radiative = self.t_rad_convergence_solver.converge( + self.simulation_state.t_radiative, + estimated_t_radiative, + ) + next_dilution_factor = self.dilution_factor_convergence_solver.converge( + self.simulation_state.dilution_factor, + estimated_dilution_factor, + ) + if ( + self.iterations_executed + 1 + ) % self.convergence_strategy.lock_t_inner_cycles == 0: + next_t_inner = self.t_inner_convergence_solver.converge( + self.simulation_state.t_inner, + estimated_t_inner, + ) + else: + next_t_inner = self.simulation_state.t_inner + + self.simulation_state.t_radiative = next_t_radiative + self.simulation_state.dilution_factor = next_dilution_factor + self.simulation_state.blackbody_packet_source.temperature = next_t_inner + + update_properties = dict( + t_rad=self.simulation_state.t_radiative, + w=self.simulation_state.dilution_factor, + ) + # A check to see if the plasma is set with JBluesDetailed, in which + # case it needs some extra kwargs. + + estimators = self.transport.transport_state.radfield_mc_estimators + if "j_blue_estimator" in self.plasma.outputs_dict: + update_properties.update( + t_inner=next_t_inner, + j_blue_estimator=estimators.j_blue_estimator, + ) + if "gamma_estimator" in self.plasma.outputs_dict: + update_properties.update( + gamma_estimator=estimators.photo_ion_estimator, + alpha_stim_estimator=estimators.stim_recomb_estimator, + bf_heating_coeff_estimator=estimators.bf_heating_estimator, + stim_recomb_cooling_coeff_estimator=estimators.stim_recomb_cooling_estimator, + ) + + self.plasma_solver.update(**update_properties) + + def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets): + transport_state = self.transport_solver.initialize_transport_state( + self.simulation_state, + self.plasma_solver, + no_of_real_packets, + no_of_virtual_packets=no_of_virtual_packets, + iteration=self.completed_iterations, + ) + + virtual_packet_energies = self.transport.run( + transport_state, + time_explosion=self.simulation_state.time_explosion, + iteration=self.completed_iterations, + total_iterations=self.total_iterations, + show_progress_bars=self.show_progress_bars, + ) + + return transport_state, virtual_packet_energies + + def solve_spectrum( + self, + transport_state, + virtual_packet_energies=None, + integrated_spectrum_settings=None, + ): + # Set up spectrum solver + self.spectrum_solver.transport_state = transport_state + if virtual_packet_energies is not None: + self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( + virtual_packet_energies + ) + + if integrated_spectrum_settings is not None: + # Set up spectrum solver integrator + self.spectrum_solver.integrator_settings = ( + integrated_spectrum_settings + ) + self.spectrum_solver._integrator = FormalIntegrator( + self.simulation_state, self.plasma, self.transport + ) + + def calculate_emitted_luminosity(self, transport_state): + self.spectrum_solver.transport_state = transport_state + + output_energy = ( + self.transport.transport_state.packet_collection.output_energies + ) + if np.sum(output_energy < 0) == len(output_energy): + logger.critical("No r-packet escaped through the outer boundary.") + + emitted_luminosity = self.spectrum_solver.calculate_emitted_luminosity( + self.luminosity_nu_start, self.luminosity_nu_end + ) + return emitted_luminosity + def solve(self): - while not converged: - solve_plasma() - run_montecarlo() - converged = check_convergence() + converged = False + while self.completed_iterations < self.total_iterations - 1: + transport_state, virtual_packet_energies = self.solve_montecarlo() + + emitted_luminosity = self.calculate_emitted_luminosity( + transport_state + ) + + ( + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) = self.get_convergence_estimates(emitted_luminosity) - run_montecarlo(final=True) + self.solve_plasma( + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) + + converged = self.check_convergence( + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) + self.completed_iterations += 1 + + if converged and self.convergence_strategy.stop_if_converged: + break + + transport_state, virtual_packet_energies = self.solve_montecarlo() + self.solve_spectrum( + transport_state, + virtual_packet_energies, + self.integrated_spectrum_settings, + ) From b6628fc6147d71166fdfd66f49dd5d95a83224c1 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 12:18:36 -0400 Subject: [PATCH 03/61] Adds setup method, refactors some functions, removes unused items --- .../workflows/standard_simulation_solver.py | 251 +++++++++++------- 1 file changed, 155 insertions(+), 96 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 1e778d28b9f..4424620be75 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -1,11 +1,17 @@ import logging +from pathlib import Path import numpy as np from astropy import units as u +from tardis import constants as const from tardis.io.atom_data.base import AtomData +from tardis.model import SimulationState +from tardis.plasma.standard_plasmas import assemble_plasma from tardis.simulation.convergence import ConvergenceSolver +from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator +from tardis.transport.montecarlo.base import MonteCarloTransportSolver # logging support logger = logging.getLogger(__name__) @@ -19,7 +25,7 @@ def __init__(self, convergence_strategy, atom_data_path): self.spectrum_solver = None self.transport_solver = None self.plasma_solver = None - self.luminosity_requested = 0 * u.erg / u.s + self.virtual_packet_count = 0 self.integrated_spectrum_settings = None # Convergence @@ -28,6 +34,9 @@ def __init__(self, convergence_strategy, atom_data_path): self.converged = False self.total_iterations = 1 self.completed_iterations = 0 + self.luminosity_nu_start = 0 + self.luminosity_nu_end = 0 + self.luminosity_requested = 0 * u.erg / u.s # Convergence solvers self.t_radiative_convergence_solver = ConvergenceSolver( @@ -40,18 +49,73 @@ def __init__(self, convergence_strategy, atom_data_path): self.convergence_strategy.t_inner ) - def _get_convergence_status( + def _get_atom_data(self, configuration): + if "atom_data" in configuration: + if Path(configuration.atom_data).is_absolute(): + atom_data_fname = Path(configuration.atom_data) + else: + atom_data_fname = ( + Path(configuration.config_dirname) / configuration.atom_data + ) + + else: + raise ValueError("No atom_data option found in the configuration.") + + logger.info(f"\n\tReading Atomic Data from {atom_data_fname}") + + try: + atom_data = AtomData.from_hdf(atom_data_fname) + except TypeError as e: + print( + e, + "Error might be from the use of an old-format of the atomic database, \n" + "please see https://github.com/tardis-sn/tardis-refdata/tree/master/atom_data" + " for the most recent version.", + ) + raise + + return atom_data + + def estimate_t_inner( + self, + input_t_inner, + luminosity_requested, + emitted_luminosity, + t_inner_update_exponent=-0.5, + ): + luminosity_ratios = ( + (emitted_luminosity / luminosity_requested).to(1).value + ) + + return input_t_inner * luminosity_ratios**t_inner_update_exponent + + def get_convergence_estimates(self, emitted_luminosity): + ( + estimated_t_radiative, + estimated_dilution_factor, + ) = self.transport_solver.transport_state.calculate_radiationfield_properties() + + estimated_t_inner = self.estimate_t_inner( + self.simulation_state.t_inner, + self.luminosity_requested, + emitted_luminosity, + t_inner_update_exponent=self.convergence_strategy.t_inner_update_exponent, + ) + return ( + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) + + def check_convergence( self, - t_radiative, - dilution_factor, - t_inner, estimated_t_radiative, estimated_dilution_factor, estimated_t_inner, ): t_radiative_converged = ( self.t_radiative_convergence_solver.get_convergence_status( - t_radiative.value, + self.simulation_state.t_radiative.value, estimated_t_radiative.value, self.simulation_state.no_of_shells, ) @@ -59,7 +123,7 @@ def _get_convergence_status( dilution_factor_converged = ( self.dilution_factor_convergence_solver.get_convergence_status( - dilution_factor, + self.simulation_state.dilution_factor, estimated_dilution_factor, self.simulation_state.no_of_shells, ) @@ -67,7 +131,7 @@ def _get_convergence_status( t_inner_converged = ( self.t_inner_convergence_solver.get_convergence_status( - t_inner.value, + self.simulation_state.t_inner.value, estimated_t_inner.value, 1, ) @@ -94,67 +158,14 @@ def _get_convergence_status( self.consecutive_converges_count = 0 return False - def _get_atom_data(self): - try: - self.atom_data = AtomData.from_hdf(self.atom_data_path) - except TypeError: - logger.debug("Atom Data Cannot be Read from HDF.") - - def estimate_t_inner( - self, - input_t_inner, - luminosity_requested, - emitted_luminosity, - t_inner_update_exponent=-0.5, - ): - luminosity_ratios = ( - (emitted_luminosity / luminosity_requested).to(1).value - ) - - return input_t_inner * luminosity_ratios**t_inner_update_exponent - - def get_convergence_estimates(self, emitted_luminosity): - ( - estimated_t_radiative, - estimated_dilution_factor, - ) = self.transport_solver.transport_state.calculate_radiationfield_properties() - - estimated_t_inner = self.estimate_t_inner( - self.simulation_state.t_inner, - self.luminosity_requested, - emitted_luminosity, - t_inner_update_exponent=self.convergence_strategy.t_inner_update_exponent, - ) - return ( - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) - - def check_convergence( - self, - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ): - converged = self._get_convergence_status( - self.simulation_state.t_radiative, - self.simulation_state.dilution_factor, - self.simulation_state.t_inner, - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) - - return converged - def solve_plasma( self, + transport_state, estimated_t_radiative, estimated_dilution_factor, estimated_t_inner, ): - next_t_radiative = self.t_rad_convergence_solver.converge( + next_t_radiative = self.t_radiative_convergence_solver.converge( self.simulation_state.t_radiative, estimated_t_radiative, ) @@ -163,7 +174,7 @@ def solve_plasma( estimated_dilution_factor, ) if ( - self.iterations_executed + 1 + self.completed_iterations + 1 ) % self.convergence_strategy.lock_t_inner_cycles == 0: next_t_inner = self.t_inner_convergence_solver.converge( self.simulation_state.t_inner, @@ -182,24 +193,16 @@ def solve_plasma( ) # A check to see if the plasma is set with JBluesDetailed, in which # case it needs some extra kwargs. - - estimators = self.transport.transport_state.radfield_mc_estimators - if "j_blue_estimator" in self.plasma.outputs_dict: + estimators = transport_state.radfield_mc_estimators + if "j_blue_estimator" in self.plasma_solver.outputs_dict: update_properties.update( t_inner=next_t_inner, j_blue_estimator=estimators.j_blue_estimator, ) - if "gamma_estimator" in self.plasma.outputs_dict: - update_properties.update( - gamma_estimator=estimators.photo_ion_estimator, - alpha_stim_estimator=estimators.stim_recomb_estimator, - bf_heating_coeff_estimator=estimators.bf_heating_estimator, - stim_recomb_cooling_coeff_estimator=estimators.stim_recomb_cooling_estimator, - ) self.plasma_solver.update(**update_properties) - def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets): + def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): transport_state = self.transport_solver.initialize_transport_state( self.simulation_state, self.plasma_solver, @@ -208,59 +211,113 @@ def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets): iteration=self.completed_iterations, ) - virtual_packet_energies = self.transport.run( + virtual_packet_energies = self.transport_solver.run( transport_state, time_explosion=self.simulation_state.time_explosion, iteration=self.completed_iterations, total_iterations=self.total_iterations, - show_progress_bars=self.show_progress_bars, + show_progress_bars=False, ) return transport_state, virtual_packet_energies - def solve_spectrum( + def initialize_spectrum_solver( self, transport_state, virtual_packet_energies=None, - integrated_spectrum_settings=None, ): # Set up spectrum solver self.spectrum_solver.transport_state = transport_state + if virtual_packet_energies is not None: self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( virtual_packet_energies ) - if integrated_spectrum_settings is not None: + if self.integrated_spectrum_settings is not None: # Set up spectrum solver integrator self.spectrum_solver.integrator_settings = ( - integrated_spectrum_settings + self.integrated_spectrum_settings ) self.spectrum_solver._integrator = FormalIntegrator( self.simulation_state, self.plasma, self.transport ) - def calculate_emitted_luminosity(self, transport_state): - self.spectrum_solver.transport_state = transport_state + def setup_solver(self, configuration): + atom_data = self._get_atom_data(configuration) - output_energy = ( - self.transport.transport_state.packet_collection.output_energies + self.simulation_state = SimulationState.from_config( + configuration, + atom_data=atom_data, ) - if np.sum(output_energy < 0) == len(output_energy): - logger.critical("No r-packet escaped through the outer boundary.") - emitted_luminosity = self.spectrum_solver.calculate_emitted_luminosity( - self.luminosity_nu_start, self.luminosity_nu_end + self.plasma_solver = assemble_plasma( + configuration, + self.simulation_state, + atom_data=atom_data, ) - return emitted_luminosity + + self.transport_solver = MonteCarloTransportSolver.from_config( + configuration, + packet_source=self.simulation_state.packet_source, + enable_virtual_packet_logging=False, + ) + + self.luminosity_nu_start = ( + configuration.supernova.luminosity_wavelength_end.to( + u.Hz, u.spectral() + ) + ) + + if u.isclose( + configuration.supernova.luminosity_wavelength_start, 0 * u.angstrom + ): + self.luminosity_nu_end = np.inf * u.Hz + else: + self.luminosity_nu_end = ( + const.c / configuration.supernova.luminosity_wavelength_start + ).to(u.Hz) + + self.real_packet_count = configuration.montecarlo.no_of_packets + + final_iteration_packet_count = ( + configuration.montecarlo.last_no_of_packets + ) + + if ( + final_iteration_packet_count is None + or final_iteration_packet_count < 0 + ): + final_iteration_packet_count = self.real_packet_count + + self.final_iteration_packet_count = int(final_iteration_packet_count) + + self.virtual_packet_count = int( + configuration.montecarlo.no_of_virtual_packets + ) + + self.integrated_spectrum_settings = configuration.spectrum.integrated + self.spectrum_solver = SpectrumSolver.from_config(configuration) def solve(self): converged = False while self.completed_iterations < self.total_iterations - 1: - transport_state, virtual_packet_energies = self.solve_montecarlo() + transport_state, virtual_packet_energies = self.solve_montecarlo( + self.real_packet_count + ) - emitted_luminosity = self.calculate_emitted_luminosity( - transport_state + output_energy = transport_state.packet_collection.output_energies + if np.sum(output_energy < 0) == len(output_energy): + logger.critical( + "No r-packet escaped through the outer boundary." + ) + + self.spectrum_solver.transport_state = transport_state + + emitted_luminosity = ( + self.spectrum_solver.calculate_emitted_luminosity( + self.luminosity_nu_start, self.luminosity_nu_end + ) ) ( @@ -270,6 +327,7 @@ def solve(self): ) = self.get_convergence_estimates(emitted_luminosity) self.solve_plasma( + transport_state, estimated_t_radiative, estimated_dilution_factor, estimated_t_inner, @@ -285,9 +343,10 @@ def solve(self): if converged and self.convergence_strategy.stop_if_converged: break - transport_state, virtual_packet_energies = self.solve_montecarlo() - self.solve_spectrum( + transport_state, virtual_packet_energies = self.solve_montecarlo( + self.final_iteration_packet_count, self.virtual_packet_count + ) + self.initialize_spectrum_solver( transport_state, virtual_packet_energies, - self.integrated_spectrum_settings, ) From 1a67abaab57339eb398c8fcf101497561e3ac5e5 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 12:24:23 -0400 Subject: [PATCH 04/61] Move convergence setup to setup method --- .../workflows/standard_simulation_solver.py | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 4424620be75..948451d388a 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -18,8 +18,7 @@ class StandardSimulationSolver: - def __init__(self, convergence_strategy, atom_data_path): - self.atom_data_path = atom_data_path + def __init__(self): self.simulation_state = None self.atom_data = None self.spectrum_solver = None @@ -29,7 +28,7 @@ def __init__(self, convergence_strategy, atom_data_path): self.integrated_spectrum_settings = None # Convergence - self.convergence_strategy = convergence_strategy + self.convergence_strategy = None self.consecutive_converges_count = 0 self.converged = False self.total_iterations = 1 @@ -38,17 +37,6 @@ def __init__(self, convergence_strategy, atom_data_path): self.luminosity_nu_end = 0 self.luminosity_requested = 0 * u.erg / u.s - # Convergence solvers - self.t_radiative_convergence_solver = ConvergenceSolver( - self.convergence_strategy.t_radiative - ) - self.dilution_factor_convergence_solver = ConvergenceSolver( - self.convergence_strategy.dilution_factor - ) - self.t_inner_convergence_solver = ConvergenceSolver( - self.convergence_strategy.t_inner - ) - def _get_atom_data(self, configuration): if "atom_data" in configuration: if Path(configuration.atom_data).is_absolute(): @@ -240,7 +228,7 @@ def initialize_spectrum_solver( self.integrated_spectrum_settings ) self.spectrum_solver._integrator = FormalIntegrator( - self.simulation_state, self.plasma, self.transport + self.simulation_state, self.plasma_solver, self.transport_solver ) def setup_solver(self, configuration): @@ -299,6 +287,21 @@ def setup_solver(self, configuration): self.integrated_spectrum_settings = configuration.spectrum.integrated self.spectrum_solver = SpectrumSolver.from_config(configuration) + self.convergence_strategy = ( + configuration.montecarlo.convergence_strategy + ) + + # Convergence solvers + self.t_radiative_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_radiative + ) + self.dilution_factor_convergence_solver = ConvergenceSolver( + self.convergence_strategy.dilution_factor + ) + self.t_inner_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_inner + ) + def solve(self): converged = False while self.completed_iterations < self.total_iterations - 1: From 5008b80eaec5a8ce5f65a487fd60c14fa55a4131 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 13:07:41 -0400 Subject: [PATCH 05/61] Add docs notebook, fix a couple of errors --- docs/workflows/standard_workflow.ipynb | 119 ++++++++++++++++++ .../workflows/standard_simulation_solver.py | 4 +- 2 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 docs/workflows/standard_workflow.ipynb diff --git a/docs/workflows/standard_workflow.ipynb b/docs/workflows/standard_workflow.ipynb new file mode 100644 index 00000000000..6b0f14595fb --- /dev/null +++ b/docs/workflows/standard_workflow.ipynb @@ -0,0 +1,119 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tardis.workflows.standard_simulation_solver import StandardSimulationSolver\n", + "from tardis.io.configuration.config_reader import Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config = Configuration.from_yaml('../tardis_example.yml')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "solver = StandardSimulationSolver()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "solver.setup_solver(config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "solver.solve()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "spectrum = solver.spectrum_solver.spectrum_real_packets\n", + "spectrum_virtual = solver.spectrum_solver.spectrum_virtual_packets\n", + "spectrum_integrated = solver.spectrum_solver.spectrum_integrated" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "plt.figure(figsize=(10, 6.5))\n", + "\n", + "spectrum.plot(label=\"Normal packets\")\n", + "spectrum_virtual.plot(label=\"Virtual packets\")\n", + "spectrum_integrated.plot(label='Formal integral')\n", + "\n", + "plt.xlim(500, 9000)\n", + "plt.title(\"TARDIS example model spectrum\")\n", + "plt.xlabel(\"Wavelength [$\\AA$]\")\n", + "plt.ylabel(\"Luminosity density [erg/s/$\\AA$]\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tardis", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 948451d388a..0efff4e717e 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -293,10 +293,10 @@ def setup_solver(self, configuration): # Convergence solvers self.t_radiative_convergence_solver = ConvergenceSolver( - self.convergence_strategy.t_radiative + self.convergence_strategy.t_rad ) self.dilution_factor_convergence_solver = ConvergenceSolver( - self.convergence_strategy.dilution_factor + self.convergence_strategy.w ) self.t_inner_convergence_solver = ConvergenceSolver( self.convergence_strategy.t_inner From a95d547537865967ced2b1002ed1b756848af0b4 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 13:15:13 -0400 Subject: [PATCH 06/61] Move setup to init --- docs/workflows/standard_workflow.ipynb | 11 +- .../workflows/standard_simulation_solver.py | 155 ++++++++---------- 2 files changed, 72 insertions(+), 94 deletions(-) diff --git a/docs/workflows/standard_workflow.ipynb b/docs/workflows/standard_workflow.ipynb index 6b0f14595fb..2a35c2164a1 100644 --- a/docs/workflows/standard_workflow.ipynb +++ b/docs/workflows/standard_workflow.ipynb @@ -25,16 +25,7 @@ "metadata": {}, "outputs": [], "source": [ - "solver = StandardSimulationSolver()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "solver.setup_solver(config)" + "solver = StandardSimulationSolver(config)" ] }, { diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 0efff4e717e..2497ad20a73 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -18,24 +18,82 @@ class StandardSimulationSolver: - def __init__(self): - self.simulation_state = None - self.atom_data = None - self.spectrum_solver = None - self.transport_solver = None - self.plasma_solver = None - self.virtual_packet_count = 0 - self.integrated_spectrum_settings = None - + def __init__(self, configuration): # Convergence - self.convergence_strategy = None self.consecutive_converges_count = 0 self.converged = False self.total_iterations = 1 self.completed_iterations = 0 - self.luminosity_nu_start = 0 - self.luminosity_nu_end = 0 - self.luminosity_requested = 0 * u.erg / u.s + + atom_data = self._get_atom_data(configuration) + + self.simulation_state = SimulationState.from_config( + configuration, + atom_data=atom_data, + ) + + self.plasma_solver = assemble_plasma( + configuration, + self.simulation_state, + atom_data=atom_data, + ) + + self.transport_solver = MonteCarloTransportSolver.from_config( + configuration, + packet_source=self.simulation_state.packet_source, + enable_virtual_packet_logging=False, + ) + + self.luminosity_nu_start = ( + configuration.supernova.luminosity_wavelength_end.to( + u.Hz, u.spectral() + ) + ) + + if u.isclose( + configuration.supernova.luminosity_wavelength_start, 0 * u.angstrom + ): + self.luminosity_nu_end = np.inf * u.Hz + else: + self.luminosity_nu_end = ( + const.c / configuration.supernova.luminosity_wavelength_start + ).to(u.Hz) + + self.real_packet_count = configuration.montecarlo.no_of_packets + + final_iteration_packet_count = ( + configuration.montecarlo.last_no_of_packets + ) + + if ( + final_iteration_packet_count is None + or final_iteration_packet_count < 0 + ): + final_iteration_packet_count = self.real_packet_count + + self.final_iteration_packet_count = int(final_iteration_packet_count) + + self.virtual_packet_count = int( + configuration.montecarlo.no_of_virtual_packets + ) + + self.integrated_spectrum_settings = configuration.spectrum.integrated + self.spectrum_solver = SpectrumSolver.from_config(configuration) + + self.convergence_strategy = ( + configuration.montecarlo.convergence_strategy + ) + + # Convergence solvers + self.t_radiative_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_rad + ) + self.dilution_factor_convergence_solver = ConvergenceSolver( + self.convergence_strategy.w + ) + self.t_inner_convergence_solver = ConvergenceSolver( + self.convergence_strategy.t_inner + ) def _get_atom_data(self, configuration): if "atom_data" in configuration: @@ -231,77 +289,6 @@ def initialize_spectrum_solver( self.simulation_state, self.plasma_solver, self.transport_solver ) - def setup_solver(self, configuration): - atom_data = self._get_atom_data(configuration) - - self.simulation_state = SimulationState.from_config( - configuration, - atom_data=atom_data, - ) - - self.plasma_solver = assemble_plasma( - configuration, - self.simulation_state, - atom_data=atom_data, - ) - - self.transport_solver = MonteCarloTransportSolver.from_config( - configuration, - packet_source=self.simulation_state.packet_source, - enable_virtual_packet_logging=False, - ) - - self.luminosity_nu_start = ( - configuration.supernova.luminosity_wavelength_end.to( - u.Hz, u.spectral() - ) - ) - - if u.isclose( - configuration.supernova.luminosity_wavelength_start, 0 * u.angstrom - ): - self.luminosity_nu_end = np.inf * u.Hz - else: - self.luminosity_nu_end = ( - const.c / configuration.supernova.luminosity_wavelength_start - ).to(u.Hz) - - self.real_packet_count = configuration.montecarlo.no_of_packets - - final_iteration_packet_count = ( - configuration.montecarlo.last_no_of_packets - ) - - if ( - final_iteration_packet_count is None - or final_iteration_packet_count < 0 - ): - final_iteration_packet_count = self.real_packet_count - - self.final_iteration_packet_count = int(final_iteration_packet_count) - - self.virtual_packet_count = int( - configuration.montecarlo.no_of_virtual_packets - ) - - self.integrated_spectrum_settings = configuration.spectrum.integrated - self.spectrum_solver = SpectrumSolver.from_config(configuration) - - self.convergence_strategy = ( - configuration.montecarlo.convergence_strategy - ) - - # Convergence solvers - self.t_radiative_convergence_solver = ConvergenceSolver( - self.convergence_strategy.t_rad - ) - self.dilution_factor_convergence_solver = ConvergenceSolver( - self.convergence_strategy.w - ) - self.t_inner_convergence_solver = ConvergenceSolver( - self.convergence_strategy.t_inner - ) - def solve(self): converged = False while self.completed_iterations < self.total_iterations - 1: From d5f65cbbb20e9fa1455bb4c3da81013c7c4d1ebd Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 13:58:14 -0400 Subject: [PATCH 07/61] Fix iteration and convergence --- tardis/workflows/standard_simulation_solver.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 2497ad20a73..ebe4fdab44c 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -2,16 +2,20 @@ from pathlib import Path import numpy as np +import pandas as pd from astropy import units as u +from IPython.display import display from tardis import constants as const from tardis.io.atom_data.base import AtomData +from tardis.io.logger.logger import logging_state from tardis.model import SimulationState from tardis.plasma.standard_plasmas import assemble_plasma from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator from tardis.transport.montecarlo.base import MonteCarloTransportSolver +from tardis.util.base import is_notebook # logging support logger = logging.getLogger(__name__) @@ -22,11 +26,14 @@ def __init__(self, configuration): # Convergence self.consecutive_converges_count = 0 self.converged = False - self.total_iterations = 1 self.completed_iterations = 0 + self.luminosity_requested = ( + configuration.supernova.luminosity_requested.cgs + ) atom_data = self._get_atom_data(configuration) + # set up states and solvers self.simulation_state = SimulationState.from_config( configuration, atom_data=atom_data, @@ -59,7 +66,10 @@ def __init__(self, configuration): const.c / configuration.supernova.luminosity_wavelength_start ).to(u.Hz) - self.real_packet_count = configuration.montecarlo.no_of_packets + # montecarlo settings + self.total_iterations = int(configuration.montecarlo.iterations) + + self.real_packet_count = int(configuration.montecarlo.no_of_packets) final_iteration_packet_count = ( configuration.montecarlo.last_no_of_packets @@ -77,6 +87,7 @@ def __init__(self, configuration): configuration.montecarlo.no_of_virtual_packets ) + # spectrum settings self.integrated_spectrum_settings = configuration.spectrum.integrated self.spectrum_solver = SpectrumSolver.from_config(configuration) From 5a3c94e5d93f40bcfd318ffff0cd820805895b7f Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 14:20:02 -0400 Subject: [PATCH 08/61] Simplify spectrumsolver init --- tardis/simulation/base.py | 4 ---- tardis/spectrum/base.py | 7 ++++-- tardis/spectrum/tests/test_spectrum_solver.py | 6 ++--- .../workflows/standard_simulation_solver.py | 23 ++++++++----------- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/tardis/simulation/base.py b/tardis/simulation/base.py index f928e90018c..19fc3fd5729 100644 --- a/tardis/simulation/base.py +++ b/tardis/simulation/base.py @@ -140,7 +140,6 @@ def __init__( convergence_plots_kwargs, show_progress_bars, spectrum_solver, - integrator_settings, ): super(Simulation, self).__init__( iterations, simulation_state.no_of_shells @@ -159,7 +158,6 @@ def __init__( self.luminosity_nu_end = luminosity_nu_end self.luminosity_requested = luminosity_requested self.spectrum_solver = spectrum_solver - self.integrator_settings = integrator_settings self.show_progress_bars = show_progress_bars self.version = tardis.__version__ @@ -477,7 +475,6 @@ def run_final(self): self.iterate(self.last_no_of_packets, self.no_of_virtual_packets) # Set up spectrum solver integrator - self.spectrum_solver.integrator_settings = self.integrator_settings self.spectrum_solver._integrator = FormalIntegrator( self.simulation_state, self.plasma, self.transport ) @@ -771,6 +768,5 @@ def from_config( convergence_strategy=config.montecarlo.convergence_strategy, convergence_plots_kwargs=convergence_plots_kwargs, show_progress_bars=show_progress_bars, - integrator_settings=config.spectrum.integrated, spectrum_solver=spectrum_solver, ) diff --git a/tardis/spectrum/base.py b/tardis/spectrum/base.py index 8c6b4096674..ca913d50fd4 100644 --- a/tardis/spectrum/base.py +++ b/tardis/spectrum/base.py @@ -22,14 +22,16 @@ class SpectrumSolver(HDFWriterMixin): hdf_name = "spectrum" - def __init__(self, transport_state, spectrum_frequency_grid): + def __init__( + self, transport_state, spectrum_frequency_grid, integrator_settings + ): self.transport_state = transport_state self.spectrum_frequency_grid = spectrum_frequency_grid self._montecarlo_virtual_luminosity = u.Quantity( np.zeros_like(self.spectrum_frequency_grid.value), "erg / s" ) # should be init with v_packets_energy_hist self._integrator = None - self.integrator_settings = None + self.integrator_settings = integrator_settings self._spectrum_integrated = None @property @@ -189,4 +191,5 @@ def from_config(cls, config): return cls( transport_state=None, spectrum_frequency_grid=spectrum_frequency_grid, + integrator_settings=config.spectrum.integrated, ) diff --git a/tardis/spectrum/tests/test_spectrum_solver.py b/tardis/spectrum/tests/test_spectrum_solver.py index 001c6ac4230..818af1149f5 100644 --- a/tardis/spectrum/tests/test_spectrum_solver.py +++ b/tardis/spectrum/tests/test_spectrum_solver.py @@ -43,7 +43,7 @@ def test_initialization(self, simulation): transport_state = simulation.transport.transport_state spectrum_frequency_grid = simulation.transport.spectrum_frequency_grid - solver = SpectrumSolver(transport_state, spectrum_frequency_grid) + solver = SpectrumSolver(transport_state, spectrum_frequency_grid, None) assert solver.transport_state == transport_state assert np.array_equal( solver.spectrum_frequency_grid.value, spectrum_frequency_grid.value @@ -60,7 +60,7 @@ def test_spectrum_real_packets(self, simulation): transport_state = simulation.transport.transport_state spectrum_frequency_grid = simulation.transport.spectrum_frequency_grid - solver = SpectrumSolver(transport_state, spectrum_frequency_grid) + solver = SpectrumSolver(transport_state, spectrum_frequency_grid, None) result = solver.spectrum_real_packets.luminosity key = "simulation/spectrum_solver/spectrum_real_packets/luminosity" expected = self.get_expected_data(key) @@ -76,7 +76,7 @@ def test_spectrum_real_packets_reabsorbed(self, simulation): transport_state = simulation.transport.transport_state spectrum_frequency_grid = simulation.transport.spectrum_frequency_grid - solver = SpectrumSolver(transport_state, spectrum_frequency_grid) + solver = SpectrumSolver(transport_state, spectrum_frequency_grid, None) result = solver.spectrum_real_packets_reabsorbed.luminosity key = "simulation/spectrum_solver/spectrum_real_packets_reabsorbed/luminosity" expected = self.get_expected_data(key) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index ebe4fdab44c..6db092f34ed 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -2,20 +2,16 @@ from pathlib import Path import numpy as np -import pandas as pd from astropy import units as u -from IPython.display import display from tardis import constants as const from tardis.io.atom_data.base import AtomData -from tardis.io.logger.logger import logging_state from tardis.model import SimulationState from tardis.plasma.standard_plasmas import assemble_plasma from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator from tardis.transport.montecarlo.base import MonteCarloTransportSolver -from tardis.util.base import is_notebook # logging support logger = logging.getLogger(__name__) @@ -91,11 +87,11 @@ def __init__(self, configuration): self.integrated_spectrum_settings = configuration.spectrum.integrated self.spectrum_solver = SpectrumSolver.from_config(configuration) + # Convergence solvers self.convergence_strategy = ( configuration.montecarlo.convergence_strategy ) - # Convergence solvers self.t_radiative_convergence_solver = ConvergenceSolver( self.convergence_strategy.t_rad ) @@ -122,10 +118,9 @@ def _get_atom_data(self, configuration): try: atom_data = AtomData.from_hdf(atom_data_fname) - except TypeError as e: - print( - e, - "Error might be from the use of an old-format of the atomic database, \n" + except TypeError: + logger.exception( + "TypeError might be from the use of an old-format of the atomic database, \n" "please see https://github.com/tardis-sn/tardis-refdata/tree/master/atom_data" " for the most recent version.", ) @@ -150,7 +145,9 @@ def get_convergence_estimates(self, emitted_luminosity): ( estimated_t_radiative, estimated_dilution_factor, - ) = self.transport_solver.transport_state.calculate_radiationfield_properties() + ) = ( + self.transport_solver.transport_state.calculate_radiationfield_properties() + ) estimated_t_inner = self.estimate_t_inner( self.simulation_state.t_inner, @@ -287,9 +284,9 @@ def initialize_spectrum_solver( self.spectrum_solver.transport_state = transport_state if virtual_packet_energies is not None: - self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( - virtual_packet_energies - ) + self.spectrum_solver._montecarlo_virtual_luminosity.value[ + : + ] = virtual_packet_energies if self.integrated_spectrum_settings is not None: # Set up spectrum solver integrator From 4df9c41fcaf0233d54dd60873f6b3b52c906775f Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 14:30:34 -0400 Subject: [PATCH 09/61] Separate plasma "solver" and simulation state updates --- .../workflows/standard_simulation_solver.py | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 6db092f34ed..2791288db03 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -212,9 +212,8 @@ def check_convergence( self.consecutive_converges_count = 0 return False - def solve_plasma( + def solve_simulation_state( self, - transport_state, estimated_t_radiative, estimated_dilution_factor, estimated_t_inner, @@ -241,17 +240,20 @@ def solve_plasma( self.simulation_state.dilution_factor = next_dilution_factor self.simulation_state.blackbody_packet_source.temperature = next_t_inner + def solve_plasma( + self, + transport_state, + ): update_properties = dict( t_rad=self.simulation_state.t_radiative, w=self.simulation_state.dilution_factor, ) # A check to see if the plasma is set with JBluesDetailed, in which # case it needs some extra kwargs. - estimators = transport_state.radfield_mc_estimators if "j_blue_estimator" in self.plasma_solver.outputs_dict: update_properties.update( - t_inner=next_t_inner, - j_blue_estimator=estimators.j_blue_estimator, + t_inner=self.simulation_state.blackbody_packet_source.temperature, + j_blue_estimator=transport_state.radfield_mc_estimators.j_blue_estimator, ) self.plasma_solver.update(**update_properties) @@ -273,6 +275,10 @@ def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): show_progress_bars=False, ) + output_energy = transport_state.packet_collection.output_energies + if np.sum(output_energy < 0) == len(output_energy): + logger.critical("No r-packet escaped through the outer boundary.") + return transport_state, virtual_packet_energies def initialize_spectrum_solver( @@ -304,12 +310,6 @@ def solve(self): self.real_packet_count ) - output_energy = transport_state.packet_collection.output_energies - if np.sum(output_energy < 0) == len(output_energy): - logger.critical( - "No r-packet escaped through the outer boundary." - ) - self.spectrum_solver.transport_state = transport_state emitted_luminosity = ( @@ -324,13 +324,16 @@ def solve(self): estimated_t_inner, ) = self.get_convergence_estimates(emitted_luminosity) - self.solve_plasma( - transport_state, + self.solve_simulation_state( estimated_t_radiative, estimated_dilution_factor, estimated_t_inner, ) + self.solve_plasma( + transport_state, + ) + converged = self.check_convergence( estimated_t_radiative, estimated_dilution_factor, From 2d253c7fb8fcb45752fc935fcb88b6658ec00db8 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 15:02:31 -0400 Subject: [PATCH 10/61] Simplify convergence solver setup with a dict. --- .../workflows/standard_simulation_solver.py | 123 +++++++----------- 1 file changed, 46 insertions(+), 77 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 2791288db03..a485da532bb 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -92,13 +92,14 @@ def __init__(self, configuration): configuration.montecarlo.convergence_strategy ) - self.t_radiative_convergence_solver = ConvergenceSolver( + self.convergence_solvers = {} + self.convergence_solvers["t_radiative"] = ConvergenceSolver( self.convergence_strategy.t_rad ) - self.dilution_factor_convergence_solver = ConvergenceSolver( + self.convergence_solvers["dilution_factor"] = ConvergenceSolver( self.convergence_strategy.w ) - self.t_inner_convergence_solver = ConvergenceSolver( + self.convergence_solvers["t_inner"] = ConvergenceSolver( self.convergence_strategy.t_inner ) @@ -155,58 +156,37 @@ def get_convergence_estimates(self, emitted_luminosity): emitted_luminosity, t_inner_update_exponent=self.convergence_strategy.t_inner_update_exponent, ) - return ( - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) + return { + "t_radiative": estimated_t_radiative, + "dilution_factor": estimated_dilution_factor, + "t_inner": estimated_t_inner, + } def check_convergence( self, - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, + estimated_values, ): - t_radiative_converged = ( - self.t_radiative_convergence_solver.get_convergence_status( - self.simulation_state.t_radiative.value, - estimated_t_radiative.value, - self.simulation_state.no_of_shells, - ) - ) + convergence_statuses = [] - dilution_factor_converged = ( - self.dilution_factor_convergence_solver.get_convergence_status( - self.simulation_state.dilution_factor, - estimated_dilution_factor, - self.simulation_state.no_of_shells, + for key, solver in self.convergence_solvers.items(): + current_value = getattr(self.simulation_state, key) + estimated_value = estimated_values[key] + no_of_shells = ( + self.simulation_state.no_of_shells if key != "t_inner" else 1 ) - ) - - t_inner_converged = ( - self.t_inner_convergence_solver.get_convergence_status( - self.simulation_state.t_inner.value, - estimated_t_inner.value, - 1, + convergence_statuses.append( + solver.get_convergence_status( + current_value, estimated_value, no_of_shells + ) ) - ) - if np.all( - [ - t_radiative_converged, - dilution_factor_converged, - t_inner_converged, - ] - ): + if np.all(convergence_statuses): hold_iterations = self.convergence_strategy.hold_iterations self.consecutive_converges_count += 1 logger.info( f"Iteration converged {self.consecutive_converges_count:d}/{(hold_iterations + 1):d} consecutive " f"times." ) - # If an iteration has converged, require hold_iterations more - # iterations to converge before we conclude that the Simulation - # is converged. return self.consecutive_converges_count == hold_iterations + 1 self.consecutive_converges_count = 0 @@ -214,31 +194,28 @@ def check_convergence( def solve_simulation_state( self, - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, + estimated_values, ): - next_t_radiative = self.t_radiative_convergence_solver.converge( - self.simulation_state.t_radiative, - estimated_t_radiative, - ) - next_dilution_factor = self.dilution_factor_convergence_solver.converge( - self.simulation_state.dilution_factor, - estimated_dilution_factor, - ) - if ( - self.completed_iterations + 1 - ) % self.convergence_strategy.lock_t_inner_cycles == 0: - next_t_inner = self.t_inner_convergence_solver.converge( - self.simulation_state.t_inner, - estimated_t_inner, - ) - else: - next_t_inner = self.simulation_state.t_inner + next_values = {} + + for key, solver in self.convergence_solvers.items(): + if ( + key == "t_inner" + and (self.completed_iterations + 1) + % self.convergence_strategy.lock_t_inner_cycles + != 0 + ): + next_values[key] = getattr(self.simulation_state, key) + else: + next_values[key] = solver.converge( + getattr(self.simulation_state, key), estimated_values[key] + ) - self.simulation_state.t_radiative = next_t_radiative - self.simulation_state.dilution_factor = next_dilution_factor - self.simulation_state.blackbody_packet_source.temperature = next_t_inner + self.simulation_state.t_radiative = next_values["t_radiative"] + self.simulation_state.dilution_factor = next_values["dilution_factor"] + self.simulation_state.blackbody_packet_source.temperature = next_values[ + "t_inner" + ] def solve_plasma( self, @@ -318,27 +295,19 @@ def solve(self): ) ) - ( - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) = self.get_convergence_estimates(emitted_luminosity) + estimated_values = self.get_convergence_estimates( + emitted_luminosity + ) self.solve_simulation_state( - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, + estimated_values, ) self.solve_plasma( transport_state, ) - converged = self.check_convergence( - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) + converged = self.check_convergence(estimated_values) self.completed_iterations += 1 if converged and self.convergence_strategy.stop_if_converged: From 372b44b67e58dec934c888a229eaf3c88a9f6e25 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 23 Jul 2024 15:42:37 -0400 Subject: [PATCH 11/61] Minor formatting change --- tardis/workflows/standard_simulation_solver.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index a485da532bb..7aba3028ae9 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -299,13 +299,9 @@ def solve(self): emitted_luminosity ) - self.solve_simulation_state( - estimated_values, - ) + self.solve_simulation_state(estimated_values) - self.solve_plasma( - transport_state, - ) + self.solve_plasma(transport_state) converged = self.check_convergence(estimated_values) self.completed_iterations += 1 From 24943f4c865fbc11034fac4611478cec3719327d Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Wed, 24 Jul 2024 13:01:49 -0400 Subject: [PATCH 12/61] Minor refactoring --- .../workflows/standard_simulation_solver.py | 58 ++++++++----------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 7aba3028ae9..25f3e958a7d 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -129,33 +129,31 @@ def _get_atom_data(self, configuration): return atom_data - def estimate_t_inner( - self, - input_t_inner, - luminosity_requested, - emitted_luminosity, - t_inner_update_exponent=-0.5, - ): - luminosity_ratios = ( - (emitted_luminosity / luminosity_requested).to(1).value - ) - - return input_t_inner * luminosity_ratios**t_inner_update_exponent - - def get_convergence_estimates(self, emitted_luminosity): + def get_convergence_estimates(self, transport_state): ( estimated_t_radiative, estimated_dilution_factor, - ) = ( - self.transport_solver.transport_state.calculate_radiationfield_properties() + ) = self.transport_solver.transport_state.calculate_radiationfield_properties() + + self.initialize_spectrum_solver( + transport_state, + None, ) - estimated_t_inner = self.estimate_t_inner( - self.simulation_state.t_inner, - self.luminosity_requested, - emitted_luminosity, - t_inner_update_exponent=self.convergence_strategy.t_inner_update_exponent, + emitted_luminosity = self.spectrum_solver.calculate_emitted_luminosity( + self.luminosity_nu_start, self.luminosity_nu_end ) + + luminosity_ratios = ( + (emitted_luminosity / self.luminosity_requested).to(1).value + ) + + estimated_t_inner = ( + self.simulation_state.t_inner + * luminosity_ratios + ** self.convergence_strategy.t_inner_update_exponent + ) + return { "t_radiative": estimated_t_radiative, "dilution_factor": estimated_dilution_factor, @@ -267,9 +265,9 @@ def initialize_spectrum_solver( self.spectrum_solver.transport_state = transport_state if virtual_packet_energies is not None: - self.spectrum_solver._montecarlo_virtual_luminosity.value[ - : - ] = virtual_packet_energies + self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( + virtual_packet_energies + ) if self.integrated_spectrum_settings is not None: # Set up spectrum solver integrator @@ -287,17 +285,7 @@ def solve(self): self.real_packet_count ) - self.spectrum_solver.transport_state = transport_state - - emitted_luminosity = ( - self.spectrum_solver.calculate_emitted_luminosity( - self.luminosity_nu_start, self.luminosity_nu_end - ) - ) - - estimated_values = self.get_convergence_estimates( - emitted_luminosity - ) + estimated_values = self.get_convergence_estimates(transport_state) self.solve_simulation_state(estimated_values) From 5a1e45f03d56500512b84ad544e1bb6e4f2caa53 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 29 Jul 2024 12:16:26 -0400 Subject: [PATCH 13/61] Fixes plasma update step --- tardis/workflows/standard_simulation_solver.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 25f3e958a7d..70448834051 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -7,6 +7,7 @@ from tardis import constants as const from tardis.io.atom_data.base import AtomData from tardis.model import SimulationState +from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.plasma.standard_plasmas import assemble_plasma from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver @@ -219,9 +220,12 @@ def solve_plasma( self, transport_state, ): + radiation_field = DilutePlanckianRadiationField( + temperature=self.simulation_state.t_radiative, + dilution_factor=self.simulation_state.dilution_factor, + ) update_properties = dict( - t_rad=self.simulation_state.t_radiative, - w=self.simulation_state.dilution_factor, + dilute_planckian_radiation_field=radiation_field ) # A check to see if the plasma is set with JBluesDetailed, in which # case it needs some extra kwargs. @@ -244,7 +248,6 @@ def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): virtual_packet_energies = self.transport_solver.run( transport_state, - time_explosion=self.simulation_state.time_explosion, iteration=self.completed_iterations, total_iterations=self.total_iterations, show_progress_bars=False, From 6a457f4e6cf88fe35143528e8115e84474aae364 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 12:04:58 -0400 Subject: [PATCH 14/61] Fixes loggers and progress bars Also adds docstrings to methods. Updates some methods to use new functionality of the plasma. Adds requirements for the convergence plots (still broken) --- docs/workflows/standard_workflow.ipynb | 2 +- .../workflows/standard_simulation_solver.py | 383 ++++++++++++++++-- 2 files changed, 358 insertions(+), 27 deletions(-) diff --git a/docs/workflows/standard_workflow.ipynb b/docs/workflows/standard_workflow.ipynb index 2a35c2164a1..f8347a6c563 100644 --- a/docs/workflows/standard_workflow.ipynb +++ b/docs/workflows/standard_workflow.ipynb @@ -25,7 +25,7 @@ "metadata": {}, "outputs": [], "source": [ - "solver = StandardSimulationSolver(config)" + "solver = StandardSimulationSolver(config, show_convergence_plots=True,show_progress_bars=True)" ] }, { diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 70448834051..efe69becc12 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -2,31 +2,43 @@ from pathlib import Path import numpy as np +import pandas as pd from astropy import units as u +from IPython.display import display from tardis import constants as const from tardis.io.atom_data.base import AtomData +from tardis.io.logger.logger import logging_state from tardis.model import SimulationState from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.plasma.standard_plasmas import assemble_plasma from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator +from tardis.spectrum.luminosity import ( + calculate_filtered_luminosity, +) from tardis.transport.montecarlo.base import MonteCarloTransportSolver +from tardis.util.base import is_notebook +from tardis.visualization import ConvergencePlots # logging support logger = logging.getLogger(__name__) class StandardSimulationSolver: - def __init__(self, configuration): - # Convergence - self.consecutive_converges_count = 0 - self.converged = False - self.completed_iterations = 0 - self.luminosity_requested = ( - configuration.supernova.luminosity_requested.cgs - ) + def __init__( + self, + configuration, + log_level=None, + specific_log_level=None, + show_progress_bars=False, + show_convergence_plots=False, + convergence_plots_kwargs={}, + ): + # Logging + logging_state(log_level, configuration, specific_log_level) + self.show_progress_bars = show_progress_bars atom_data = self._get_atom_data(configuration) @@ -88,6 +100,14 @@ def __init__(self, configuration): self.integrated_spectrum_settings = configuration.spectrum.integrated self.spectrum_solver = SpectrumSolver.from_config(configuration) + # Convergence settings + self.consecutive_converges_count = 0 + self.converged = False + self.completed_iterations = 0 + self.luminosity_requested = ( + configuration.supernova.luminosity_requested.cgs + ) + # Convergence solvers self.convergence_strategy = ( configuration.montecarlo.convergence_strategy @@ -104,7 +124,52 @@ def __init__(self, configuration): self.convergence_strategy.t_inner ) + # Convergence plots + if show_convergence_plots: + if not is_notebook(): + raise RuntimeError( + "Convergence Plots cannot be displayed in command-line. Set show_convergence_plots " + "to False." + ) + + self.convergence_plots = ConvergencePlots( + iterations=self.total_iterations, **convergence_plots_kwargs + ) + else: + self.convergence_plots = None + + if "export_convergence_plots" in convergence_plots_kwargs: + if not isinstance( + convergence_plots_kwargs["export_convergence_plots"], + bool, + ): + raise TypeError( + "Expected bool in export_convergence_plots argument" + ) + self.export_convergence_plots = convergence_plots_kwargs[ + "export_convergence_plots" + ] + else: + self.export_convergence_plots = False + def _get_atom_data(self, configuration): + """Process atomic data from the configuration + + Parameters + ---------- + configuration : Configuration + TARDIS configuration object + + Returns + ------- + AtomData + Atomic data object + + Raises + ------ + ValueError + If atom data is missing from the configuration + """ if "atom_data" in configuration: if Path(configuration.atom_data).is_absolute(): atom_data_fname = Path(configuration.atom_data) @@ -131,20 +196,57 @@ def _get_atom_data(self, configuration): return atom_data def get_convergence_estimates(self, transport_state): - ( - estimated_t_radiative, - estimated_dilution_factor, - ) = self.transport_solver.transport_state.calculate_radiationfield_properties() + """Compute convergence estimates from the transport state + + Parameters + ---------- + transport_state : MonteCarloTransportState + Transport state object to compute estimates + + Returns + ------- + dict + Convergence estimates + EstimatedRadiationFieldProperties + Dilute radiation file and j_blues dataclass + """ + estimated_radfield_properties = ( + self.transport_solver.radfield_prop_solver.solve( + transport_state.radfield_mc_estimators, + transport_state.time_explosion, + transport_state.time_of_simulation, + transport_state.geometry_state.volume, + transport_state.opacity_state.line_list_nu, + ) + ) + estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor self.initialize_spectrum_solver( transport_state, None, ) - emitted_luminosity = self.spectrum_solver.calculate_emitted_luminosity( - self.luminosity_nu_start, self.luminosity_nu_end + emitted_luminosity = calculate_filtered_luminosity( + transport_state.emitted_packet_nu, + transport_state.emitted_packet_luminosity, + self.luminosity_nu_start, + self.luminosity_nu_end, + ) + absorbed_luminosity = calculate_filtered_luminosity( + transport_state.reabsorbed_packet_nu, + transport_state.reabsorbed_packet_luminosity, + self.luminosity_nu_start, + self.luminosity_nu_end, ) + if self.convergence_plots is not None: + self.update_convergence_plots( + emitted_luminosity, absorbed_luminosity + ) + + self.log_iteration_results(emitted_luminosity, absorbed_luminosity) + luminosity_ratios = ( (emitted_luminosity / self.luminosity_requested).to(1).value ) @@ -155,16 +257,37 @@ def get_convergence_estimates(self, transport_state): ** self.convergence_strategy.t_inner_update_exponent ) + self.log_plasma_state( + self.simulation_state.t_radiative, + self.simulation_state.dilution_factor, + self.simulation_state.t_inner, + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) + return { "t_radiative": estimated_t_radiative, "dilution_factor": estimated_dilution_factor, "t_inner": estimated_t_inner, - } + }, estimated_radfield_properties def check_convergence( self, estimated_values, ): + """Check convergence status for a dict of estimated values + + Parameters + ---------- + estimated_values : dict + Estimates to check convergence + + Returns + ------- + bool + If convergence has occurred + """ convergence_statuses = [] for key, solver in self.convergence_solvers.items(): @@ -191,10 +314,151 @@ def check_convergence( self.consecutive_converges_count = 0 return False + def update_convergence_plots(self, emitted_luminosity, absorbed_luminosity): + """Updates convergence plotting data + + Parameters + ---------- + emitted_luminosity : Quantity + Current iteration emitted luminosity + absorbed_luminosity : Quantity + Current iteration absorbed luminosity + """ + self.convergence_plots.fetch_data( + name="t_inner", + value=self.simulation_state.t_inner.value, + item_type="value", + ) + self.convergence_plots.fetch_data( + name="t_rad", + value=self.simulation_state.t_radiative, + item_type="iterable", + ) + self.convergence_plots.fetch_data( + name="w", + value=self.simulation_state.dilution_factor, + item_type="iterable", + ) + self.convergence_plots.fetch_data( + name="velocity", + value=self.simulation_state.velocity, + item_type="iterable", + ) + self.convergence_plots.fetch_data( + name="Emitted", + value=emitted_luminosity.value, + item_type="value", + ) + self.convergence_plots.fetch_data( + name="Absorbed", + value=absorbed_luminosity.value, + item_type="value", + ) + self.convergence_plots.fetch_data( + name="Requested", + value=self.luminosity_requested.value, + item_type="value", + ) + + def log_iteration_results(self, emitted_luminosity, absorbed_luminosity): + """Print current iteration information to log at INFO level + + Parameters + ---------- + emitted_luminosity : Quantity + Current iteration emitted luminosity + absorbed_luminosity : Quantity + Current iteration absorbed luminosity + """ + logger.info( + f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" + f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" + f"\tLuminosity requested = {self.luminosity_requested:.3e}\n" + ) + + def log_plasma_state( + self, + t_rad, + dilution_factor, + t_inner, + next_t_rad, + next_dilution_factor, + next_t_inner, + log_sampling=5, + ): + """ + Logging the change of the plasma state + + Parameters + ---------- + t_rad : astropy.units.Quanity + current t_rad + dilution_factor : np.ndarray + current dilution_factor + next_t_rad : astropy.units.Quanity + next t_rad + next_dilution_factor : np.ndarray + next dilution_factor + log_sampling : int + the n-th shells to be plotted + + Returns + ------- + """ + plasma_state_log = pd.DataFrame( + index=np.arange(len(t_rad)), + columns=["t_rad", "next_t_rad", "w", "next_w"], + ) + plasma_state_log["t_rad"] = t_rad + plasma_state_log["next_t_rad"] = next_t_rad + plasma_state_log["w"] = dilution_factor + plasma_state_log["next_w"] = next_dilution_factor + plasma_state_log.columns.name = "Shell No." + + if is_notebook(): + logger.info("\n\tPlasma stratification:") + + # Displaying the DataFrame only when the logging level is NOTSET, DEBUG or INFO + if logger.level <= logging.INFO: + if not logger.filters: + display( + plasma_state_log.iloc[::log_sampling].style.format( + "{:.3g}" + ) + ) + elif logger.filters[0].log_level == 20: + display( + plasma_state_log.iloc[::log_sampling].style.format( + "{:.3g}" + ) + ) + else: + output_df = "" + plasma_output = plasma_state_log.iloc[::log_sampling].to_string( + float_format=lambda x: f"{x:.3g}", + justify="center", + ) + for value in plasma_output.split("\n"): + output_df = output_df + f"\t{value}\n" + logger.info("\n\tPlasma stratification:") + logger.info(f"\n{output_df}") + + logger.info( + f"\n\tCurrent t_inner = {t_inner:.3f}\n\tExpected t_inner for next iteration = {next_t_inner:.3f}\n" + ) + def solve_simulation_state( self, estimated_values, ): + """Update the simulation state with new inputs computed from previous + iteration estimates. + + Parameters + ---------- + estimated_values : dict + Estimated from the previous iterations + """ next_values = {} for key, solver in self.convergence_solvers.items(): @@ -216,10 +480,19 @@ def solve_simulation_state( "t_inner" ] - def solve_plasma( - self, - transport_state, - ): + def solve_plasma(self, estimated_radfield_properties): + """Update the plasma solution with the new radiation field estimates + + Parameters + ---------- + estimated_radfield_properties : EstimatedRadiationFieldProperties + The radiation field properties to use for updating the plasma + + Raises + ------ + ValueError + If the plasma solver radiative rates type is unknown + """ radiation_field = DilutePlanckianRadiationField( temperature=self.simulation_state.t_radiative, dilution_factor=self.simulation_state.dilution_factor, @@ -229,15 +502,61 @@ def solve_plasma( ) # A check to see if the plasma is set with JBluesDetailed, in which # case it needs some extra kwargs. - if "j_blue_estimator" in self.plasma_solver.outputs_dict: - update_properties.update( - t_inner=self.simulation_state.blackbody_packet_source.temperature, - j_blue_estimator=transport_state.radfield_mc_estimators.j_blue_estimator, + if ( + self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE + == "blackbody" + ): + planckian_radiation_field = ( + radiation_field.to_planckian_radiation_field() + ) + j_blues = planckian_radiation_field.calculate_mean_intensity( + self.plasma_solver.atomic_data.lines.nu.values + ) + update_properties["j_blues"] = pd.DataFrame( + j_blues, index=self.plasma_solver.atomic_data.lines.index + ) + elif ( + self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE + == "dilute-blackbody" + ): + j_blues = radiation_field.calculate_mean_intensity( + self.plasma_solver.atomic_data.lines.nu.values + ) + update_properties["j_blues"] = pd.DataFrame( + j_blues, index=self.plasma_solver.atomic_data.lines.index + ) + elif ( + self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE + == "detailed" + ): + update_properties["j_blues"] = pd.DataFrame( + estimated_radfield_properties.j_blues, + index=self.plasma_solver.atomic_data.lines.index, + ) + else: + raise ValueError( + f"radiative_rates_type type unknown - {self.plasma.plasma_solver_settings.RADIATIVE_RATES_TYPE}" ) self.plasma_solver.update(**update_properties) def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): + """Solve the MonteCarlo process + + Parameters + ---------- + no_of_real_packets : int + Number of real packets to simulate + no_of_virtual_packets : int, optional + Number of virtual packets to simulate per interaction, by default 0 + + Returns + ------- + MonteCarloTransportState + The new transport state after simulation + ndarray + Array of unnormalized virtual packet energies in each frequency bin + """ transport_state = self.transport_solver.initialize_transport_state( self.simulation_state, self.plasma_solver, @@ -250,7 +569,7 @@ def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): transport_state, iteration=self.completed_iterations, total_iterations=self.total_iterations, - show_progress_bars=False, + show_progress_bars=self.show_progress_bars, ) output_energy = transport_state.packet_collection.output_energies @@ -264,6 +583,15 @@ def initialize_spectrum_solver( transport_state, virtual_packet_energies=None, ): + """Set up the spectrum solver + + Parameters + ---------- + transport_state : MonteCarloTransportState + The transport state to init with + virtual_packet_energies : ndarray, optional + Array of virtual packet energies binned by frequency, by default None + """ # Set up spectrum solver self.spectrum_solver.transport_state = transport_state @@ -282,17 +610,20 @@ def initialize_spectrum_solver( ) def solve(self): + """Solve the TARDIS simulation until convergence is reached""" converged = False while self.completed_iterations < self.total_iterations - 1: transport_state, virtual_packet_energies = self.solve_montecarlo( self.real_packet_count ) - estimated_values = self.get_convergence_estimates(transport_state) + estimated_values, estimated_radfield_properties = ( + self.get_convergence_estimates(transport_state) + ) self.solve_simulation_state(estimated_values) - self.solve_plasma(transport_state) + self.solve_plasma(estimated_radfield_properties) converged = self.check_convergence(estimated_values) self.completed_iterations += 1 From cf4951812f475ae4d5a389d898fb24895d15f5a7 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 12:39:00 -0400 Subject: [PATCH 15/61] Fixes convergence plot rendering --- tardis/workflows/standard_simulation_solver.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index efe69becc12..45685e59f11 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -359,6 +359,7 @@ def update_convergence_plots(self, emitted_luminosity, absorbed_luminosity): value=self.luminosity_requested.value, item_type="value", ) + self.convergence_plots.update() def log_iteration_results(self, emitted_luminosity, absorbed_luminosity): """Print current iteration information to log at INFO level @@ -613,6 +614,9 @@ def solve(self): """Solve the TARDIS simulation until convergence is reached""" converged = False while self.completed_iterations < self.total_iterations - 1: + logger.info( + f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" + ) transport_state, virtual_packet_energies = self.solve_montecarlo( self.real_packet_count ) @@ -631,6 +635,7 @@ def solve(self): if converged and self.convergence_strategy.stop_if_converged: break + logger.info(f"\n\tStarting final iteration") transport_state, virtual_packet_energies = self.solve_montecarlo( self.final_iteration_packet_count, self.virtual_packet_count ) From 85403c5625f24b7f251ec0b73be188a283dec24f Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 12:54:30 -0400 Subject: [PATCH 16/61] Fixes convergence plots in the final iteration --- .../workflows/standard_simulation_solver.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 45685e59f11..aa3fb8a82b7 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -30,6 +30,7 @@ class StandardSimulationSolver: def __init__( self, configuration, + enable_virtual_packet_logging=False, log_level=None, specific_log_level=None, show_progress_bars=False, @@ -57,7 +58,7 @@ def __init__( self.transport_solver = MonteCarloTransportSolver.from_config( configuration, packet_source=self.simulation_state.packet_source, - enable_virtual_packet_logging=False, + enable_virtual_packet_logging=enable_virtual_packet_logging, ) self.luminosity_nu_start = ( @@ -241,7 +242,7 @@ def get_convergence_estimates(self, transport_state): ) if self.convergence_plots is not None: - self.update_convergence_plots( + self.update_convergence_plot_data( emitted_luminosity, absorbed_luminosity ) @@ -314,7 +315,9 @@ def check_convergence( self.consecutive_converges_count = 0 return False - def update_convergence_plots(self, emitted_luminosity, absorbed_luminosity): + def update_convergence_plot_data( + self, emitted_luminosity, absorbed_luminosity + ): """Updates convergence plotting data Parameters @@ -359,7 +362,6 @@ def update_convergence_plots(self, emitted_luminosity, absorbed_luminosity): value=self.luminosity_requested.value, item_type="value", ) - self.convergence_plots.update() def log_iteration_results(self, emitted_luminosity, absorbed_luminosity): """Print current iteration information to log at INFO level @@ -625,6 +627,9 @@ def solve(self): self.get_convergence_estimates(transport_state) ) + if self.convergence_plots is not None: + self.convergence_plots.update() + self.solve_simulation_state(estimated_values) self.solve_plasma(estimated_radfield_properties) @@ -639,6 +644,12 @@ def solve(self): transport_state, virtual_packet_energies = self.solve_montecarlo( self.final_iteration_packet_count, self.virtual_packet_count ) + if self.convergence_plots is not None: + self.get_convergence_estimates(transport_state) + self.convergence_plots.update( + export_convergence_plots=self.export_convergence_plots, + last=True, + ) self.initialize_spectrum_solver( transport_state, virtual_packet_energies, From 858ab1d97e82f47e0cb8995d757a25a582c1fa51 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 13:06:40 -0400 Subject: [PATCH 17/61] black --- .../workflows/standard_simulation_solver.py | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index aa3fb8a82b7..fae2b83e6fe 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -221,8 +221,12 @@ def get_convergence_estimates(self, transport_state): ) ) - estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + estimated_t_radiative = ( + estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + ) + estimated_dilution_factor = ( + estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + ) self.initialize_spectrum_solver( transport_state, None, @@ -599,9 +603,9 @@ def initialize_spectrum_solver( self.spectrum_solver.transport_state = transport_state if virtual_packet_energies is not None: - self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( - virtual_packet_energies - ) + self.spectrum_solver._montecarlo_virtual_luminosity.value[ + : + ] = virtual_packet_energies if self.integrated_spectrum_settings is not None: # Set up spectrum solver integrator @@ -623,9 +627,10 @@ def solve(self): self.real_packet_count ) - estimated_values, estimated_radfield_properties = ( - self.get_convergence_estimates(transport_state) - ) + ( + estimated_values, + estimated_radfield_properties, + ) = self.get_convergence_estimates(transport_state) if self.convergence_plots is not None: self.convergence_plots.update() From 9b10be6d51cc21fbce797a49311a260c4215b4ab Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 13:31:54 -0400 Subject: [PATCH 18/61] Simplify convergence plot updating --- .../workflows/standard_simulation_solver.py | 64 ++++++------------- 1 file changed, 19 insertions(+), 45 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index fae2b83e6fe..114b160cb59 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -246,9 +246,16 @@ def get_convergence_estimates(self, transport_state): ) if self.convergence_plots is not None: - self.update_convergence_plot_data( - emitted_luminosity, absorbed_luminosity - ) + plot_data = { + "t_inner": [self.simulation_state.t_inner.value, "value"], + "t_rad": [self.simulation_state.t_radiative, "iterable"], + "w": [self.simulation_state.dilution_factor, "iterable"], + "velocity": [self.simulation_state.velocity, "iterable"], + "Emitted": [emitted_luminosity.value, "value"], + "Absorbed": [absorbed_luminosity.value, "value"], + "Requested": [self.luminosity_requested.value, "value"], + } + self.update_convergence_plot_data(plot_data) self.log_iteration_results(emitted_luminosity, absorbed_luminosity) @@ -319,53 +326,20 @@ def check_convergence( self.consecutive_converges_count = 0 return False - def update_convergence_plot_data( - self, emitted_luminosity, absorbed_luminosity - ): + def update_convergence_plot_data(self, plot_data_dict): """Updates convergence plotting data Parameters ---------- - emitted_luminosity : Quantity - Current iteration emitted luminosity - absorbed_luminosity : Quantity - Current iteration absorbed luminosity + plot_data_dict : dict + Dictionary of data to update of the form {"name": [value, item_type]} """ - self.convergence_plots.fetch_data( - name="t_inner", - value=self.simulation_state.t_inner.value, - item_type="value", - ) - self.convergence_plots.fetch_data( - name="t_rad", - value=self.simulation_state.t_radiative, - item_type="iterable", - ) - self.convergence_plots.fetch_data( - name="w", - value=self.simulation_state.dilution_factor, - item_type="iterable", - ) - self.convergence_plots.fetch_data( - name="velocity", - value=self.simulation_state.velocity, - item_type="iterable", - ) - self.convergence_plots.fetch_data( - name="Emitted", - value=emitted_luminosity.value, - item_type="value", - ) - self.convergence_plots.fetch_data( - name="Absorbed", - value=absorbed_luminosity.value, - item_type="value", - ) - self.convergence_plots.fetch_data( - name="Requested", - value=self.luminosity_requested.value, - item_type="value", - ) + for name, (value, item_type) in plot_data_dict.items(): + self.convergence_plots.fetch_data( + name=name, + value=value, + item_type=item_type, + ) def log_iteration_results(self, emitted_luminosity, absorbed_luminosity): """Print current iteration information to log at INFO level From a521c10b44c74bdf27d8a911530653be0b339225 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 14:01:52 -0400 Subject: [PATCH 19/61] Move logging handling to a separate class --- .../workflows/standard_simulation_solver.py | 109 ++--------------- tardis/workflows/workflow_logging.py | 111 ++++++++++++++++++ 2 files changed, 123 insertions(+), 97 deletions(-) create mode 100644 tardis/workflows/workflow_logging.py diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 114b160cb59..1d2102950c5 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -4,11 +4,9 @@ import numpy as np import pandas as pd from astropy import units as u -from IPython.display import display from tardis import constants as const from tardis.io.atom_data.base import AtomData -from tardis.io.logger.logger import logging_state from tardis.model import SimulationState from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.plasma.standard_plasmas import assemble_plasma @@ -21,12 +19,13 @@ from tardis.transport.montecarlo.base import MonteCarloTransportSolver from tardis.util.base import is_notebook from tardis.visualization import ConvergencePlots +from tardis.workflows.workflow_logging import WorkflowLogging # logging support logger = logging.getLogger(__name__) -class StandardSimulationSolver: +class StandardSimulationSolver(WorkflowLogging): def __init__( self, configuration, @@ -37,8 +36,12 @@ def __init__( show_convergence_plots=False, convergence_plots_kwargs={}, ): - # Logging - logging_state(log_level, configuration, specific_log_level) + # set up logging + super().__init__( + configuration, + log_level=log_level, + specific_log_level=specific_log_level, + ) self.show_progress_bars = show_progress_bars atom_data = self._get_atom_data(configuration) @@ -61,6 +64,7 @@ def __init__( enable_virtual_packet_logging=enable_virtual_packet_logging, ) + # Luminosity filter frequencies self.luminosity_nu_start = ( configuration.supernova.luminosity_wavelength_end.to( u.Hz, u.spectral() @@ -227,10 +231,6 @@ def get_convergence_estimates(self, transport_state): estimated_dilution_factor = ( estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor ) - self.initialize_spectrum_solver( - transport_state, - None, - ) emitted_luminosity = calculate_filtered_luminosity( transport_state.emitted_packet_nu, @@ -257,7 +257,9 @@ def get_convergence_estimates(self, transport_state): } self.update_convergence_plot_data(plot_data) - self.log_iteration_results(emitted_luminosity, absorbed_luminosity) + self.log_iteration_results( + emitted_luminosity, absorbed_luminosity, self.luminosity_requested + ) luminosity_ratios = ( (emitted_luminosity / self.luminosity_requested).to(1).value @@ -341,93 +343,6 @@ def update_convergence_plot_data(self, plot_data_dict): item_type=item_type, ) - def log_iteration_results(self, emitted_luminosity, absorbed_luminosity): - """Print current iteration information to log at INFO level - - Parameters - ---------- - emitted_luminosity : Quantity - Current iteration emitted luminosity - absorbed_luminosity : Quantity - Current iteration absorbed luminosity - """ - logger.info( - f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" - f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" - f"\tLuminosity requested = {self.luminosity_requested:.3e}\n" - ) - - def log_plasma_state( - self, - t_rad, - dilution_factor, - t_inner, - next_t_rad, - next_dilution_factor, - next_t_inner, - log_sampling=5, - ): - """ - Logging the change of the plasma state - - Parameters - ---------- - t_rad : astropy.units.Quanity - current t_rad - dilution_factor : np.ndarray - current dilution_factor - next_t_rad : astropy.units.Quanity - next t_rad - next_dilution_factor : np.ndarray - next dilution_factor - log_sampling : int - the n-th shells to be plotted - - Returns - ------- - """ - plasma_state_log = pd.DataFrame( - index=np.arange(len(t_rad)), - columns=["t_rad", "next_t_rad", "w", "next_w"], - ) - plasma_state_log["t_rad"] = t_rad - plasma_state_log["next_t_rad"] = next_t_rad - plasma_state_log["w"] = dilution_factor - plasma_state_log["next_w"] = next_dilution_factor - plasma_state_log.columns.name = "Shell No." - - if is_notebook(): - logger.info("\n\tPlasma stratification:") - - # Displaying the DataFrame only when the logging level is NOTSET, DEBUG or INFO - if logger.level <= logging.INFO: - if not logger.filters: - display( - plasma_state_log.iloc[::log_sampling].style.format( - "{:.3g}" - ) - ) - elif logger.filters[0].log_level == 20: - display( - plasma_state_log.iloc[::log_sampling].style.format( - "{:.3g}" - ) - ) - else: - output_df = "" - plasma_output = plasma_state_log.iloc[::log_sampling].to_string( - float_format=lambda x: f"{x:.3g}", - justify="center", - ) - for value in plasma_output.split("\n"): - output_df = output_df + f"\t{value}\n" - logger.info("\n\tPlasma stratification:") - logger.info(f"\n{output_df}") - - logger.info( - f"\n\tCurrent t_inner = {t_inner:.3f}\n\tExpected t_inner for next iteration = {next_t_inner:.3f}\n" - ) - def solve_simulation_state( self, estimated_values, diff --git a/tardis/workflows/workflow_logging.py b/tardis/workflows/workflow_logging.py new file mode 100644 index 00000000000..1a77b4c9406 --- /dev/null +++ b/tardis/workflows/workflow_logging.py @@ -0,0 +1,111 @@ +import logging + +import numpy as np +import pandas as pd +from IPython.display import display + +from tardis.io.logger.logger import logging_state +from tardis.util.base import is_notebook + +logger = logging.getLogger(__name__) + + +class WorkflowLogging: + def __init__( + self, + configuration, + log_level=None, + specific_log_level=None, + ): + logging_state(log_level, configuration, specific_log_level) + + def log_iteration_results( + self, emitted_luminosity, absorbed_luminosity, luminosity_requested + ): + """Print current iteration information to log at INFO level + + Parameters + ---------- + emitted_luminosity : Quantity + Current iteration emitted luminosity + absorbed_luminosity : Quantity + Current iteration absorbed luminosity + luminosity_requested : Quantity + The requested luminosity for the simulation + """ + logger.info( + f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" + f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" + f"\tLuminosity requested = {luminosity_requested:.3e}\n" + ) + + def log_plasma_state( + self, + t_rad, + dilution_factor, + t_inner, + next_t_rad, + next_dilution_factor, + next_t_inner, + log_sampling=5, + ): + """ + Logging the change of the plasma state + + Parameters + ---------- + t_rad : astropy.units.Quanity + current t_rad + dilution_factor : np.ndarray + current dilution_factor + next_t_rad : astropy.units.Quanity + next t_rad + next_dilution_factor : np.ndarray + next dilution_factor + log_sampling : int + the n-th shells to be plotted + + Returns + ------- + """ + plasma_state_log = pd.DataFrame( + index=np.arange(len(t_rad)), + columns=["t_rad", "next_t_rad", "w", "next_w"], + ) + plasma_state_log["t_rad"] = t_rad + plasma_state_log["next_t_rad"] = next_t_rad + plasma_state_log["w"] = dilution_factor + plasma_state_log["next_w"] = next_dilution_factor + plasma_state_log.columns.name = "Shell No." + + if is_notebook(): + logger.info("\n\tPlasma stratification:") + + # Displaying the DataFrame only when the logging level is NOTSET, DEBUG or INFO + if logger.level <= logging.INFO: + if not logger.filters: + display( + plasma_state_log.iloc[::log_sampling].style.format( + "{:.3g}" + ) + ) + elif logger.filters[0].log_level == 20: + display( + plasma_state_log.iloc[::log_sampling].style.format( + "{:.3g}" + ) + ) + else: + output_df = "" + plasma_output = plasma_state_log.iloc[::log_sampling].to_string( + float_format=lambda x: f"{x:.3g}", + justify="center", + ) + for value in plasma_output.split("\n"): + output_df = output_df + f"\t{value}\n" + logger.info("\n\tPlasma stratification:") + logger.info(f"\n{output_df}") + + logger.info( + f"\n\tCurrent t_inner = {t_inner:.3f}\n\tExpected t_inner for next iteration = {next_t_inner:.3f}\n" + ) From 8f4955ea6e899a99c955d15fbf162d51f5e5a63a Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 14:27:55 -0400 Subject: [PATCH 20/61] Add HDF output capability to solver --- .../workflows/standard_simulation_solver.py | 45 +++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 1d2102950c5..5ffb6ebda5a 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -7,9 +7,11 @@ from tardis import constants as const from tardis.io.atom_data.base import AtomData +from tardis.io.util import HDFWriterMixin from tardis.model import SimulationState from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.plasma.standard_plasmas import assemble_plasma +from tardis.simulation.base import PlasmaStateStorerMixin from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator @@ -25,7 +27,20 @@ logger = logging.getLogger(__name__) -class StandardSimulationSolver(WorkflowLogging): +class StandardSimulationSolver( + WorkflowLogging, PlasmaStateStorerMixin, HDFWriterMixin +): + hdf_properties = [ + "simulation_state", + "plasma_solver", + "transport_solver", + "iterations_w", + "iterations_t_rad", + "iterations_electron_densities", + "iterations_t_inner", + "spectrum_solver", + ] + def __init__( self, configuration, @@ -37,11 +52,13 @@ def __init__( convergence_plots_kwargs={}, ): # set up logging - super().__init__( - configuration, + WorkflowLogging.__init__( + self, + configuration=configuration, log_level=log_level, specific_log_level=specific_log_level, ) + self.show_progress_bars = show_progress_bars atom_data = self._get_atom_data(configuration) @@ -101,6 +118,13 @@ def __init__( configuration.montecarlo.no_of_virtual_packets ) + # set up plasma storage + PlasmaStateStorerMixin.__init__( + self, + iterations=self.total_iterations, + no_of_shells=self.simulation_state.no_of_shells, + ) + # spectrum settings self.integrated_spectrum_settings = configuration.spectrum.integrated self.spectrum_solver = SpectrumSolver.from_config(configuration) @@ -512,6 +536,13 @@ def solve(self): logger.info( f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" ) + self.store_plasma_state( + self.completed_iterations, + self.simulation_state.dilution_factor, + self.simulation_state.t_radiative, + self.plasma_solver.electron_densities, + self.simulation_state.t_inner, + ) transport_state, virtual_packet_energies = self.solve_montecarlo( self.real_packet_count ) @@ -538,6 +569,14 @@ def solve(self): transport_state, virtual_packet_energies = self.solve_montecarlo( self.final_iteration_packet_count, self.virtual_packet_count ) + self.store_plasma_state( + self.completed_iterations, + self.simulation_state.dilution_factor, + self.simulation_state.t_radiative, + self.plasma_solver.electron_densities, + self.simulation_state.t_inner, + ) + self.reshape_plasma_state_store(self.completed_iterations) if self.convergence_plots is not None: self.get_convergence_estimates(transport_state) self.convergence_plots.update( From b02390d4cc5f0f336a40c67b5345c90c39182c4d Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 15:23:15 -0400 Subject: [PATCH 21/61] Move more basic logging back into workflow --- .../workflows/standard_simulation_solver.py | 6 ++++-- tardis/workflows/workflow_logging.py | 20 ------------------- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 5ffb6ebda5a..9101c8f13a9 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -281,8 +281,10 @@ def get_convergence_estimates(self, transport_state): } self.update_convergence_plot_data(plot_data) - self.log_iteration_results( - emitted_luminosity, absorbed_luminosity, self.luminosity_requested + logger.info( + f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" + f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" + f"\tLuminosity requested = {self.luminosity_requested:.3e}\n" ) luminosity_ratios = ( diff --git a/tardis/workflows/workflow_logging.py b/tardis/workflows/workflow_logging.py index 1a77b4c9406..2dc464fe3b9 100644 --- a/tardis/workflows/workflow_logging.py +++ b/tardis/workflows/workflow_logging.py @@ -19,26 +19,6 @@ def __init__( ): logging_state(log_level, configuration, specific_log_level) - def log_iteration_results( - self, emitted_luminosity, absorbed_luminosity, luminosity_requested - ): - """Print current iteration information to log at INFO level - - Parameters - ---------- - emitted_luminosity : Quantity - Current iteration emitted luminosity - absorbed_luminosity : Quantity - Current iteration absorbed luminosity - luminosity_requested : Quantity - The requested luminosity for the simulation - """ - logger.info( - f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" - f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" - f"\tLuminosity requested = {luminosity_requested:.3e}\n" - ) - def log_plasma_state( self, t_rad, From 426459ad2257fc86d36ea3a7275fe7d2c35bfd2d Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 15:25:05 -0400 Subject: [PATCH 22/61] Add not-converged error message --- tardis/workflows/standard_simulation_solver.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/standard_simulation_solver.py index 9101c8f13a9..8af19ce8704 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/standard_simulation_solver.py @@ -567,7 +567,12 @@ def solve(self): if converged and self.convergence_strategy.stop_if_converged: break - logger.info(f"\n\tStarting final iteration") + if converged: + logger.info("\n\tStarting final iteration") + else: + logger.error( + "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" + ) transport_state, virtual_packet_energies = self.solve_montecarlo( self.final_iteration_packet_count, self.virtual_packet_count ) From 8d45b7d0641e47134f4cc51156eb1e91f16eb086 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Mon, 12 Aug 2024 15:26:56 -0400 Subject: [PATCH 23/61] Update notebook with export option --- docs/workflows/standard_workflow.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/workflows/standard_workflow.ipynb b/docs/workflows/standard_workflow.ipynb index f8347a6c563..4577f8eb574 100644 --- a/docs/workflows/standard_workflow.ipynb +++ b/docs/workflows/standard_workflow.ipynb @@ -25,7 +25,7 @@ "metadata": {}, "outputs": [], "source": [ - "solver = StandardSimulationSolver(config, show_convergence_plots=True,show_progress_bars=True)" + "solver = StandardSimulationSolver(config, show_convergence_plots=True,show_progress_bars=True,convergence_plots_kwargs={\"export_convergence_plots\":True})" ] }, { From 035358913eeb2051e6e412c64d6acb5ab23c3376 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 13 Aug 2024 16:00:02 -0400 Subject: [PATCH 24/61] Added simple base workflow and changed some verbiage --- docs/workflows/simple_workflow.ipynb | 110 ++++++++ docs/workflows/standard_workflow.ipynb | 12 +- ...ulation_solver.py => simple_simulation.py} | 173 ++----------- tardis/workflows/standard_simulation.py | 243 ++++++++++++++++++ 4 files changed, 376 insertions(+), 162 deletions(-) create mode 100644 docs/workflows/simple_workflow.ipynb rename tardis/workflows/{standard_simulation_solver.py => simple_simulation.py} (72%) create mode 100644 tardis/workflows/standard_simulation.py diff --git a/docs/workflows/simple_workflow.ipynb b/docs/workflows/simple_workflow.ipynb new file mode 100644 index 00000000000..99ed4c02141 --- /dev/null +++ b/docs/workflows/simple_workflow.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tardis.workflows.simple_simulation import SimpleSimulation\n", + "from tardis.io.configuration.config_reader import Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config = Configuration.from_yaml('../tardis_example.yml')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow = SimpleSimulation(config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow.run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "spectrum = workflow.spectrum_solver.spectrum_real_packets\n", + "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets\n", + "spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "plt.figure(figsize=(10, 6.5))\n", + "\n", + "spectrum.plot(label=\"Normal packets\")\n", + "spectrum_virtual.plot(label=\"Virtual packets\")\n", + "spectrum_integrated.plot(label='Formal integral')\n", + "\n", + "plt.xlim(500, 9000)\n", + "plt.title(\"TARDIS example model spectrum\")\n", + "plt.xlabel(\"Wavelength [$\\AA$]\")\n", + "plt.ylabel(\"Luminosity density [erg/s/$\\AA$]\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tardis", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/docs/workflows/standard_workflow.ipynb b/docs/workflows/standard_workflow.ipynb index 4577f8eb574..c5e64233cb7 100644 --- a/docs/workflows/standard_workflow.ipynb +++ b/docs/workflows/standard_workflow.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "outputs": [], "source": [ - "from tardis.workflows.standard_simulation_solver import StandardSimulationSolver\n", + "from tardis.workflows.standard_simulation import StandardSimulation\n", "from tardis.io.configuration.config_reader import Configuration" ] }, @@ -25,7 +25,7 @@ "metadata": {}, "outputs": [], "source": [ - "solver = StandardSimulationSolver(config, show_convergence_plots=True,show_progress_bars=True,convergence_plots_kwargs={\"export_convergence_plots\":True})" + "workflow = StandardSimulation(config, show_convergence_plots=True,show_progress_bars=True,convergence_plots_kwargs={\"export_convergence_plots\":True})" ] }, { @@ -34,7 +34,7 @@ "metadata": {}, "outputs": [], "source": [ - "solver.solve()" + "workflow.run()" ] }, { @@ -52,9 +52,9 @@ "metadata": {}, "outputs": [], "source": [ - "spectrum = solver.spectrum_solver.spectrum_real_packets\n", - "spectrum_virtual = solver.spectrum_solver.spectrum_virtual_packets\n", - "spectrum_integrated = solver.spectrum_solver.spectrum_integrated" + "spectrum = workflow.spectrum_solver.spectrum_real_packets\n", + "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets\n", + "spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" ] }, { diff --git a/tardis/workflows/standard_simulation_solver.py b/tardis/workflows/simple_simulation.py similarity index 72% rename from tardis/workflows/standard_simulation_solver.py rename to tardis/workflows/simple_simulation.py index 8af19ce8704..608fb0fbd38 100644 --- a/tardis/workflows/standard_simulation_solver.py +++ b/tardis/workflows/simple_simulation.py @@ -7,11 +7,9 @@ from tardis import constants as const from tardis.io.atom_data.base import AtomData -from tardis.io.util import HDFWriterMixin from tardis.model import SimulationState from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.plasma.standard_plasmas import assemble_plasma -from tardis.simulation.base import PlasmaStateStorerMixin from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator @@ -20,47 +18,20 @@ ) from tardis.transport.montecarlo.base import MonteCarloTransportSolver from tardis.util.base import is_notebook -from tardis.visualization import ConvergencePlots from tardis.workflows.workflow_logging import WorkflowLogging # logging support logger = logging.getLogger(__name__) -class StandardSimulationSolver( - WorkflowLogging, PlasmaStateStorerMixin, HDFWriterMixin -): - hdf_properties = [ - "simulation_state", - "plasma_solver", - "transport_solver", - "iterations_w", - "iterations_t_rad", - "iterations_electron_densities", - "iterations_t_inner", - "spectrum_solver", - ] - - def __init__( - self, - configuration, - enable_virtual_packet_logging=False, - log_level=None, - specific_log_level=None, - show_progress_bars=False, - show_convergence_plots=False, - convergence_plots_kwargs={}, - ): - # set up logging - WorkflowLogging.__init__( - self, - configuration=configuration, - log_level=log_level, - specific_log_level=specific_log_level, - ) - - self.show_progress_bars = show_progress_bars +class SimpleSimulation(WorkflowLogging): + show_progress_bars = is_notebook() + enable_virtual_packet_logging = False + log_level = None + specific_log_level = None + def __init__(self, configuration): + super().__init__(configuration, self.log_level, self.specific_log_level) atom_data = self._get_atom_data(configuration) # set up states and solvers @@ -78,7 +49,7 @@ def __init__( self.transport_solver = MonteCarloTransportSolver.from_config( configuration, packet_source=self.simulation_state.packet_source, - enable_virtual_packet_logging=enable_virtual_packet_logging, + enable_virtual_packet_logging=self.enable_virtual_packet_logging, ) # Luminosity filter frequencies @@ -118,13 +89,6 @@ def __init__( configuration.montecarlo.no_of_virtual_packets ) - # set up plasma storage - PlasmaStateStorerMixin.__init__( - self, - iterations=self.total_iterations, - no_of_shells=self.simulation_state.no_of_shells, - ) - # spectrum settings self.integrated_spectrum_settings = configuration.spectrum.integrated self.spectrum_solver = SpectrumSolver.from_config(configuration) @@ -153,34 +117,6 @@ def __init__( self.convergence_strategy.t_inner ) - # Convergence plots - if show_convergence_plots: - if not is_notebook(): - raise RuntimeError( - "Convergence Plots cannot be displayed in command-line. Set show_convergence_plots " - "to False." - ) - - self.convergence_plots = ConvergencePlots( - iterations=self.total_iterations, **convergence_plots_kwargs - ) - else: - self.convergence_plots = None - - if "export_convergence_plots" in convergence_plots_kwargs: - if not isinstance( - convergence_plots_kwargs["export_convergence_plots"], - bool, - ): - raise TypeError( - "Expected bool in export_convergence_plots argument" - ) - self.export_convergence_plots = convergence_plots_kwargs[ - "export_convergence_plots" - ] - else: - self.export_convergence_plots = False - def _get_atom_data(self, configuration): """Process atomic data from the configuration @@ -249,12 +185,8 @@ def get_convergence_estimates(self, transport_state): ) ) - estimated_t_radiative = ( - estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - ) - estimated_dilution_factor = ( - estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor - ) + estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor emitted_luminosity = calculate_filtered_luminosity( transport_state.emitted_packet_nu, @@ -262,30 +194,6 @@ def get_convergence_estimates(self, transport_state): self.luminosity_nu_start, self.luminosity_nu_end, ) - absorbed_luminosity = calculate_filtered_luminosity( - transport_state.reabsorbed_packet_nu, - transport_state.reabsorbed_packet_luminosity, - self.luminosity_nu_start, - self.luminosity_nu_end, - ) - - if self.convergence_plots is not None: - plot_data = { - "t_inner": [self.simulation_state.t_inner.value, "value"], - "t_rad": [self.simulation_state.t_radiative, "iterable"], - "w": [self.simulation_state.dilution_factor, "iterable"], - "velocity": [self.simulation_state.velocity, "iterable"], - "Emitted": [emitted_luminosity.value, "value"], - "Absorbed": [absorbed_luminosity.value, "value"], - "Requested": [self.luminosity_requested.value, "value"], - } - self.update_convergence_plot_data(plot_data) - - logger.info( - f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" - f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" - f"\tLuminosity requested = {self.luminosity_requested:.3e}\n" - ) luminosity_ratios = ( (emitted_luminosity / self.luminosity_requested).to(1).value @@ -297,15 +205,6 @@ def get_convergence_estimates(self, transport_state): ** self.convergence_strategy.t_inner_update_exponent ) - self.log_plasma_state( - self.simulation_state.t_radiative, - self.simulation_state.dilution_factor, - self.simulation_state.t_inner, - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) - return { "t_radiative": estimated_t_radiative, "dilution_factor": estimated_dilution_factor, @@ -349,26 +248,11 @@ def check_convergence( f"Iteration converged {self.consecutive_converges_count:d}/{(hold_iterations + 1):d} consecutive " f"times." ) - return self.consecutive_converges_count == hold_iterations + 1 + return self.consecutive_converges_count >= hold_iterations + 1 self.consecutive_converges_count = 0 return False - def update_convergence_plot_data(self, plot_data_dict): - """Updates convergence plotting data - - Parameters - ---------- - plot_data_dict : dict - Dictionary of data to update of the form {"name": [value, item_type]} - """ - for name, (value, item_type) in plot_data_dict.items(): - self.convergence_plots.fetch_data( - name=name, - value=value, - item_type=item_type, - ) - def solve_simulation_state( self, estimated_values, @@ -518,9 +402,9 @@ def initialize_spectrum_solver( self.spectrum_solver.transport_state = transport_state if virtual_packet_energies is not None: - self.spectrum_solver._montecarlo_virtual_luminosity.value[ - : - ] = virtual_packet_energies + self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( + virtual_packet_energies + ) if self.integrated_spectrum_settings is not None: # Set up spectrum solver integrator @@ -531,20 +415,13 @@ def initialize_spectrum_solver( self.simulation_state, self.plasma_solver, self.transport_solver ) - def solve(self): - """Solve the TARDIS simulation until convergence is reached""" + def run(self): + """Run the TARDIS simulation until convergence is reached""" converged = False while self.completed_iterations < self.total_iterations - 1: logger.info( f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" ) - self.store_plasma_state( - self.completed_iterations, - self.simulation_state.dilution_factor, - self.simulation_state.t_radiative, - self.plasma_solver.electron_densities, - self.simulation_state.t_inner, - ) transport_state, virtual_packet_energies = self.solve_montecarlo( self.real_packet_count ) @@ -554,9 +431,6 @@ def solve(self): estimated_radfield_properties, ) = self.get_convergence_estimates(transport_state) - if self.convergence_plots is not None: - self.convergence_plots.update() - self.solve_simulation_state(estimated_values) self.solve_plasma(estimated_radfield_properties) @@ -576,20 +450,7 @@ def solve(self): transport_state, virtual_packet_energies = self.solve_montecarlo( self.final_iteration_packet_count, self.virtual_packet_count ) - self.store_plasma_state( - self.completed_iterations, - self.simulation_state.dilution_factor, - self.simulation_state.t_radiative, - self.plasma_solver.electron_densities, - self.simulation_state.t_inner, - ) - self.reshape_plasma_state_store(self.completed_iterations) - if self.convergence_plots is not None: - self.get_convergence_estimates(transport_state) - self.convergence_plots.update( - export_convergence_plots=self.export_convergence_plots, - last=True, - ) + self.initialize_spectrum_solver( transport_state, virtual_packet_energies, diff --git a/tardis/workflows/standard_simulation.py b/tardis/workflows/standard_simulation.py new file mode 100644 index 00000000000..8114a506b5d --- /dev/null +++ b/tardis/workflows/standard_simulation.py @@ -0,0 +1,243 @@ +import logging + +from tardis.io.util import HDFWriterMixin +from tardis.simulation.base import PlasmaStateStorerMixin +from tardis.spectrum.luminosity import ( + calculate_filtered_luminosity, +) +from tardis.util.base import is_notebook +from tardis.visualization import ConvergencePlots +from tardis.workflows.simple_simulation import SimpleSimulation + +# logging support +logger = logging.getLogger(__name__) + + +class StandardSimulation( + SimpleSimulation, PlasmaStateStorerMixin, HDFWriterMixin +): + hdf_properties = [ + "simulation_state", + "plasma_solver", + "transport_solver", + "iterations_w", + "iterations_t_rad", + "iterations_electron_densities", + "iterations_t_inner", + "spectrum_solver", + ] + + def __init__( + self, + configuration, + enable_virtual_packet_logging=False, + log_level=None, + specific_log_level=None, + show_progress_bars=False, + show_convergence_plots=False, + convergence_plots_kwargs={}, + ): + self.show_progress_bars = show_progress_bars + self.log_level = log_level + self.specific_log_level = specific_log_level + self.enable_virtual_packet_logging = enable_virtual_packet_logging + + SimpleSimulationWorkflow.__init__(self, configuration) + + # set up plasma storage + PlasmaStateStorerMixin.__init__( + self, + iterations=self.total_iterations, + no_of_shells=self.simulation_state.no_of_shells, + ) + + # Convergence plots + if show_convergence_plots: + if not is_notebook(): + raise RuntimeError( + "Convergence Plots cannot be displayed in command-line. Set show_convergence_plots " + "to False." + ) + + self.convergence_plots = ConvergencePlots( + iterations=self.total_iterations, **convergence_plots_kwargs + ) + else: + self.convergence_plots = None + + if "export_convergence_plots" in convergence_plots_kwargs: + if not isinstance( + convergence_plots_kwargs["export_convergence_plots"], + bool, + ): + raise TypeError( + "Expected bool in export_convergence_plots argument" + ) + self.export_convergence_plots = convergence_plots_kwargs[ + "export_convergence_plots" + ] + else: + self.export_convergence_plots = False + + def get_convergence_estimates(self, transport_state): + """Compute convergence estimates from the transport state + + Parameters + ---------- + transport_state : MonteCarloTransportState + Transport state object to compute estimates + + Returns + ------- + dict + Convergence estimates + EstimatedRadiationFieldProperties + Dilute radiation file and j_blues dataclass + """ + estimated_radfield_properties = ( + self.transport_solver.radfield_prop_solver.solve( + transport_state.radfield_mc_estimators, + transport_state.time_explosion, + transport_state.time_of_simulation, + transport_state.geometry_state.volume, + transport_state.opacity_state.line_list_nu, + ) + ) + + estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + + emitted_luminosity = calculate_filtered_luminosity( + transport_state.emitted_packet_nu, + transport_state.emitted_packet_luminosity, + self.luminosity_nu_start, + self.luminosity_nu_end, + ) + absorbed_luminosity = calculate_filtered_luminosity( + transport_state.reabsorbed_packet_nu, + transport_state.reabsorbed_packet_luminosity, + self.luminosity_nu_start, + self.luminosity_nu_end, + ) + + if self.convergence_plots is not None: + plot_data = { + "t_inner": [self.simulation_state.t_inner.value, "value"], + "t_rad": [self.simulation_state.t_radiative, "iterable"], + "w": [self.simulation_state.dilution_factor, "iterable"], + "velocity": [self.simulation_state.velocity, "iterable"], + "Emitted": [emitted_luminosity.value, "value"], + "Absorbed": [absorbed_luminosity.value, "value"], + "Requested": [self.luminosity_requested.value, "value"], + } + self.update_convergence_plot_data(plot_data) + + logger.info( + f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" + f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" + f"\tLuminosity requested = {self.luminosity_requested:.3e}\n" + ) + + luminosity_ratios = ( + (emitted_luminosity / self.luminosity_requested).to(1).value + ) + + estimated_t_inner = ( + self.simulation_state.t_inner + * luminosity_ratios + ** self.convergence_strategy.t_inner_update_exponent + ) + + self.log_plasma_state( + self.simulation_state.t_radiative, + self.simulation_state.dilution_factor, + self.simulation_state.t_inner, + estimated_t_radiative, + estimated_dilution_factor, + estimated_t_inner, + ) + + return { + "t_radiative": estimated_t_radiative, + "dilution_factor": estimated_dilution_factor, + "t_inner": estimated_t_inner, + }, estimated_radfield_properties + + def update_convergence_plot_data(self, plot_data_dict): + """Updates convergence plotting data + + Parameters + ---------- + plot_data_dict : dict + Dictionary of data to update of the form {"name": [value, item_type]} + """ + for name, (value, item_type) in plot_data_dict.items(): + self.convergence_plots.fetch_data( + name=name, + value=value, + item_type=item_type, + ) + + def run(self): + """Run the TARDIS simulation until convergence is reached""" + converged = False + while self.completed_iterations < self.total_iterations - 1: + logger.info( + f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" + ) + self.store_plasma_state( + self.completed_iterations, + self.simulation_state.dilution_factor, + self.simulation_state.t_radiative, + self.plasma_solver.electron_densities, + self.simulation_state.t_inner, + ) + transport_state, virtual_packet_energies = self.solve_montecarlo( + self.real_packet_count + ) + + ( + estimated_values, + estimated_radfield_properties, + ) = self.get_convergence_estimates(transport_state) + + if self.convergence_plots is not None: + self.convergence_plots.update() + + self.solve_simulation_state(estimated_values) + + self.solve_plasma(estimated_radfield_properties) + + converged = self.check_convergence(estimated_values) + self.completed_iterations += 1 + + if converged and self.convergence_strategy.stop_if_converged: + break + + if converged: + logger.info("\n\tStarting final iteration") + else: + logger.error( + "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" + ) + transport_state, virtual_packet_energies = self.solve_montecarlo( + self.final_iteration_packet_count, self.virtual_packet_count + ) + self.store_plasma_state( + self.completed_iterations, + self.simulation_state.dilution_factor, + self.simulation_state.t_radiative, + self.plasma_solver.electron_densities, + self.simulation_state.t_inner, + ) + self.reshape_plasma_state_store(self.completed_iterations) + if self.convergence_plots is not None: + self.get_convergence_estimates(transport_state) + self.convergence_plots.update( + export_convergence_plots=self.export_convergence_plots, + last=True, + ) + self.initialize_spectrum_solver( + transport_state, + virtual_packet_energies, + ) From 3a24f98e18c05b7afe5f092a37386d536482af3d Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Tue, 13 Aug 2024 16:01:44 -0400 Subject: [PATCH 25/61] Fix typo --- tardis/workflows/standard_simulation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tardis/workflows/standard_simulation.py b/tardis/workflows/standard_simulation.py index 8114a506b5d..429752b543c 100644 --- a/tardis/workflows/standard_simulation.py +++ b/tardis/workflows/standard_simulation.py @@ -42,7 +42,7 @@ def __init__( self.specific_log_level = specific_log_level self.enable_virtual_packet_logging = enable_virtual_packet_logging - SimpleSimulationWorkflow.__init__(self, configuration) + SimpleSimulation.__init__(self, configuration) # set up plasma storage PlasmaStateStorerMixin.__init__( From 8caaf6e6df42c66e8ac4b29164d0bc8428514201 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 10:28:18 -0400 Subject: [PATCH 26/61] Moved solver workflow over to updated branch --- tardis/workflows/util.py | 56 ++++ tardis/workflows/v_inner_solver.py | 432 +++++++++++++++++++++++++++++ 2 files changed, 488 insertions(+) create mode 100644 tardis/workflows/util.py create mode 100644 tardis/workflows/v_inner_solver.py diff --git a/tardis/workflows/util.py b/tardis/workflows/util.py new file mode 100644 index 00000000000..3f1707c68f7 --- /dev/null +++ b/tardis/workflows/util.py @@ -0,0 +1,56 @@ + + +from astropy import units as u, constants as const +import numpy as np + +def get_tau_integ(plasma, simulation_state, bin_size=10): + + index = plasma.atomic_data.lines.nu.index + taus = plasma.tau_sobolevs.loc[index] + freqs = plasma.atomic_data.lines.nu.values + order = np.argsort(freqs) + freqs = freqs[order] + taus = plasma.tau_sobolevs.values[order] + + extra = bin_size-len(freqs)%bin_size + extra_freqs = np.arange(extra+1)+1 + extra_taus = np.zeros((extra+1, taus.shape[1])) + freqs = np.hstack((extra_freqs, freqs)) + taus = np.vstack((extra_taus, taus)) + + bins_low = freqs[:-bin_size:bin_size] + bins_high = freqs[bin_size::bin_size] + delta_nu = bins_high - bins_low + n_bins = len(delta_nu) + + taus = taus[1:n_bins*bin_size+1] + freqs = freqs[1:n_bins*bin_size+1] + + ct = simulation_state.time_explosion.cgs.value * const.c.cgs.value + t_rad = simulation_state.radiation_field_state.temperature.cgs.value + + h = const.h.cgs.value + c = const.c.cgs.value + kb = const.k_B.cgs.value + + def B(nu, T): + return 2*h*nu**3/c**2/(np.exp(h*nu/(kb*T))-1) + + def U(nu, T): + return B(nu, T)**2 * (c/nu)**2 * (2*kb*T**2)**-1 + + kappa_exp = (bins_low/delta_nu).reshape(-1, 1)/ct*(1-np.exp(-taus.reshape(n_bins, bin_size, -1))).sum(axis=1) + kappa_thom = (plasma.electron_densities.values*const.sigma_T.cgs.value) + Bdnu = B(bins_low.reshape(-1, 1), t_rad.reshape(1, -1))*delta_nu.reshape(-1, 1) + kappa_planck = (kappa_thom + (Bdnu*kappa_exp).sum(axis=0)/(Bdnu.sum(axis=0))) + + udnu = U(bins_low.reshape(-1, 1), t_rad.reshape(1, -1))*delta_nu.reshape(-1, 1) + kappa_tot = kappa_thom + kappa_exp + kappa_rossland = ((udnu*kappa_tot**-1).sum(axis=0)/(udnu.sum(axis=0)))**-1 + + dr = (simulation_state.geometry.r_outer-simulation_state.geometry.r_inner).cgs.value + dtau = kappa_planck*dr + planck_integ_tau = np.cumsum(dtau[::-1])[::-1] + rossland_integ_tau = np.cumsum((kappa_rossland*dr)[::-1])[::-1] + + return {'rossland':rossland_integ_tau, 'planck':planck_integ_tau} \ No newline at end of file diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py new file mode 100644 index 00000000000..d9d310798a7 --- /dev/null +++ b/tardis/workflows/v_inner_solver.py @@ -0,0 +1,432 @@ +import logging + +import numpy as np +from astropy import units as u + +from tardis.io.atom_data.base import AtomData +from tardis.simulation.convergence import ConvergenceSolver +from tardis.spectrum.formal_integral import FormalIntegrator +from tardis.workflows.simple_simulation import SimpleSimulation +from tardis.workflows.util import get_tau_integ +from tardis.plasma.standard_plasmas import assemble_plasma +from tardis.plasma.radiation_field import DilutePlanckianRadiationField +from tardis.opacities.opacity_solver import OpacitySolver +from tardis.opacities.macro_atom.macroatom_solver import MacroAtomSolver +from tardis.opacities.macro_atom.macroatom_state import MacroAtomState +from scipy.interpolate import interp1d +import copy +from tardis.spectrum.luminosity import ( + calculate_filtered_luminosity, +) +import pandas as pd + +# logging support +logger = logging.getLogger(__name__) + +# TODO: +# Option to estimate initial v_inner from electron opacity +# Add option for desired optical depth +# Think about csvy vs other formats for specifying grid +# Handle non-explicit formats when going out of the simulation + + +class InnerVelocitySimulationSolver(SimpleSimulation): + + TAU_TARGET = np.log(2.0 / 3) + + def __init__( + self, + configuration, + mean_optical_depth="rossland", + ): + """ + Args: + convergence_strategy (_type_): _description_ + atom_data_path (_type_): _description_ + mean_optical_depth (str): 'rossland' or 'planck' + Method of estimating the mean optical depth + """ + super().__init__(configuration) + self.mean_optical_depth = mean_optical_depth + + self.convergence_solvers["v_inner_boundary"] = ConvergenceSolver( + self.convergence_strategy.v_inner_boundary + ) + + self.property_mask_ = self.property_mask + + self.opacity_solver = OpacitySolver(line_interaction_type=configuration.plasma.line_interaction_type, disable_line_scattering=False) + if configuration.plasma.line_interaction_type == 'scatter': + self.macro_atom_solver = None + else: + self.macro_atom_solver = MacroAtomSolver() + + def estimate_v_inner(self): + """Compute the Rossland Mean Optical Depth, + Estimate location where v_inner makes t=2/3 (or target) + Extrapolate with exponential fits + + Need some way to return and inspect the optical depths for later logging""" + pass + + tau_integ = np.log( + get_tau_integ( + self.plasma_solver, + self.simulation_state, + )[self.mean_optical_depth] + ) + + interpolator = interp1d( + tau_integ, + self.simulation_state.geometry.v_inner, # Only use the active values as we only need a numerical estimate, not an index + fill_value="extrapolate", + ) + # TODO: Make sure eastimed_v_inner is within the bounds of the simulation! + estimated_v_inner = interpolator(self.TAU_TARGET) + + return estimated_v_inner * u.cm / u.s + + @property + def property_mask(self): + mask = np.zeros( + (len(self.simulation_state.geometry.r_inner)), dtype=bool + ) + mask[ + self.simulation_state.geometry.v_inner_boundary_index : self.simulation_state.geometry.v_outer_boundary_index + ] = True + return mask + + @property + def property_where(self): + + return np.where(self.property_mask) + + def get_convergence_estimates(self, transport_state): + + # print(self.transport_solver.transport_state) + # ( + # estimated_t_radiative, + # estimated_dilution_factor, + # ) = self.transport_solver.radfield_prop_solver.calculate_radiationfield_properties() + + estimated_radfield_properties = ( + self.transport_solver.radfield_prop_solver.solve( + transport_state.radfield_mc_estimators, + transport_state.time_explosion, + transport_state.time_of_simulation, + transport_state.geometry_state.volume, + transport_state.opacity_state.line_list_nu, + ) + ) + print("Volume_INNER:", transport_state.geometry_state.volume[0]) + + estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + + self.initialize_spectrum_solver( + transport_state, + None, + ) + + emitted_luminosity = calculate_filtered_luminosity( + transport_state.emitted_packet_nu, + transport_state.emitted_packet_luminosity, + self.luminosity_nu_start, + self.luminosity_nu_end, + ) + + print("Emitted Luminosity:", emitted_luminosity) + luminosity_ratios = ( + (emitted_luminosity / self.luminosity_requested).to(1).value + ) + + estimated_t_inner = ( + self.simulation_state.t_inner + * luminosity_ratios + ** self.convergence_strategy.t_inner_update_exponent + ) + + self.tracker['emitted_luminosity'].append(emitted_luminosity) + self.tracker['estimated_t_inner'].append(estimated_t_inner) + + estimated_v_inner = self.estimate_v_inner() + if estimated_v_inner < self.simulation_state.geometry.v_inner[0]: + estimated_v_inner = self.simulation_state.geometry.v_inner[0] + print("WARNING: v_inner_boundary outside of simulation, setting to first shell") + elif estimated_v_inner > self.simulation_state.geometry.v_inner[-1]: + estimated_v_inner = self.simulation_state.geometry.v_inner[-1] + print("WARNING: v_inner_boundary outside of simulation, setting to last shell") + + + #estimated_v_inner = self.simulation_state.v_inner_boundary + print(estimated_v_inner) + + return { + "t_radiative": estimated_t_radiative, + "dilution_factor": estimated_dilution_factor, + "t_inner": estimated_t_inner, + "v_inner_boundary": estimated_v_inner, + } + + def check_convergence( + self, + estimated_values, + ): + convergence_statuses = [] + + for key, solver in self.convergence_solvers.items(): + + current_value = getattr(self.simulation_state, key) + estimated_value = estimated_values[key] + + print("Check Convergence") + print(key, estimated_value) + print(current_value) + joint_mask = np.ones(5) + if hasattr(current_value, "__len__") and ( + key not in ["t_inner", "v_inner_boundary"] + ): + if current_value.shape == estimated_value.shape: + pass + else: + print(key, "has", "__len__") + print("shape current:", current_value.shape) + print("shape next:", estimated_value.shape) + new_value = estimated_value + current_value_expanded = np.empty( + len(self.simulation_state.geometry.r_inner), + dtype=current_value.dtype, + ) + current_value_expanded[self.property_mask] = current_value + new_value_expanded = np.empty_like(current_value_expanded) + new_value_expanded[self.new_property_mask] = new_value + joint_mask = self.property_mask & self.new_property_mask + print(joint_mask) + print("diff:", current_value_expanded - new_value_expanded) + + if hasattr(current_value, "unit"): + current_value_expanded = ( + current_value_expanded * current_value.unit + ) + new_value_expanded = ( + new_value_expanded * current_value.unit + ) + estimated_value = new_value_expanded[joint_mask] + current_value = current_value_expanded[joint_mask] + + # no_of_shells = ( + # self.simulation_state.no_of_shells if key not in ["t_inner", "v_inner_boundary"] else 1 + # ) + no_of_shells = ( + joint_mask.sum() + if key not in ["t_inner", "v_inner_boundary"] + else 1 + ) + + convergence_statuses.append( + solver.get_convergence_status( + current_value, estimated_value, no_of_shells + ) + ) + print("Status:", convergence_statuses[-1]) + + if np.all(convergence_statuses): + hold_iterations = self.convergence_strategy.hold_iterations + self.consecutive_converges_count += 1 + logger.info( + f"Iteration converged {self.consecutive_converges_count:d}/{(hold_iterations + 1):d} consecutive " + f"times." + ) + print("Converged this iteration!") + return self.consecutive_converges_count == hold_iterations + 1 + + self.consecutive_converges_count = 0 + return False + + def clip(self, property): + """Clips a shell-dependent array to the current index""" + + return property[ + self.simulation_state.geometry.v_inner_boundary_index : self.simulation_state.geometry.v_outer_boundary_index + ] + + def solve_simulation_state( + self, + estimated_values, + ): + + next_values = {} + print(estimated_values) + self.new_property_mask = self.property_mask + self.old_property_mask = self.property_mask_ + + for key, solver in self.convergence_solvers.items(): + if ( + key in ["t_inner", "v_inner_boundary"] + and (self.completed_iterations + 1) + % self.convergence_strategy.lock_t_inner_cycles + != 0 + ): + next_values[key] = getattr(self.simulation_state, key) + else: + + print("key", key) + print(getattr(self.simulation_state, key)) + print(estimated_values[key]) + current_value = getattr(self.simulation_state, key) + new_value = estimated_values[key] + if hasattr(current_value, "__len__") and key not in [ + "t_inner", + "v_inner_boundary", + ]: + if current_value.shape == new_value.shape: + pass + else: + breakpoint() + print(key, "has", "__len__") + print("shape current:", current_value.shape) + print("shape next:", new_value.shape) + current_value_expanded = np.empty( + len(self.simulation_state.geometry.r_inner), + dtype=current_value.dtype, + ) + current_value_expanded[ + self.property_mask + ] = current_value + new_value_expanded = np.empty_like( + current_value_expanded + ) + new_value_expanded[self.new_property_mask] = new_value + joint_mask = self.property_mask & self.new_property_mask + print(joint_mask) + if hasattr(current_value, "unit"): + current_value_expanded = ( + current_value_expanded * current_value.unit + ) + new_value_expanded = ( + new_value_expanded * current_value.unit + ) + new_value = new_value_expanded[joint_mask] + current_value = current_value_expanded[joint_mask] + next_values[key] = solver.converge( + current_value, new_value + ) # TODO: This needs to be changed to account for changing array sizes + + self.simulation_state.t_radiative = next_values["t_radiative"] + self.simulation_state.dilution_factor = next_values["dilution_factor"] + self.simulation_state.blackbody_packet_source.temperature = next_values[ + "t_inner" + ] + self.simulation_state.t_inner = next_values["t_inner"] + + print("next v_inner", next_values["v_inner_boundary"]) + self.simulation_state.geometry.v_inner_boundary = next_values[ + "v_inner_boundary" + ] + self.simulation_state.blackbody_packet_source.radius = self.simulation_state.r_inner[0] + self.property_mask_ = self.new_property_mask + + print("New Volume:", self.simulation_state.geometry.volume_active) + + + def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): + + opacity_state = self.opacity_solver.solve(self.plasma_solver) + #macro_atom_state = None + if self.macro_atom_solver is None: + macro_atom_state = None + else: + macro_atom_state = self.macro_atom_solver.solve( + self.plasma_solver, + self.plasma_solver.atomic_data, + opacity_state.tau_sobolev, + self.plasma_solver.stimulated_emission_factor, + ) + transport_state = self.transport_solver.initialize_transport_state( + self.simulation_state, + opacity_state, + macro_atom_state, + self.plasma_solver, + no_of_real_packets, + no_of_virtual_packets=no_of_virtual_packets, + iteration=self.completed_iterations, + ) + + virtual_packet_energies = self.transport_solver.run( + transport_state, + iteration=self.completed_iterations, + total_iterations=self.total_iterations, + show_progress_bars=False, + ) + + output_energy = transport_state.packet_collection.output_energies + if np.sum(output_energy < 0) == len(output_energy): + logger.critical("No r-packet escaped through the outer boundary.") + + return transport_state, virtual_packet_energies + + def solve_plasma( + self, + transport_state, + ): + # TODO: Find properties that need updating with shells + + # self.simulation_state.radiation_field_state.t_radiative[self.simulation_state.radiation_field_state.t_radiative.value==0] = 10000.0 * u.K + # self.simulation_state.radiation_field_state.dilution_factor[self.simulation_state.radiation_field_state.dilution_factor==0] = 1.0 + + radiation_field = DilutePlanckianRadiationField( + temperature=self.simulation_state.radiation_field_state.temperature, + dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, + ) + update_properties = dict( + dilute_planckian_radiation_field=radiation_field, + ) + # A check to see if the plasma is set with JBluesDetailed, in which + # case it needs some extra kwargs. + j_blues = radiation_field.calculate_mean_intensity( + self.plasma_solver.atomic_data.lines.nu.values + ) + update_properties["j_blues"] = pd.DataFrame( + j_blues, index=self.plasma_solver.atomic_data.lines.index + ) + if "j_blue_estimator" in self.plasma_solver.outputs_dict: + update_properties.update( + t_inner=self.simulation_state.blackbody_packet_source.temperature, + j_blue_estimator=transport_state.radfield_mc_estimators.j_blue_estimator, + ) + + self.plasma_solver.update(**update_properties) + + def solve(self): + converged = False + while self.completed_iterations < self.total_iterations - 1: + + + + transport_state, virtual_packet_energies = self.solve_montecarlo( + self.real_packet_count + ) + + estimated_values = self.get_convergence_estimates(transport_state) + + self.solve_simulation_state(estimated_values) + + self.solve_plasma(transport_state) + + converged = self.check_convergence(estimated_values) + + #self.simulation_state.packet_source.radius = self.simulation_state.geometry.r_inner_active[0] + + self.completed_iterations += 1 + if converged: + print("SIMULATION CONVERGED!") + if converged and self.convergence_strategy.stop_if_converged: + break + + transport_state, virtual_packet_energies = self.solve_montecarlo( + self.final_iteration_packet_count, self.virtual_packet_count + ) + self.initialize_spectrum_solver( + transport_state, + virtual_packet_energies, + ) From 82ffb83e54418cb5c8991087cb7387cf010bb6b3 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 10:45:40 -0400 Subject: [PATCH 27/61] Added reprojection method for comparing arrays between iterations --- tardis/workflows/v_inner_solver.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index d9d310798a7..21e35a09681 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -38,6 +38,7 @@ def __init__( self, configuration, mean_optical_depth="rossland", + tau=None ): """ Args: @@ -60,6 +61,8 @@ def __init__( self.macro_atom_solver = None else: self.macro_atom_solver = MacroAtomSolver() + if tau is not None: + self.TAU_TARGET = np.log(tau) def estimate_v_inner(self): """Compute the Rossland Mean Optical Depth, @@ -167,6 +170,22 @@ def get_convergence_estimates(self, transport_state): "t_inner": estimated_t_inner, "v_inner_boundary": estimated_v_inner, } + + def reproject(self, a1, a2, m1, m2): + + a1_expanded = np.empty( + len(self.simulation_state.geometry.r_inner), + dtype=a1.dtype, + ) + a2_expanded = np.empty_like(a1_expanded) + + a1_expanded[m1] = a1 + a2_expanded[m2] = a2 + + joint_mask = m1 & m2 + + return a1_expanded[joint_mask], a2_expanded[joint_mask] + def check_convergence( self, From 4d3c7471d9de1903aab43cfe704c670d0d3ac3d8 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 10:53:35 -0400 Subject: [PATCH 28/61] Updated schema and parser to add v_inner_boundary, added property to the model because it is named weirdly --- tardis/io/configuration/config_reader.py | 2 +- .../schemas/montecarlo_definitions.yml | 18 ++++++++++++++++++ tardis/model/base.py | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/tardis/io/configuration/config_reader.py b/tardis/io/configuration/config_reader.py index bc67fe0324f..b79d4c5dc88 100644 --- a/tardis/io/configuration/config_reader.py +++ b/tardis/io/configuration/config_reader.py @@ -431,7 +431,7 @@ def parse_convergence_section(convergence_section_dict): """ convergence_parameters = ["damping_constant", "threshold", "type"] - for convergence_variable in ["t_inner", "t_rad", "w"]: + for convergence_variable in ["t_inner", "t_rad", "w", "v_inner_boundary"]: if convergence_variable not in convergence_section_dict: convergence_section_dict[convergence_variable] = {} convergence_variable_section = convergence_section_dict[ diff --git a/tardis/io/configuration/schemas/montecarlo_definitions.yml b/tardis/io/configuration/schemas/montecarlo_definitions.yml index 1adf22599ae..050e7d5c2fb 100644 --- a/tardis/io/configuration/schemas/montecarlo_definitions.yml +++ b/tardis/io/configuration/schemas/montecarlo_definitions.yml @@ -59,6 +59,24 @@ definitions: type: string default: 'damped' description: THIS IS A DUMMY VARIABLE DO NOT USE + v_inner_boundary: + type: object + additionalProperties: false + properties: + damping_constant: + type: number + default: 0.0 + description: damping constant + minimum: 0 + threshold: + type: number + description: specifies the threshold that is taken as convergence (i.e. + 0.05 means that the value does not change more than 5%) + minimum: 0 + type: + type: string + default: 'damped' + description: THIS IS A DUMMY VARIABLE DO NOT USE t_rad: type: object additionalProperties: false diff --git a/tardis/model/base.py b/tardis/model/base.py index 27e11d2f20d..1bd80147024 100644 --- a/tardis/model/base.py +++ b/tardis/model/base.py @@ -208,6 +208,10 @@ def radius(self): @property def v_boundary_inner(self): return self.geometry.v_inner_boundary + + @property + def v_inner_boundary(self): + return self.v_boundary_inner @property def v_boundary_outer(self): From 16042ce068465334c2b06e27e1f0a816a29b2fdf Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 10:55:50 -0400 Subject: [PATCH 29/61] Added ntoebook for the IBVS workflow --- docs/workflows/v_inner_solver_workflow.ipynb | 110 +++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 docs/workflows/v_inner_solver_workflow.ipynb diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb new file mode 100644 index 00000000000..40ae73b7c2d --- /dev/null +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -0,0 +1,110 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from tardis.workflows.v_inner_solver import InnerVelocitySimulationSolver\n", + "from tardis.io.configuration.config_reader import Configuration" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "config = Configuration.from_yaml('../tardis_example.yml')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow = InnerVelocitySimulationSolver(config)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "workflow.run()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "spectrum = workflow.spectrum_solver.spectrum_real_packets\n", + "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets\n", + "spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "plt.figure(figsize=(10, 6.5))\n", + "\n", + "spectrum.plot(label=\"Normal packets\")\n", + "spectrum_virtual.plot(label=\"Virtual packets\")\n", + "spectrum_integrated.plot(label='Formal integral')\n", + "\n", + "plt.xlim(500, 9000)\n", + "plt.title(\"TARDIS example model spectrum\")\n", + "plt.xlabel(\"Wavelength [$\\AA$]\")\n", + "plt.ylabel(\"Luminosity density [erg/s/$\\AA$]\")\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "tardis", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 545f75121d04daa1cf78db3a1f295d58a999d286 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 11:20:02 -0400 Subject: [PATCH 30/61] Updated workflow notebook to have correct convergence information, updated simple solver to properly set up the plasma with the new assembly --- docs/workflows/v_inner_solver_workflow.ipynb | 1586 +++++++++++++++++- tardis/workflows/simple_simulation.py | 2 +- tardis/workflows/v_inner_solver.py | 6 +- 3 files changed, 1577 insertions(+), 17 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 40ae73b7c2d..72b27f4defd 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -2,9 +2,38 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Iterations: 0/? [00:00, 'dilution_factor': array([0.50749398, 0.39593831, 0.32150486, 0.26573788, 0.2236516 ,\n", + " 0.19686689, 0.1746428 , 0.15625093, 0.13946942, 0.12759534,\n", + " 0.11697795, 0.10915673, 0.10296464, 0.09515332, 0.08981745,\n", + " 0.08689548, 0.08198791, 0.0788115 , 0.07637264, 0.07345198]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[9926.50196546 9911.63537753 9896.81325339 9882.03539385 9867.30160093\n", + " 9852.6116778 9837.96542884 9823.36265956 9808.80317663 9794.28678787\n", + " 9779.81330223 9765.3825298 9750.99428177 9736.64837045 9722.34460927\n", + " 9708.08281272 9693.8627964 9679.68437699 9665.54737223 9651.45160094] K\n", + "[10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", + " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", + " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", + " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", + " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", + "key dilution_factor\n", + "[0.40039164 0.33245223 0.28966798 0.2577141 0.23224568 0.21120466\n", + " 0.19341188 0.17811402 0.16479446 0.1530809 0.14269498 0.13342262\n", + " 0.12509541 0.11757849 0.11076215 0.10455605 0.09888494 0.09368554\n", + " 0.08890421 0.08449514]\n", + "[0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", + " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", + " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", + " 0.07637264 0.07345198]\n", + "key t_inner\n", + "9933.951995919648 K\n", + "11472.471128925046 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", + " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", + " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", + " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", + " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", + "[10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", + " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", + " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", + " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", + " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", + " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", + " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", + " 0.07637264 0.07345198]\n", + "[0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", + " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", + " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", + " 0.07637264 0.07345198]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 11472.471128925046 K\n", + "10703.211562422348 K\n", + "Status: False\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0710516521093009e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.52466218, 0.41191697, 0.33082428, 0.27394158, 0.23102276,\n", + " 0.20265771, 0.18068104, 0.16215467, 0.14618948, 0.13362669,\n", + " 0.12450449, 0.11605105, 0.10925211, 0.10302987, 0.09831779,\n", + " 0.09325771, 0.08908436, 0.08446805, 0.08117713, 0.07815149]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", + " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", + " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", + " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", + " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", + "[10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", + " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", + " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", + " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", + " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", + "key dilution_factor\n", + "[0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", + " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", + " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", + " 0.07637264 0.07345198]\n", + "[0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", + " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", + " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", + " 0.08117713 0.07815149]\n", + "key t_inner\n", + "10703.211562422348 K\n", + "10644.212645494625 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", + " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", + " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", + " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", + " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", + "[10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", + " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", + " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", + " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", + " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", + " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", + " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", + " 0.08117713 0.07815149]\n", + "[0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", + " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", + " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", + " 0.08117713 0.07815149]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10644.212645494625 K\n", + "10673.712103958485 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 1/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0744260406037982e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.48255611, 0.37531674, 0.30088544, 0.24970651, 0.21504789,\n", + " 0.18892102, 0.16485989, 0.14922567, 0.13734335, 0.12706282,\n", + " 0.1181651 , 0.11046612, 0.10408752, 0.09837704, 0.09380108,\n", + " 0.08948234, 0.08532986, 0.08049858, 0.07819235, 0.0759959 ]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", + " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", + " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", + " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", + " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", + "[11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", + " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", + " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", + " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", + " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", + "key dilution_factor\n", + "[0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", + " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", + " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", + " 0.08117713 0.07815149]\n", + "[0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", + " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", + " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", + " 0.07819235 0.0759959 ]\n", + "key t_inner\n", + "10673.712103958485 K\n", + "10598.193920505333 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", + " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", + " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", + " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", + " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", + "[11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", + " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", + " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", + " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", + " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", + " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", + " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", + " 0.07819235 0.0759959 ]\n", + "[0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", + " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", + " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", + " 0.07819235 0.0759959 ]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10598.193920505333 K\n", + "10635.953012231908 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 2/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.058299613889192e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46875385, 0.35824408, 0.28599635, 0.23841077, 0.20840515,\n", + " 0.1824598 , 0.16385303, 0.14657197, 0.13503875, 0.12203984,\n", + " 0.11334206, 0.10619058, 0.09765446, 0.09265039, 0.08856995,\n", + " 0.08610302, 0.08350964, 0.07926097, 0.07675258, 0.07475269]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", + " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", + " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", + " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", + " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", + "[11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", + " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", + " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", + " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", + " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", + "key dilution_factor\n", + "[0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", + " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", + " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", + " 0.07819235 0.0759959 ]\n", + "[0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", + " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", + " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", + " 0.07675258 0.07475269]\n", + "key t_inner\n", + "10635.953012231908 K\n", + "10640.860045311447 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", + " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", + " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", + " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", + " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", + "[11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", + " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", + " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", + " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", + " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", + " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", + " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", + " 0.07675258 0.07475269]\n", + "[0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", + " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", + " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", + " 0.07675258 0.07475269]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10640.860045311447 K\n", + "10638.406528771677 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 3/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0545940091430881e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.47879511, 0.36722912, 0.2926209 , 0.24239289, 0.20444578,\n", + " 0.17802906, 0.15880728, 0.14352699, 0.13113431, 0.12123492,\n", + " 0.11293848, 0.10720612, 0.09996151, 0.09452711, 0.08773742,\n", + " 0.08385741, 0.08091696, 0.07741621, 0.07503067, 0.07273053]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", + " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", + " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", + " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", + " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", + "[11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", + " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", + " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", + " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", + " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", + "key dilution_factor\n", + "[0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", + " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", + " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", + " 0.07675258 0.07475269]\n", + "[0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", + " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", + " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", + " 0.07503067 0.07273053]\n", + "key t_inner\n", + "10638.406528771677 K\n", + "10661.997396397868 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", + " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", + " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", + " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", + " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", + "[11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", + " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", + " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", + " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", + " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", + " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", + " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", + " 0.07503067 0.07273053]\n", + "[0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", + " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", + " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", + " 0.07503067 0.07273053]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10661.997396397868 K\n", + "10650.201962584772 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 4/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "SIMULATION CONVERGED!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.060968189077441e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46974009, 0.35887007, 0.29077777, 0.24436512, 0.20776673,\n", + " 0.1852075 , 0.16487115, 0.14711076, 0.1352503 , 0.12403258,\n", + " 0.11208235, 0.10708809, 0.10081991, 0.09351009, 0.08797758,\n", + " 0.08557481, 0.08167863, 0.07764065, 0.0757896 , 0.07324774]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", + " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", + " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", + " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", + " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", + "[11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", + " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", + " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", + " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", + " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", + "key dilution_factor\n", + "[0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", + " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", + " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", + " 0.07503067 0.07273053]\n", + "[0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", + " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", + " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", + " 0.0757896 0.07324774]\n", + "key t_inner\n", + "10650.201962584772 K\n", + "10641.7071190342 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", + " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", + " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", + " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", + " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", + "[11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", + " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", + " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", + " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", + " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", + " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", + " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", + " 0.0757896 0.07324774]\n", + "[0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", + " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", + " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", + " 0.0757896 0.07324774]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10641.7071190342 K\n", + "10645.954540809485 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 5/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0608322361748786e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46951709, 0.35581324, 0.28344389, 0.23679038, 0.20063187,\n", + " 0.17752656, 0.1589681 , 0.14566984, 0.13249513, 0.11945437,\n", + " 0.11202516, 0.10653028, 0.09880763, 0.09250431, 0.09049046,\n", + " 0.08597717, 0.08263854, 0.0794279 , 0.07616189, 0.07438004]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", + " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", + " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", + " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", + " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", + "[11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", + " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", + " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", + " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", + " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", + "key dilution_factor\n", + "[0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", + " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", + " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", + " 0.0757896 0.07324774]\n", + "[0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", + " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", + " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", + " 0.07616189 0.07438004]\n", + "key t_inner\n", + "10645.954540809485 K\n", + "10638.144695065934 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", + " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", + " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", + " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", + " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", + "[11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", + " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", + " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", + " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", + " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", + " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", + " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", + " 0.07616189 0.07438004]\n", + "[0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", + " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", + " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", + " 0.07616189 0.07438004]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10638.144695065934 K\n", + "10642.04961793771 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 6/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0616467173322807e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.47175098, 0.35333643, 0.27692864, 0.23227463, 0.19923393,\n", + " 0.17521545, 0.15695861, 0.14254015, 0.12987044, 0.11949812,\n", + " 0.110658 , 0.10503597, 0.09725718, 0.09312193, 0.08970997,\n", + " 0.08403489, 0.08128475, 0.07834393, 0.07382032, 0.07253718]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", + " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", + " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", + " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", + " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", + "[11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", + " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", + " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", + " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", + " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", + "key dilution_factor\n", + "[0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", + " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", + " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", + " 0.07616189 0.07438004]\n", + "[0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", + " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", + " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", + " 0.07382032 0.07253718]\n", + "key t_inner\n", + "10642.04961793771 K\n", + "10630.162629818109 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", + " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", + " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", + " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", + " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", + "[11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", + " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", + " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", + " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", + " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", + " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", + " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", + " 0.07382032 0.07253718]\n", + "[0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", + " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", + " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", + " 0.07382032 0.07253718]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10630.162629818109 K\n", + "10636.10612387791 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 7/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0520605244141132e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46869175, 0.34895532, 0.27224562, 0.23088331, 0.19396912,\n", + " 0.16966304, 0.15365542, 0.14066858, 0.12625487, 0.11769845,\n", + " 0.10873443, 0.10217357, 0.09428761, 0.08974201, 0.08619004,\n", + " 0.08223116, 0.07778822, 0.07403971, 0.07307298, 0.07131406]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", + " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", + " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", + " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", + " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", + "[11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", + " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", + " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", + " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", + " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", + "key dilution_factor\n", + "[0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", + " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", + " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", + " 0.07382032 0.07253718]\n", + "[0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", + " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", + " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", + " 0.07307298 0.07131406]\n", + "key t_inner\n", + "10636.10612387791 K\n", + "10672.519064718867 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", + " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", + " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", + " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", + " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", + "[11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", + " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", + " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", + " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", + " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", + " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", + " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", + " 0.07307298 0.07131406]\n", + "[0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", + " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", + " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", + " 0.07307298 0.07131406]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10672.519064718867 K\n", + "10654.312594298388 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 8/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.069742087806739e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.47454747, 0.3549221 , 0.29087752, 0.24470866, 0.20504347,\n", + " 0.17741365, 0.15853185, 0.14501822, 0.13008714, 0.12233534,\n", + " 0.11238724, 0.1056973 , 0.09826038, 0.09469637, 0.0899278 ,\n", + " 0.08775182, 0.08291662, 0.08063515, 0.07697286, 0.07517475]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", + " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", + " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", + " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", + " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", + "[11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", + " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", + " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", + " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", + " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", + "key dilution_factor\n", + "[0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", + " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", + " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", + " 0.07307298 0.07131406]\n", + "[0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", + " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", + " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", + " 0.07697286 0.07517475]\n", + "key t_inner\n", + "10654.312594298388 K\n", + "10602.066725042137 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", + " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", + " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", + " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", + " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", + "[11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", + " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", + " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", + " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", + " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", + " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", + " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", + " 0.07697286 0.07517475]\n", + "[0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", + " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", + " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", + " 0.07697286 0.07517475]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10602.066725042137 K\n", + "10628.189659670263 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 9/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0529798362530551e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.4716537 , 0.35789003, 0.28915603, 0.24083881, 0.20785046,\n", + " 0.18387933, 0.16319168, 0.14789251, 0.13152998, 0.12372087,\n", + " 0.11428466, 0.10883619, 0.10279474, 0.09766572, 0.09081569,\n", + " 0.08593331, 0.08216376, 0.07911681, 0.07642695, 0.07384615]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", + " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", + " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", + " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", + " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", + "[11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", + " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", + " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", + " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", + " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", + "key dilution_factor\n", + "[0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", + " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", + " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", + " 0.07697286 0.07517475]\n", + "[0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", + " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", + " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", + " 0.07642695 0.07384615]\n", + "key t_inner\n", + "10628.189659670263 K\n", + "10659.91908849085 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", + " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", + " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", + " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", + " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", + "[11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", + " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", + " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", + " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", + " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", + " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", + " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", + " 0.07642695 0.07384615]\n", + "[0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", + " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", + " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", + " 0.07642695 0.07384615]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10659.91908849085 K\n", + "10644.054374080555 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 10/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0555093978401453e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46734278, 0.34160244, 0.27910321, 0.23050913, 0.19851418,\n", + " 0.17566634, 0.15711892, 0.13858011, 0.12834381, 0.11712264,\n", + " 0.11007393, 0.10251442, 0.09467132, 0.09072575, 0.08637418,\n", + " 0.0820531 , 0.07907594, 0.0777285 , 0.07510737, 0.07265138]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", + " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", + " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", + " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", + " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", + "[11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", + " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", + " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", + " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", + " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", + "key dilution_factor\n", + "[0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", + " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", + " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", + " 0.07642695 0.07384615]\n", + "[0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", + " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", + " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", + " 0.07510737 0.07265138]\n", + "key t_inner\n", + "10644.054374080555 K\n", + "10663.031008695967 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", + " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", + " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", + " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", + " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", + "[11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", + " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", + " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", + " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", + " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", + " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", + " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", + " 0.07510737 0.07265138]\n", + "[0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", + " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", + " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", + " 0.07510737 0.07265138]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10663.031008695967 K\n", + "10653.542691388262 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 11/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0617727732344977e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46565805, 0.35496694, 0.2890796 , 0.24118403, 0.20445484,\n", + " 0.1803628 , 0.15735297, 0.13967624, 0.12582808, 0.11966818,\n", + " 0.11138795, 0.10559409, 0.09923453, 0.0918869 , 0.08696933,\n", + " 0.08406816, 0.08086654, 0.0769431 , 0.07586562, 0.07336532]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", + " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", + " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", + " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", + " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", + "[11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", + " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", + " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", + " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", + " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", + "key dilution_factor\n", + "[0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", + " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", + " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", + " 0.07510737 0.07265138]\n", + "[0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", + " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", + " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", + " 0.07586562 0.07336532]\n", + "key t_inner\n", + "10653.542691388262 K\n", + "10641.01114781253 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", + " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", + " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", + " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", + " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", + "[11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", + " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", + " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", + " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", + " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", + " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", + " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", + " 0.07586562 0.07336532]\n", + "[0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", + " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", + " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", + " 0.07586562 0.07336532]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10641.01114781253 K\n", + "10647.276919600397 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 12/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.062627715933488e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46932796, 0.35988199, 0.28505597, 0.24047538, 0.20758977,\n", + " 0.18247685, 0.16491869, 0.14566113, 0.13053847, 0.1205756 ,\n", + " 0.113397 , 0.10727304, 0.10171231, 0.09280065, 0.08879406,\n", + " 0.08535812, 0.0813128 , 0.07954659, 0.07699622, 0.07445861]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", + " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", + " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", + " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", + " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", + "[11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", + " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", + " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", + " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", + " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", + "key dilution_factor\n", + "[0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", + " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", + " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", + " 0.07586562 0.07336532]\n", + "[0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", + " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", + " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", + " 0.07699622 0.07445861]\n", + "key t_inner\n", + "10647.276919600397 K\n", + "10630.473762446567 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", + " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", + " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", + " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", + " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", + "[11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", + " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", + " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", + " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", + " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", + " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", + " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", + " 0.07699622 0.07445861]\n", + "[0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", + " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", + " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", + " 0.07699622 0.07445861]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10630.473762446567 K\n", + "10638.875341023482 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 13/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0528341253755922e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.48394897, 0.36180621, 0.29091503, 0.24583547, 0.20725074,\n", + " 0.18050061, 0.1641561 , 0.14437985, 0.12930093, 0.11929659,\n", + " 0.11340474, 0.10641542, 0.10029314, 0.09450661, 0.09128329,\n", + " 0.08583574, 0.08193987, 0.07966061, 0.0772547 , 0.07431405]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", + " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", + " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", + " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", + " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", + "[10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", + " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", + " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", + " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", + " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", + "key dilution_factor\n", + "[0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", + " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", + " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", + " 0.07699622 0.07445861]\n", + "[0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", + " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", + " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", + " 0.0772547 0.07431405]\n", + "key t_inner\n", + "10638.875341023482 K\n", + "10671.375046499992 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", + " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", + " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", + " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", + " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", + "[10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", + " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", + " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", + " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", + " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", + " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", + " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", + " 0.0772547 0.07431405]\n", + "[0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", + " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", + " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", + " 0.0772547 0.07431405]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10671.375046499992 K\n", + "10655.125193761738 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 14/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.059103016026169e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.47247374, 0.36203939, 0.28908163, 0.23539114, 0.20183083,\n", + " 0.17676166, 0.15800651, 0.14388847, 0.13114229, 0.12300144,\n", + " 0.11277399, 0.10539713, 0.10147887, 0.09667081, 0.09030686,\n", + " 0.08580147, 0.08122763, 0.07912149, 0.07595031, 0.073735 ]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", + " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", + " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", + " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", + " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", + "[11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", + " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", + " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", + " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", + " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", + "key dilution_factor\n", + "[0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", + " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", + " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", + " 0.0772547 0.07431405]\n", + "[0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", + " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", + " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", + " 0.07595031 0.073735 ]\n", + "key t_inner\n", + "10655.125193761738 K\n", + "10655.997119688223 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", + " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", + " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", + " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", + " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", + "[11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", + " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", + " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", + " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", + " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", + " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", + " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", + " 0.07595031 0.073735 ]\n", + "[0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", + " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", + " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", + " 0.07595031 0.073735 ]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10655.997119688223 K\n", + "10655.56115672498 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 15/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0668824405561529e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46804431, 0.34723476, 0.28362 , 0.2402119 , 0.2042747 ,\n", + " 0.17542993, 0.15711546, 0.14083908, 0.12665973, 0.11702303,\n", + " 0.11040994, 0.10363904, 0.09816132, 0.09078707, 0.08479712,\n", + " 0.08159847, 0.07953048, 0.07630911, 0.07363748, 0.07179028]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", + " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", + " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", + " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", + " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", + "[11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", + " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", + " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", + " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", + " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", + "key dilution_factor\n", + "[0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", + " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", + " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", + " 0.07595031 0.073735 ]\n", + "[0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", + " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", + " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", + " 0.07363748 0.07179028]\n", + "key t_inner\n", + "10655.56115672498 K\n", + "10617.510088744195 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", + " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", + " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", + " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", + " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", + "[11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", + " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", + " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", + " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", + " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", + " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", + " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", + " 0.07363748 0.07179028]\n", + "[0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", + " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", + " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", + " 0.07363748 0.07179028]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10617.510088744195 K\n", + "10636.535622734587 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 16/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.057225256379625e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46397151, 0.35561237, 0.28682867, 0.23621025, 0.20608263,\n", + " 0.17691635, 0.15906282, 0.1420295 , 0.13175074, 0.12212206,\n", + " 0.11300866, 0.10531621, 0.09917458, 0.09274654, 0.08897179,\n", + " 0.08478992, 0.08135082, 0.0781394 , 0.07443394, 0.07303259]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", + " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", + " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", + " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", + " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", + "[11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", + " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", + " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", + " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", + " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", + "key dilution_factor\n", + "[0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", + " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", + " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", + " 0.07363748 0.07179028]\n", + "[0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", + " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", + " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", + " 0.07443394 0.07303259]\n", + "key t_inner\n", + "10636.535622734587 K\n", + "10646.84849500629 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", + " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", + " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", + " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", + " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", + "[11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", + " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", + " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", + " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", + " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", + " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", + " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", + " 0.07443394 0.07303259]\n", + "[0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", + " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", + " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", + " 0.07443394 0.07303259]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10646.84849500629 K\n", + "10641.692058870438 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 17/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Converged this iteration!\n", + "Volume_INNER: 1.009774784993981e+45\n", + "Emitted Luminosity: 1.0557926285002875e+43 erg / s\n", + "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", + "1100000000.0 cm / s\n", + "{'t_radiative': , 'dilution_factor': array([0.46583111, 0.35821399, 0.28478501, 0.23131748, 0.20190424,\n", + " 0.17672918, 0.15768939, 0.14187896, 0.1281619 , 0.11908551,\n", + " 0.11148042, 0.10454478, 0.09806677, 0.09312254, 0.08822151,\n", + " 0.08534236, 0.08173657, 0.07726564, 0.07559528, 0.07395579]), 't_inner': , 'v_inner_boundary': }\n", + "key t_radiative\n", + "[11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", + " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", + " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", + " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", + " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", + "[11069.33089377 11165.15751924 11272.62783772 11372.4522524\n", + " 11332.02806881 11329.6435672 11294.51865104 11261.56893248\n", + " 11241.47812926 11148.97525325 11071.52917648 11004.68560208\n", + " 10946.39979159 10861.42744062 10784.4789371 10655.55794227\n", + " 10586.11909387 10567.9967492 10435.71120389 10305.7063164 ] K\n", + "key dilution_factor\n", + "[0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", + " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", + " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", + " 0.07443394 0.07303259]\n", + "[0.46583111 0.35821399 0.28478501 0.23131748 0.20190424 0.17672918\n", + " 0.15768939 0.14187896 0.1281619 0.11908551 0.11148042 0.10454478\n", + " 0.09806677 0.09312254 0.08822151 0.08534236 0.08173657 0.07726564\n", + " 0.07559528 0.07395579]\n", + "key t_inner\n", + "10641.692058870438 K\n", + "10659.234452189152 K\n", + "key v_inner_boundary\n", + "1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "next v_inner 1100000000.0 cm / s\n", + "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", + " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", + " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", + " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", + " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", + "Check Convergence\n", + "t_radiative [11069.33089377 11165.15751924 11272.62783772 11372.4522524\n", + " 11332.02806881 11329.6435672 11294.51865104 11261.56893248\n", + " 11241.47812926 11148.97525325 11071.52917648 11004.68560208\n", + " 10946.39979159 10861.42744062 10784.4789371 10655.55794227\n", + " 10586.11909387 10567.9967492 10435.71120389 10305.7063164 ] K\n", + "[11069.33089377 11165.15751924 11272.62783772 11372.4522524\n", + " 11332.02806881 11329.6435672 11294.51865104 11261.56893248\n", + " 11241.47812926 11148.97525325 11071.52917648 11004.68560208\n", + " 10946.39979159 10861.42744062 10784.4789371 10655.55794227\n", + " 10586.11909387 10567.9967492 10435.71120389 10305.7063164 ] K\n", + "Status: True\n", + "Check Convergence\n", + "dilution_factor [0.46583111 0.35821399 0.28478501 0.23131748 0.20190424 0.17672918\n", + " 0.15768939 0.14187896 0.1281619 0.11908551 0.11148042 0.10454478\n", + " 0.09806677 0.09312254 0.08822151 0.08534236 0.08173657 0.07726564\n", + " 0.07559528 0.07395579]\n", + "[0.46583111 0.35821399 0.28478501 0.23131748 0.20190424 0.17672918\n", + " 0.15768939 0.14187896 0.1281619 0.11908551 0.11148042 0.10454478\n", + " 0.09806677 0.09312254 0.08822151 0.08534236 0.08173657 0.07726564\n", + " 0.07559528 0.07395579]\n", + "Status: True\n", + "Check Convergence\n", + "t_inner 10659.234452189152 K\n", + "10650.463255529794 K\n", + "Status: True\n", + "Check Convergence\n", + "v_inner_boundary 1100000000.0 cm / s\n", + "1100000000.0 cm / s\n", + "Status: True\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 18/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", + "Converged this iteration!\n" + ] + } + ], "source": [ - "workflow.run()" + "workflow.solve()" ] }, { @@ -88,9 +1652,9 @@ ], "metadata": { "kernelspec": { - "display_name": "tardis", + "display_name": "Python [conda env:miniconda3-tardis]", "language": "python", - "name": "python3" + "name": "conda-env-miniconda3-tardis-py" }, "language_info": { "codemirror_mode": { @@ -102,7 +1666,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.3" + "version": "3.12.4" } }, "nbformat": 4, diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index 608fb0fbd38..26e0b042300 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -9,7 +9,7 @@ from tardis.io.atom_data.base import AtomData from tardis.model import SimulationState from tardis.plasma.radiation_field import DilutePlanckianRadiationField -from tardis.plasma.standard_plasmas import assemble_plasma +from tardis.plasma.assembly.legacy_assembly import assemble_plasma from tardis.simulation.convergence import ConvergenceSolver from tardis.spectrum.base import SpectrumSolver from tardis.spectrum.formal_integral import FormalIntegrator diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 21e35a09681..37d423b6fbe 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -8,7 +8,6 @@ from tardis.spectrum.formal_integral import FormalIntegrator from tardis.workflows.simple_simulation import SimpleSimulation from tardis.workflows.util import get_tau_integ -from tardis.plasma.standard_plasmas import assemble_plasma from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.opacities.opacity_solver import OpacitySolver from tardis.opacities.macro_atom.macroatom_solver import MacroAtomSolver @@ -149,9 +148,6 @@ def get_convergence_estimates(self, transport_state): ** self.convergence_strategy.t_inner_update_exponent ) - self.tracker['emitted_luminosity'].append(emitted_luminosity) - self.tracker['estimated_t_inner'].append(estimated_t_inner) - estimated_v_inner = self.estimate_v_inner() if estimated_v_inner < self.simulation_state.geometry.v_inner[0]: estimated_v_inner = self.simulation_state.geometry.v_inner[0] @@ -181,7 +177,7 @@ def reproject(self, a1, a2, m1, m2): a1_expanded[m1] = a1 a2_expanded[m2] = a2 - + joint_mask = m1 & m2 return a1_expanded[joint_mask], a2_expanded[joint_mask] From 54a5d83c5b3d8453ac1e8e4d717a88ffdf2b4e19 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 12:40:02 -0400 Subject: [PATCH 31/61] Reduced size of overloaded functions to make them more in-line with the simple solver, updated simple solver to handle current tardis master branch --- docs/workflows/v_inner_solver_workflow.ipynb | 1576 ++---------------- tardis/workflows/simple_simulation.py | 41 +- tardis/workflows/v_inner_solver.py | 369 ++-- 3 files changed, 231 insertions(+), 1755 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 72b27f4defd..91a186b61e2 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -59,7 +59,7 @@ "text": [ "[\u001b[1mtardis.workflows.simple_simulation\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", "\t\n", - "\tReading Atomic Data from ../kurucz_cd23_chianti_H_He.h5 (\u001b[1msimple_simulation.py\u001b[0m:149)\n", + "\tReading Atomic Data from ../kurucz_cd23_chianti_H_He.h5 (\u001b[1msimple_simulation.py\u001b[0m:161)\n", "[\u001b[1mtardis.io.atom_data.util\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", "\t\n", "\tAtom Data kurucz_cd23_chianti_H_He.h5 not found in local path.\n", @@ -76,12 +76,16 @@ } ], "source": [ + "from astropy import units as u\n", + "\n", "config.montecarlo.convergence_strategy['v_inner_boundary'] = {\n", " 'damping_constant' : 0.5,\n", " 'threshold' : 0.01,\n", " 'type' : 'damped'\n", " }\n", "\n", + "config.model.structure.velocity.start = 7000 * u.km/u.s\n", + "\n", "workflow = InnerVelocitySimulationSolver(config)" ] }, @@ -97,1513 +101,103 @@ "[\u001b[1mpy.warnings \u001b[0m][\u001b[1;33mWARNING\u001b[0m] \n", "\t/home/jobrien/Documents/soft/tardis/tardis/transport/montecarlo/montecarlo_main_loop.py:123: NumbaTypeSafetyWarning: \u001b[1m\u001b[1m\u001b[1munsafe cast from uint64 to int64. Precision may be lost.\u001b[0m\u001b[0m\u001b[0m\n", " vpacket_collection = vpacket_collections[i]\n", - " (\u001b[1mwarnings.py\u001b[0m:112)\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 7.942174905766288e+42 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.50749398, 0.39593831, 0.32150486, 0.26573788, 0.2236516 ,\n", - " 0.19686689, 0.1746428 , 0.15625093, 0.13946942, 0.12759534,\n", - " 0.11697795, 0.10915673, 0.10296464, 0.09515332, 0.08981745,\n", - " 0.08689548, 0.08198791, 0.0788115 , 0.07637264, 0.07345198]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[9926.50196546 9911.63537753 9896.81325339 9882.03539385 9867.30160093\n", - " 9852.6116778 9837.96542884 9823.36265956 9808.80317663 9794.28678787\n", - " 9779.81330223 9765.3825298 9750.99428177 9736.64837045 9722.34460927\n", - " 9708.08281272 9693.8627964 9679.68437699 9665.54737223 9651.45160094] K\n", - "[10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", - " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", - " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", - " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", - " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", - "key dilution_factor\n", - "[0.40039164 0.33245223 0.28966798 0.2577141 0.23224568 0.21120466\n", - " 0.19341188 0.17811402 0.16479446 0.1530809 0.14269498 0.13342262\n", - " 0.12509541 0.11757849 0.11076215 0.10455605 0.09888494 0.09368554\n", - " 0.08890421 0.08449514]\n", - "[0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", - " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", - " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", - " 0.07637264 0.07345198]\n", - "key t_inner\n", - "9933.951995919648 K\n", - "11472.471128925046 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", - " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", - " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", - " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", - " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", - "[10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", - " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", - " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", - " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", - " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", - " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", - " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", - " 0.07637264 0.07345198]\n", - "[0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", - " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", - " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", - " 0.07637264 0.07345198]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 11472.471128925046 K\n", - "10703.211562422348 K\n", - "Status: False\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0710516521093009e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.52466218, 0.41191697, 0.33082428, 0.27394158, 0.23102276,\n", - " 0.20265771, 0.18068104, 0.16215467, 0.14618948, 0.13362669,\n", - " 0.12450449, 0.11605105, 0.10925211, 0.10302987, 0.09831779,\n", - " 0.09325771, 0.08908436, 0.08446805, 0.08117713, 0.07815149]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[10140.64465844 10163.14095376 10199.39278122 10228.79305818\n", - " 10271.14775928 10224.00971353 10228.73252394 10216.98049975\n", - " 10217.78303396 10193.7062316 10148.77879425 10080.13679025\n", - " 10031.64688214 10030.25454967 9988.12702379 9874.6342221\n", - " 9844.47490313 9776.38186223 9680.56258178 9611.59305843] K\n", - "[10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", - " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", - " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", - " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", - " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", - "key dilution_factor\n", - "[0.50749398 0.39593831 0.32150486 0.26573788 0.2236516 0.19686689\n", - " 0.1746428 0.15625093 0.13946942 0.12759534 0.11697795 0.10915673\n", - " 0.10296464 0.09515332 0.08981745 0.08689548 0.08198791 0.0788115\n", - " 0.07637264 0.07345198]\n", - "[0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", - " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", - " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", - " 0.08117713 0.07815149]\n", - "key t_inner\n", - "10703.211562422348 K\n", - "10644.212645494625 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", - " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", - " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", - " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", - " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", - "[10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", - " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", - " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", - " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", - " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", - " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", - " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", - " 0.08117713 0.07815149]\n", - "[0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", - " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", - " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", - " 0.08117713 0.07815149]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10644.212645494625 K\n", - "10673.712103958485 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", - "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 1/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0744260406037982e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.48255611, 0.37531674, 0.30088544, 0.24970651, 0.21504789,\n", - " 0.18892102, 0.16485989, 0.14922567, 0.13734335, 0.12706282,\n", - " 0.1181651 , 0.11046612, 0.10408752, 0.09837704, 0.09380108,\n", - " 0.08948234, 0.08532986, 0.08049858, 0.07819235, 0.0759959 ]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[10821.38471645 10824.07375075 10898.79428258 10931.58172804\n", - " 10962.88335303 10956.47244939 10935.66181184 10896.39448534\n", - " 10868.77828681 10846.86064743 10799.24289998 10741.07825617\n", - " 10679.03654492 10616.64136277 10548.48575513 10483.02731885\n", - " 10402.58849318 10353.52883888 10280.79036467 10205.89807451] K\n", - "[11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", - " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", - " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", - " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", - " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", - "key dilution_factor\n", - "[0.52466218 0.41191697 0.33082428 0.27394158 0.23102276 0.20265771\n", - " 0.18068104 0.16215467 0.14618948 0.13362669 0.12450449 0.11605105\n", - " 0.10925211 0.10302987 0.09831779 0.09325771 0.08908436 0.08446805\n", - " 0.08117713 0.07815149]\n", - "[0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", - " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", - " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", - " 0.07819235 0.0759959 ]\n", - "key t_inner\n", - "10673.712103958485 K\n", - "10598.193920505333 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", - " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", - " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", - " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", - " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", - "[11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", - " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", - " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", - " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", - " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", - " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", - " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", - " 0.07819235 0.0759959 ]\n", - "[0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", - " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", - " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", - " 0.07819235 0.0759959 ]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10598.193920505333 K\n", - "10635.953012231908 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", - "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 2/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + " (\u001b[1mwarnings.py\u001b[0m:112)\n" ] }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "07f3aae6f0fe452e82a0cc7e1c3137d9", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "TqdmHBox(children=(HTML(value='Iterations:', layout=Layout(width='6%')), FloatProgress(value=0.0, layout=Layou…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "56250e25d1544e0dbe2e7919904c15ba", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "TqdmHBox(children=(HTML(value='Packets:\\u2007\\u2007\\u2007', layout=Layout(width='6%')), FloatProgress(value=0.…" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "name": "stdout", "output_type": "stream", "text": [ - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.058299613889192e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46875385, 0.35824408, 0.28599635, 0.23841077, 0.20840515,\n", - " 0.1824598 , 0.16385303, 0.14657197, 0.13503875, 0.12203984,\n", - " 0.11334206, 0.10619058, 0.09765446, 0.09265039, 0.08856995,\n", - " 0.08610302, 0.08350964, 0.07926097, 0.07675258, 0.07475269]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11001.63491829 11064.19968901 11146.78754506 11182.28065333\n", - " 11189.73612369 11179.45436942 11213.79207405 11157.65104977\n", - " 11091.36669218 11032.68191167 10951.71311171 10882.34759365\n", - " 10815.56574149 10758.06238845 10666.64578956 10589.47659777\n", - " 10519.2790706 10489.38084626 10394.3313645 10280.44535661] K\n", - "[11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", - " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", - " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", - " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", - " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", - "key dilution_factor\n", - "[0.48255611 0.37531674 0.30088544 0.24970651 0.21504789 0.18892102\n", - " 0.16485989 0.14922567 0.13734335 0.12706282 0.1181651 0.11046612\n", - " 0.10408752 0.09837704 0.09380108 0.08948234 0.08532986 0.08049858\n", - " 0.07819235 0.0759959 ]\n", - "[0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", - " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", - " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", - " 0.07675258 0.07475269]\n", - "key t_inner\n", - "10635.953012231908 K\n", - "10640.860045311447 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", - " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", - " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", - " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", - " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", - "[11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", - " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", - " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", - " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", - " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", - " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", - " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", - " 0.07675258 0.07475269]\n", - "[0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", - " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", - " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", - " 0.07675258 0.07475269]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10640.860045311447 K\n", - "10638.406528771677 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 3/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0545940091430881e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.47879511, 0.36722912, 0.2926209 , 0.24239289, 0.20444578,\n", - " 0.17802906, 0.15880728, 0.14352699, 0.13113431, 0.12123492,\n", - " 0.11293848, 0.10720612, 0.09996151, 0.09452711, 0.08773742,\n", - " 0.08385741, 0.08091696, 0.07741621, 0.07503067, 0.07273053]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11038.69813332 11131.43579944 11213.98463304 11254.93853746\n", - " 11264.10756108 11231.11402625 11180.2347671 11161.43757583\n", - " 11095.86109073 11098.45860756 11036.77140577 10960.4969064\n", - " 10968.57581946 10890.82898991 10799.34113734 10659.85338315\n", - " 10549.23162343 10506.78825019 10398.59522782 10289.34989473] K\n", - "[11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", - " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", - " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", - " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", - " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", - "key dilution_factor\n", - "[0.46875385 0.35824408 0.28599635 0.23841077 0.20840515 0.1824598\n", - " 0.16385303 0.14657197 0.13503875 0.12203984 0.11334206 0.10619058\n", - " 0.09765446 0.09265039 0.08856995 0.08610302 0.08350964 0.07926097\n", - " 0.07675258 0.07475269]\n", - "[0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", - " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", - " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", - " 0.07503067 0.07273053]\n", - "key t_inner\n", - "10638.406528771677 K\n", - "10661.997396397868 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", - " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", - " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", - " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", - " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", - "[11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", - " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", - " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", - " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", - " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", - " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", - " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", - " 0.07503067 0.07273053]\n", - "[0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", - " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", - " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", - " 0.07503067 0.07273053]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10661.997396397868 K\n", - "10650.201962584772 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tResized Geometry, Convergence Suppressed (\u001b[1mv_inner_solver.py\u001b[0m:138)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 4/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "SIMULATION CONVERGED!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.060968189077441e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46974009, 0.35887007, 0.29077777, 0.24436512, 0.20776673,\n", - " 0.1852075 , 0.16487115, 0.14711076, 0.1352503 , 0.12403258,\n", - " 0.11208235, 0.10708809, 0.10081991, 0.09351009, 0.08797758,\n", - " 0.08557481, 0.08167863, 0.07764065, 0.0757896 , 0.07324774]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11004.02448966 11119.37090798 11195.43527278 11259.07218493\n", - " 11285.20780805 11285.17736285 11257.66978538 11225.43557194\n", - " 11186.44576823 11099.12670598 11029.75412478 10939.09235294\n", - " 10877.97750528 10799.95286314 10803.9496266 10716.29418721\n", - " 10608.39027777 10536.80030265 10451.3450021 10351.49943392] K\n", - "[11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", - " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", - " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", - " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", - " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", - "key dilution_factor\n", - "[0.47879511 0.36722912 0.2926209 0.24239289 0.20444578 0.17802906\n", - " 0.15880728 0.14352699 0.13113431 0.12123492 0.11293848 0.10720612\n", - " 0.09996151 0.09452711 0.08773742 0.08385741 0.08091696 0.07741621\n", - " 0.07503067 0.07273053]\n", - "[0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", - " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", - " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", - " 0.0757896 0.07324774]\n", - "key t_inner\n", - "10650.201962584772 K\n", - "10641.7071190342 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", - " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", - " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", - " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", - " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", - "[11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", - " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", - " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", - " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", - " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", - " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", - " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", - " 0.0757896 0.07324774]\n", - "[0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", - " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", - " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", - " 0.0757896 0.07324774]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10641.7071190342 K\n", - "10645.954540809485 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tResized Geometry, Convergence Suppressed (\u001b[1mv_inner_solver.py\u001b[0m:138)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 5/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0608322361748786e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46951709, 0.35581324, 0.28344389, 0.23679038, 0.20063187,\n", - " 0.17752656, 0.1589681 , 0.14566984, 0.13249513, 0.11945437,\n", - " 0.11202516, 0.10653028, 0.09880763, 0.09250431, 0.09049046,\n", - " 0.08597717, 0.08263854, 0.0794279 , 0.07616189, 0.07438004]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11049.22873236 11156.73935452 11233.15917184 11257.86819872\n", - " 11259.22121338 11218.72848779 11177.38354003 11170.93260294\n", - " 11091.33964489 11058.83258871 11086.88647212 10967.00040004\n", - " 10888.70551251 10859.35117396 10794.11621245 10665.94045423\n", - " 10614.03676534 10560.1676356 10433.60010903 10347.13545423] K\n", - "[11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", - " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", - " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", - " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", - " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", - "key dilution_factor\n", - "[0.46974009 0.35887007 0.29077777 0.24436512 0.20776673 0.1852075\n", - " 0.16487115 0.14711076 0.1352503 0.12403258 0.11208235 0.10708809\n", - " 0.10081991 0.09351009 0.08797758 0.08557481 0.08167863 0.07764065\n", - " 0.0757896 0.07324774]\n", - "[0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", - " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", - " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", - " 0.07616189 0.07438004]\n", - "key t_inner\n", - "10645.954540809485 K\n", - "10638.144695065934 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", - " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", - " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", - " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", - " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", - "[11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", - " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", - " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", - " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", - " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", - " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", - " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", - " 0.07616189 0.07438004]\n", - "[0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", - " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", - " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", - " 0.07616189 0.07438004]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10638.144695065934 K\n", - "10642.04961793771 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tResized Geometry, Convergence Suppressed (\u001b[1mv_inner_solver.py\u001b[0m:138)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 6/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0616467173322807e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.47175098, 0.35333643, 0.27692864, 0.23227463, 0.19923393,\n", - " 0.17521545, 0.15695861, 0.14254015, 0.12987044, 0.11949812,\n", - " 0.110658 , 0.10503597, 0.09725718, 0.09312193, 0.08970997,\n", - " 0.08403489, 0.08128475, 0.07834393, 0.07382032, 0.07253718]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11037.08503719 11149.99649869 11245.89599207 11293.02108535\n", - " 11348.84454634 11303.8145075 11275.88616036 11193.56185448\n", - " 11139.76204035 11142.50167244 11052.15710507 10947.27834377\n", - " 10930.6733971 10870.23261875 10717.53851163 10653.97872532\n", - " 10563.07621005 10483.38747111 10423.15401495 10305.2696298 ] K\n", - "[11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", - " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", - " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", - " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", - " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", - "key dilution_factor\n", - "[0.46951709 0.35581324 0.28344389 0.23679038 0.20063187 0.17752656\n", - " 0.1589681 0.14566984 0.13249513 0.11945437 0.11202516 0.10653028\n", - " 0.09880763 0.09250431 0.09049046 0.08597717 0.08263854 0.0794279\n", - " 0.07616189 0.07438004]\n", - "[0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", - " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", - " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", - " 0.07382032 0.07253718]\n", - "key t_inner\n", - "10642.04961793771 K\n", - "10630.162629818109 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", - " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", - " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", - " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", - " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", - "[11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", - " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", - " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", - " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", - " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", - " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", - " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", - " 0.07382032 0.07253718]\n", - "[0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", - " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", - " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", - " 0.07382032 0.07253718]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10630.162629818109 K\n", - "10636.10612387791 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tResized Geometry, Convergence Suppressed (\u001b[1mv_inner_solver.py\u001b[0m:138)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 7/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0520605244141132e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46869175, 0.34895532, 0.27224562, 0.23088331, 0.19396912,\n", - " 0.16966304, 0.15365542, 0.14066858, 0.12625487, 0.11769845,\n", - " 0.10873443, 0.10217357, 0.09428761, 0.08974201, 0.08619004,\n", - " 0.08223116, 0.07778822, 0.07403971, 0.07307298, 0.07131406]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11052.2953255 11212.70536192 11368.86459118 11398.78996375\n", - " 11425.82406508 11374.7556817 11321.37318474 11274.45338555\n", - " 11206.41476321 11152.83045284 11103.73790815 10987.81945398\n", - " 10971.69646539 10850.5431098 10728.16976023 10715.36023174\n", - " 10614.32990357 10533.83597401 10505.23779476 10368.71936512] K\n", - "[11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", - " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", - " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", - " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", - " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", - "key dilution_factor\n", - "[0.47175098 0.35333643 0.27692864 0.23227463 0.19923393 0.17521545\n", - " 0.15695861 0.14254015 0.12987044 0.11949812 0.110658 0.10503597\n", - " 0.09725718 0.09312193 0.08970997 0.08403489 0.08128475 0.07834393\n", - " 0.07382032 0.07253718]\n", - "[0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", - " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", - " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", - " 0.07307298 0.07131406]\n", - "key t_inner\n", - "10636.10612387791 K\n", - "10672.519064718867 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", - " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", - " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", - " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", - " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", - "[11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", - " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", - " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", - " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", - " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", - " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", - " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", - " 0.07307298 0.07131406]\n", - "[0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", - " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", - " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", - " 0.07307298 0.07131406]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10672.519064718867 K\n", - "10654.312594298388 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 1/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 8/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.069742087806739e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.47454747, 0.3549221 , 0.29087752, 0.24470866, 0.20504347,\n", - " 0.17741365, 0.15853185, 0.14501822, 0.13008714, 0.12233534,\n", - " 0.11238724, 0.1056973 , 0.09826038, 0.09469637, 0.0899278 ,\n", - " 0.08775182, 0.08291662, 0.08063515, 0.07697286, 0.07517475]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11054.59178733 11225.52828283 11397.75656771 11384.01536592\n", - " 11451.38927425 11459.61058898 11376.05002919 11274.09551615\n", - " 11272.49921776 11178.08596163 11140.79175429 11068.61191276\n", - " 11035.29165497 10948.37962269 10846.3084348 10760.16454855\n", - " 10717.14263906 10660.04707329 10504.05945233 10393.01118124] K\n", - "[11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", - " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", - " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", - " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", - " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", - "key dilution_factor\n", - "[0.46869175 0.34895532 0.27224562 0.23088331 0.19396912 0.16966304\n", - " 0.15365542 0.14066858 0.12625487 0.11769845 0.10873443 0.10217357\n", - " 0.09428761 0.08974201 0.08619004 0.08223116 0.07778822 0.07403971\n", - " 0.07307298 0.07131406]\n", - "[0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", - " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", - " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", - " 0.07697286 0.07517475]\n", - "key t_inner\n", - "10654.312594298388 K\n", - "10602.066725042137 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", - " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", - " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", - " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", - " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", - "[11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", - " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", - " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", - " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", - " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", - " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", - " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", - " 0.07697286 0.07517475]\n", - "[0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", - " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", - " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", - " 0.07697286 0.07517475]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10602.066725042137 K\n", - "10628.189659670263 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tResized Geometry, Convergence Suppressed (\u001b[1mv_inner_solver.py\u001b[0m:138)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 9/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0529798362530551e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.4716537 , 0.35789003, 0.28915603, 0.24083881, 0.20785046,\n", - " 0.18387933, 0.16319168, 0.14789251, 0.13152998, 0.12372087,\n", - " 0.11428466, 0.10883619, 0.10279474, 0.09766572, 0.09081569,\n", - " 0.08593331, 0.08216376, 0.07911681, 0.07642695, 0.07384615]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11038.82412974 11205.22119812 11257.27621095 11249.98212483\n", - " 11346.90454878 11369.20084531 11327.9756374 11265.7027797\n", - " 11242.69566867 11125.71335498 11085.64318931 11003.76680745\n", - " 10952.92546305 10818.86596223 10751.82766992 10622.89028947\n", - " 10581.15392262 10457.76532567 10406.86329359 10293.690966 ] K\n", - "[11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", - " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", - " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", - " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", - " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", - "key dilution_factor\n", - "[0.47454747 0.3549221 0.29087752 0.24470866 0.20504347 0.17741365\n", - " 0.15853185 0.14501822 0.13008714 0.12233534 0.11238724 0.1056973\n", - " 0.09826038 0.09469637 0.0899278 0.08775182 0.08291662 0.08063515\n", - " 0.07697286 0.07517475]\n", - "[0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", - " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", - " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", - " 0.07642695 0.07384615]\n", - "key t_inner\n", - "10628.189659670263 K\n", - "10659.91908849085 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", - " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", - " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", - " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", - " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", - "[11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", - " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", - " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", - " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", - " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", - " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", - " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", - " 0.07642695 0.07384615]\n", - "[0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", - " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", - " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", - " 0.07642695 0.07384615]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10659.91908849085 K\n", - "10644.054374080555 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 1/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 10/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0555093978401453e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46734278, 0.34160244, 0.27910321, 0.23050913, 0.19851418,\n", - " 0.17566634, 0.15711892, 0.13858011, 0.12834381, 0.11712264,\n", - " 0.11007393, 0.10251442, 0.09467132, 0.09072575, 0.08637418,\n", - " 0.0820531 , 0.07907594, 0.0777285 , 0.07510737, 0.07265138]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11033.00930341 11148.87943006 11221.61576249 11261.57342813\n", - " 11263.0819914 11194.3610162 11176.65368617 11119.36295718\n", - " 11160.89720321 11060.8763702 11002.14495655 10869.25697781\n", - " 10791.65731618 10690.96330763 10679.12676316 10633.7137583\n", - " 10563.59382309 10475.66664207 10394.48661059 10307.337749 ] K\n", - "[11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", - " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", - " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", - " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", - " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", - "key dilution_factor\n", - "[0.4716537 0.35789003 0.28915603 0.24083881 0.20785046 0.18387933\n", - " 0.16319168 0.14789251 0.13152998 0.12372087 0.11428466 0.10883619\n", - " 0.10279474 0.09766572 0.09081569 0.08593331 0.08216376 0.07911681\n", - " 0.07642695 0.07384615]\n", - "[0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", - " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", - " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", - " 0.07510737 0.07265138]\n", - "key t_inner\n", - "10644.054374080555 K\n", - "10663.031008695967 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", - " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", - " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", - " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", - " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", - "[11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", - " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", - " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", - " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", - " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", - " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", - " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", - " 0.07510737 0.07265138]\n", - "[0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", - " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", - " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", - " 0.07510737 0.07265138]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10663.031008695967 K\n", - "10653.542691388262 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 2/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 11/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0617727732344977e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46565805, 0.35496694, 0.2890796 , 0.24118403, 0.20445484,\n", - " 0.1803628 , 0.15735297, 0.13967624, 0.12582808, 0.11966818,\n", - " 0.11138795, 0.10559409, 0.09923453, 0.0918869 , 0.08696933,\n", - " 0.08406816, 0.08086654, 0.0769431 , 0.07586562, 0.07336532]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11074.30419028 11270.07470439 11337.64675384 11393.76784436\n", - " 11382.4324931 11342.02625999 11307.59768113 11335.17177599\n", - " 11250.63925423 11213.12741873 11110.77219955 11064.25134352\n", - " 11042.85852055 10922.4508845 10850.73898781 10785.37659268\n", - " 10674.16887868 10522.16989205 10443.42359966 10348.15135432] K\n", - "[11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", - " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", - " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", - " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", - " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", - "key dilution_factor\n", - "[0.46734278 0.34160244 0.27910321 0.23050913 0.19851418 0.17566634\n", - " 0.15711892 0.13858011 0.12834381 0.11712264 0.11007393 0.10251442\n", - " 0.09467132 0.09072575 0.08637418 0.0820531 0.07907594 0.0777285\n", - " 0.07510737 0.07265138]\n", - "[0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", - " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", - " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", - " 0.07586562 0.07336532]\n", - "key t_inner\n", - "10653.542691388262 K\n", - "10641.01114781253 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", - " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", - " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", - " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", - " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", - "[11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", - " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", - " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", - " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", - " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", - " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", - " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", - " 0.07586562 0.07336532]\n", - "[0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", - " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", - " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", - " 0.07586562 0.07336532]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10641.01114781253 K\n", - "10647.276919600397 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 3/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 12/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.062627715933488e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46932796, 0.35988199, 0.28505597, 0.24047538, 0.20758977,\n", - " 0.18247685, 0.16491869, 0.14566113, 0.13053847, 0.1205756 ,\n", - " 0.113397 , 0.10727304, 0.10171231, 0.09280065, 0.08879406,\n", - " 0.08535812, 0.0813128 , 0.07954659, 0.07699622, 0.07445861]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11087.52557543 11201.22705956 11264.11579041 11292.8246381\n", - " 11317.15699027 11281.49858233 11322.20702893 11339.77168039\n", - " 11327.17899898 11167.49322138 11090.70331811 10991.06171591\n", - " 10921.09201331 10921.41480971 10849.20591351 10756.1078145\n", - " 10644.63021758 10587.88644617 10437.51686717 10342.48967841] K\n", - "[11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", - " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", - " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", - " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", - " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", - "key dilution_factor\n", - "[0.46565805 0.35496694 0.2890796 0.24118403 0.20445484 0.1803628\n", - " 0.15735297 0.13967624 0.12582808 0.11966818 0.11138795 0.10559409\n", - " 0.09923453 0.0918869 0.08696933 0.08406816 0.08086654 0.0769431\n", - " 0.07586562 0.07336532]\n", - "[0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", - " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", - " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", - " 0.07699622 0.07445861]\n", - "key t_inner\n", - "10647.276919600397 K\n", - "10630.473762446567 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", - " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", - " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", - " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", - " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", - "[11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", - " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", - " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", - " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", - " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", - " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", - " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", - " 0.07699622 0.07445861]\n", - "[0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", - " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", - " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", - " 0.07699622 0.07445861]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10630.473762446567 K\n", - "10638.875341023482 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 4/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", + "SIMULATION CONVERGED!\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 13/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0528341253755922e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.48394897, 0.36180621, 0.29091503, 0.24583547, 0.20725074,\n", - " 0.18050061, 0.1641561 , 0.14437985, 0.12930093, 0.11929659,\n", - " 0.11340474, 0.10641542, 0.10029314, 0.09450661, 0.09128329,\n", - " 0.08583574, 0.08193987, 0.07966061, 0.0772547 , 0.07431405]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11068.04630919 11150.16577752 11259.9279453 11258.67194923\n", - " 11266.89368716 11275.90713898 11188.30454724 11219.76955522\n", - " 11200.24347673 11135.25166157 11027.95539341 10929.69872044\n", - " 10834.15717549 10882.48610874 10770.22556367 10675.83704147\n", - " 10617.65992961 10487.333285 10387.97800465 10300.55139162] K\n", - "[10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", - " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", - " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", - " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", - " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", - "key dilution_factor\n", - "[0.46932796 0.35988199 0.28505597 0.24047538 0.20758977 0.18247685\n", - " 0.16491869 0.14566113 0.13053847 0.1205756 0.113397 0.10727304\n", - " 0.10171231 0.09280065 0.08879406 0.08535812 0.0813128 0.07954659\n", - " 0.07699622 0.07445861]\n", - "[0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", - " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", - " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", - " 0.0772547 0.07431405]\n", - "key t_inner\n", - "10638.875341023482 K\n", - "10671.375046499992 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", - " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", - " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", - " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", - " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", - "[10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", - " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", - " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", - " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", - " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", - " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", - " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", - " 0.0772547 0.07431405]\n", - "[0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", - " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", - " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", - " 0.0772547 0.07431405]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10671.375046499992 K\n", - "10655.125193761738 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 5/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 14/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.059103016026169e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.47247374, 0.36203939, 0.28908163, 0.23539114, 0.20183083,\n", - " 0.17676166, 0.15800651, 0.14388847, 0.13114229, 0.12300144,\n", - " 0.11277399, 0.10539713, 0.10147887, 0.09667081, 0.09030686,\n", - " 0.08580147, 0.08122763, 0.07912149, 0.07595031, 0.073735 ]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[10967.31969478 11126.76319145 11217.76130125 11206.13030994\n", - " 11283.79566705 11284.21872717 11191.20117549 11202.31683401\n", - " 11201.78429766 11146.6249267 11022.88656442 10942.8526654\n", - " 10865.77960078 10807.44418604 10676.48415888 10656.71918968\n", - " 10574.82074306 10453.64676793 10351.64152603 10281.91872442] K\n", - "[11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", - " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", - " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", - " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", - " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", - "key dilution_factor\n", - "[0.48394897 0.36180621 0.29091503 0.24583547 0.20725074 0.18050061\n", - " 0.1641561 0.14437985 0.12930093 0.11929659 0.11340474 0.10641542\n", - " 0.10029314 0.09450661 0.09128329 0.08583574 0.08193987 0.07966061\n", - " 0.0772547 0.07431405]\n", - "[0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", - " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", - " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", - " 0.07595031 0.073735 ]\n", - "key t_inner\n", - "10655.125193761738 K\n", - "10655.997119688223 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", - " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", - " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", - " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", - " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", - "[11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", - " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", - " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", - " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", - " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", - " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", - " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", - " 0.07595031 0.073735 ]\n", - "[0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", - " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", - " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", - " 0.07595031 0.073735 ]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10655.997119688223 K\n", - "10655.56115672498 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 6/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 7/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 15/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0668824405561529e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46804431, 0.34723476, 0.28362 , 0.2402119 , 0.2042747 ,\n", - " 0.17542993, 0.15711546, 0.14083908, 0.12665973, 0.11702303,\n", - " 0.11040994, 0.10363904, 0.09816132, 0.09078707, 0.08479712,\n", - " 0.08159847, 0.07953048, 0.07630911, 0.07363748, 0.07179028]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11042.34717272 11122.9730372 11214.47667585 11336.7140912\n", - " 11337.33375641 11307.07626133 11262.52884472 11207.51882386\n", - " 11171.68176635 11058.33135378 11044.39077603 10976.33236646\n", - " 10821.88548466 10742.9657245 10725.75712215 10644.12611458\n", - " 10614.93026933 10486.42793356 10417.74246371 10319.21159596] K\n", - "[11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", - " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", - " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", - " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", - " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", - "key dilution_factor\n", - "[0.47247374 0.36203939 0.28908163 0.23539114 0.20183083 0.17676166\n", - " 0.15800651 0.14388847 0.13114229 0.12300144 0.11277399 0.10539713\n", - " 0.10147887 0.09667081 0.09030686 0.08580147 0.08122763 0.07912149\n", - " 0.07595031 0.073735 ]\n", - "[0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", - " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", - " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", - " 0.07363748 0.07179028]\n", - "key t_inner\n", - "10655.56115672498 K\n", - "10617.510088744195 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", - " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", - " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", - " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", - " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", - "[11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", - " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", - " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", - " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", - " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", - " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", - " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", - " 0.07363748 0.07179028]\n", - "[0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", - " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", - " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", - " 0.07363748 0.07179028]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10617.510088744195 K\n", - "10636.535622734587 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 8/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 16/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.057225256379625e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46397151, 0.35561237, 0.28682867, 0.23621025, 0.20608263,\n", - " 0.17691635, 0.15906282, 0.1420295 , 0.13175074, 0.12212206,\n", - " 0.11300866, 0.10531621, 0.09917458, 0.09274654, 0.08897179,\n", - " 0.08478992, 0.08135082, 0.0781394 , 0.07443394, 0.07303259]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11061.10409422 11239.55998142 11281.83666787 11287.12968336\n", - " 11328.91317231 11369.43492056 11306.69988325 11287.27423427\n", - " 11280.81984045 11215.60912029 11108.66652598 11024.66719788\n", - " 10941.48619796 10940.86199798 10919.37937141 10824.56155788\n", - " 10688.40032593 10602.12773334 10514.7587393 10409.7196421 ] K\n", - "[11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", - " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", - " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", - " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", - " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", - "key dilution_factor\n", - "[0.46804431 0.34723476 0.28362 0.2402119 0.2042747 0.17542993\n", - " 0.15711546 0.14083908 0.12665973 0.11702303 0.11040994 0.10363904\n", - " 0.09816132 0.09078707 0.08479712 0.08159847 0.07953048 0.07630911\n", - " 0.07363748 0.07179028]\n", - "[0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", - " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", - " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", - " 0.07443394 0.07303259]\n", - "key t_inner\n", - "10636.535622734587 K\n", - "10646.84849500629 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", - " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", - " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", - " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", - " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", - "[11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", - " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", - " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", - " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", - " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", - " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", - " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", - " 0.07443394 0.07303259]\n", - "[0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", - " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", - " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", - " 0.07443394 0.07303259]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10646.84849500629 K\n", - "10641.692058870438 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", + "\tIteration converged 9/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 17/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n" + "\tIteration converged 10/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n", + "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", + "\tIteration converged 11/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:162)\n" ] - }, + } + ], + "source": [ + "workflow.solve()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ { - "name": "stdout", + "name": "stderr", "output_type": "stream", "text": [ - "Converged this iteration!\n", - "Volume_INNER: 1.009774784993981e+45\n", - "Emitted Luminosity: 1.0557926285002875e+43 erg / s\n", - "WARNING: v_inner_boundary outside of simulation, setting to first shell\n", - "1100000000.0 cm / s\n", - "{'t_radiative': , 'dilution_factor': array([0.46583111, 0.35821399, 0.28478501, 0.23131748, 0.20190424,\n", - " 0.17672918, 0.15768939, 0.14187896, 0.1281619 , 0.11908551,\n", - " 0.11148042, 0.10454478, 0.09806677, 0.09312254, 0.08822151,\n", - " 0.08534236, 0.08173657, 0.07726564, 0.07559528, 0.07395579]), 't_inner': , 'v_inner_boundary': }\n", - "key t_radiative\n", - "[11069.1938237 11144.03320622 11213.3904621 11305.72853176\n", - " 11285.26618435 11323.7819744 11271.17366688 11265.74545008\n", - " 11172.68322807 11091.0444775 11030.94070128 10992.91031659\n", - " 10907.8451545 10860.3438851 10754.59836872 10675.60660881\n", - " 10611.90884864 10526.4022104 10470.93504789 10349.22810317] K\n", - "[11069.33089377 11165.15751924 11272.62783772 11372.4522524\n", - " 11332.02806881 11329.6435672 11294.51865104 11261.56893248\n", - " 11241.47812926 11148.97525325 11071.52917648 11004.68560208\n", - " 10946.39979159 10861.42744062 10784.4789371 10655.55794227\n", - " 10586.11909387 10567.9967492 10435.71120389 10305.7063164 ] K\n", - "key dilution_factor\n", - "[0.46397151 0.35561237 0.28682867 0.23621025 0.20608263 0.17691635\n", - " 0.15906282 0.1420295 0.13175074 0.12212206 0.11300866 0.10531621\n", - " 0.09917458 0.09274654 0.08897179 0.08478992 0.08135082 0.0781394\n", - " 0.07443394 0.07303259]\n", - "[0.46583111 0.35821399 0.28478501 0.23131748 0.20190424 0.17672918\n", - " 0.15768939 0.14187896 0.1281619 0.11908551 0.11148042 0.10454478\n", - " 0.09806677 0.09312254 0.08822151 0.08534236 0.08173657 0.07726564\n", - " 0.07559528 0.07395579]\n", - "key t_inner\n", - "10641.692058870438 K\n", - "10659.234452189152 K\n", - "key v_inner_boundary\n", - "1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "next v_inner 1100000000.0 cm / s\n", - "New Volume: [1.00977478e+45 1.09234847e+45 1.17816741e+45 1.26723160e+45\n", - " 1.35954104e+45 1.45509574e+45 1.55389569e+45 1.65594090e+45\n", - " 1.76123136e+45 1.86976708e+45 1.98154805e+45 2.09657427e+45\n", - " 2.21484575e+45 2.33636248e+45 2.46112446e+45 2.58913170e+45\n", - " 2.72038419e+45 2.85488194e+45 2.99262494e+45 3.13361319e+45] cm3\n", - "Check Convergence\n", - "t_radiative [11069.33089377 11165.15751924 11272.62783772 11372.4522524\n", - " 11332.02806881 11329.6435672 11294.51865104 11261.56893248\n", - " 11241.47812926 11148.97525325 11071.52917648 11004.68560208\n", - " 10946.39979159 10861.42744062 10784.4789371 10655.55794227\n", - " 10586.11909387 10567.9967492 10435.71120389 10305.7063164 ] K\n", - "[11069.33089377 11165.15751924 11272.62783772 11372.4522524\n", - " 11332.02806881 11329.6435672 11294.51865104 11261.56893248\n", - " 11241.47812926 11148.97525325 11071.52917648 11004.68560208\n", - " 10946.39979159 10861.42744062 10784.4789371 10655.55794227\n", - " 10586.11909387 10567.9967492 10435.71120389 10305.7063164 ] K\n", - "Status: True\n", - "Check Convergence\n", - "dilution_factor [0.46583111 0.35821399 0.28478501 0.23131748 0.20190424 0.17672918\n", - " 0.15768939 0.14187896 0.1281619 0.11908551 0.11148042 0.10454478\n", - " 0.09806677 0.09312254 0.08822151 0.08534236 0.08173657 0.07726564\n", - " 0.07559528 0.07395579]\n", - "[0.46583111 0.35821399 0.28478501 0.23131748 0.20190424 0.17672918\n", - " 0.15768939 0.14187896 0.1281619 0.11908551 0.11148042 0.10454478\n", - " 0.09806677 0.09312254 0.08822151 0.08534236 0.08173657 0.07726564\n", - " 0.07559528 0.07395579]\n", - "Status: True\n", - "Check Convergence\n", - "t_inner 10659.234452189152 K\n", - "10650.463255529794 K\n", - "Status: True\n", - "Check Convergence\n", - "v_inner_boundary 1100000000.0 cm / s\n", - "1100000000.0 cm / s\n", - "Status: True\n", - "[\u001b[1mtardis.workflows.v_inner_solver\u001b[0m][\u001b[1;37mINFO\u001b[0m ] \n", - "\tIteration converged 18/4 consecutive times. (\u001b[1mv_inner_solver.py\u001b[0m:251)\n", - "Converged this iteration!\n" + "ERROR:root:No traceback has been produced, nothing to debug.\n" ] } ], "source": [ - "workflow.solve()" + "%debug" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -1612,36 +206,54 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "spectrum = workflow.spectrum_solver.spectrum_real_packets\n", "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets\n", - "spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" + "#spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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q1Ytq3K2a/l27dqFe/fuoWfPnlavx2g04sUXX8T+/fvx8OFDt6/JUv369TFnzhyMHj0ae/bscToiGBERgQ4dOtj1z2g0mkdfpb7fGzduhMFgQN++fT3qq60OHTpAq9XKqkOJ300iIm/l+gDr4cOHqFWrFn766SevrjfdXGzYsAFnz57FpEmTMGPGDHz99dfmMlOnTsWQIUMwfPhwnDx5EiNGjEDfvn3x119/KfUyiMgLFy5cwPbt29GuXTuIoojExEQkJiaic+fOALIyC1p6/fXXsX//fuzatQvTp09HREQEunTp4jAYc+Xhw4e4e/eu1c2cM1qtFq1bt8Y333yD9evX49q1a2jWrBn+/vtvrF271ul1pnVh9erVg1artfr5448/rNLBA0ChQoXQoUMHpKWl4cUXX0SNGjWszl+9ehWNGzdGXFwcJk+ejB07dmD//v34+eefAcBu6l3BggXt+hQUFGR3PCgoCACQlpZmV7548eJWzzUaDQoVKmQ3lc32dScmJiIoKMjudd+8edPudTsSFhaGkJAQt303Hbfs+927dx2umzN91qa+37171+71Afav2fQ5du7c2e71fPfddxBFEffu3XP7miz98ccf6NmzJ3777Tc0aNAABQsWRI8ePXDz5k2rco4SsJj6Z3odUt9v03qsJ5980qO+2nK2JtETSvxuEhF5K9dnEWzTpg3atGnj9HxGRga++uorLFiwAImJiahevTq+++47854r5cqVQ7ly5czly5Qpg23btmHHjh3mY/Pnz8f777+PN954w3zNnj178N133+Gll17yzQsjIrdmzZoFURSxbNkyLFu2zO783LlzMXr0aKjVavOxIkWKmLMCNmjQAFWrVkXTpk0xYMAA/P3335LbXrNmDQwGg1f7NxUqVAiffvoptm3bhhMnTliNtFgqXLgwAGDZsmUoU6aM23o3btyIqVOnon79+li5ciWWL1+OV1991Xx+1apVePjwIVasWGFV35EjRzx+DVLdvHkTTzzxhPm5Xq/H3bt3UahQIafXFC5cGIUKFXKanCAiIkLxfloqVKgQ4uPj7Y6b1vGYPpdChQrZBTQA7I6Zyv/4449OM2E6y0TpTOHChTFp0iRMmjQJV69exerVq/F///d/SEhIsHrfHCVvMfXP9BlIfb+LFCkCALh+/brd6J4nTEkvLJmC4fT0dKvjUoJp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Z86ga9eu0Ov1aNmyJRo0aICXX34Z69evx+XLl7Fr1y589dVX5kAuOjoasbGxOHLkCO7cuYP09HTMmTMHM2fOxIkTJ3Dp0iXMnz8foaGhKFOmjMev398YYBERERERPdanTx/cv38fLVu2ROnSpb2qY+TIkbh8+TLKly+PIkWKAACqVq2KX375BT///DNq1aqFffv2YdCgQVbXzZo1C/fv30ft2rXx1ltv4ZNPPkHRokU9br9Hjx549OgR6tevj759++Ljjz/Ge++9ByBzJG3OnDlYunQpqlWrhrFjx2LcuHFW1xcqVAhbtmxBSkoKmjZtiqeffhozZsxwOJpVvHhxbNmyBcePH0e3bt1gNBrxzz//oEmTJnj77bdRqVIldOnSBZcvX0axYsUAAK+++ipefPFFNG/eHEWKFMGiRYuQP39+zJgxA40aNULNmjWxefNm/PXXXy73HQtUgmg7GTQXSEpKQlRUFB48eIDIyEh/d4dIMdH/t8bu2OWx7fzQEyIiIsfS0tIQGxuLsmXLIiQkxN/dyXOaNWuGmJgYTJo0yd9dyVaufu+yOzbgCBYREREREZFCGGAREREREREphFkEiYiIiIhyCUfp0Sl7cQSLiIiIiIhIIQywiIiIiEhxuTCPGgWwQPp9Y4BFlMMduZbo7y4QERGZqdVqAEBGRoafe0J5SWpqKgA43Rg5O3ENFlEO9/LP/zFVOxERBQyNRoOwsDDcvn0bWq0WKhW/zyffEUURqampSEhIQP78+c0Bvj8xwCIiIiIixQiCgBIlSiA2NhZXrlzxd3coj8ifPz+KFy/u724AYIBFRERERAoLCgpCxYoVOU2QsoVWqw2IkSsTBlhEREREpDiVSoWQkBB/d4Mo23FSLBERERERkUIYYBERERERESmEARYREREREZFCGGAREREREREphAEWERERERGRQhhgERERERERKYQBFhERERERkUICNsCKi4tD9+7dUahQIYSFhSEmJgYHDx70d7eIiIiIiIicCsiNhu/fv49GjRqhefPmWLt2LYoWLYqLFy8if/78/u4aERERERGRUwEZYH333XcoVaoUZs+ebT4WHR3tvw4RERERERFJEJBTBFevXo26devitddeQ9GiRVG7dm3MmDHDafn09HQkJSVZ/RAREREREWW3gAywLl26hKlTp6JixYpYv349PvjgA3zyySeY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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "%matplotlib inline\n", "plt.figure(figsize=(10, 6.5))\n", "\n", "spectrum.plot(label=\"Normal packets\")\n", "spectrum_virtual.plot(label=\"Virtual packets\")\n", - "spectrum_integrated.plot(label='Formal integral')\n", + "#spectrum_integrated.plot(label='Formal integral')\n", "\n", "plt.xlim(500, 9000)\n", "plt.title(\"TARDIS example model spectrum\")\n", - "plt.xlabel(\"Wavelength [$\\AA$]\")\n", - "plt.ylabel(\"Luminosity density [erg/s/$\\AA$]\")\n", + "plt.xlabel(r\"Wavelength [$\\AA$]\")\n", + "plt.ylabel(r\"Luminosity density [erg/s/$\\AA$]\")\n", "plt.legend()\n", "plt.show()" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "code", "execution_count": null, diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index 26e0b042300..707a29a4ac5 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -19,6 +19,8 @@ from tardis.transport.montecarlo.base import MonteCarloTransportSolver from tardis.util.base import is_notebook from tardis.workflows.workflow_logging import WorkflowLogging +from tardis.opacities.opacity_solver import OpacitySolver +from tardis.opacities.macro_atom.macroatom_solver import MacroAtomSolver # logging support logger = logging.getLogger(__name__) @@ -117,6 +119,15 @@ def __init__(self, configuration): self.convergence_strategy.t_inner ) + self.opacity_solver = OpacitySolver( + line_interaction_type=configuration.plasma.line_interaction_type, + disable_line_scattering=False, + ) + if configuration.plasma.line_interaction_type == "scatter": + self.macro_atom_solver = None + else: + self.macro_atom_solver = MacroAtomSolver() + def _get_atom_data(self, configuration): """Process atomic data from the configuration @@ -185,8 +196,12 @@ def get_convergence_estimates(self, transport_state): ) ) - estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + estimated_t_radiative = ( + estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + ) + estimated_dilution_factor = ( + estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + ) emitted_luminosity = calculate_filtered_luminosity( transport_state.emitted_packet_nu, @@ -286,6 +301,8 @@ def solve_simulation_state( "t_inner" ] + return next_values + def solve_plasma(self, estimated_radfield_properties): """Update the plasma solution with the new radiation field estimates @@ -363,8 +380,22 @@ def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): ndarray Array of unnormalized virtual packet energies in each frequency bin """ + + opacity_state = self.opacity_solver.solve(self.plasma_solver) + + if self.macro_atom_solver is None: + macro_atom_state = None + else: + macro_atom_state = self.macro_atom_solver.solve( + self.plasma_solver, + self.plasma_solver.atomic_data, + opacity_state.tau_sobolev, + self.plasma_solver.stimulated_emission_factor, + ) transport_state = self.transport_solver.initialize_transport_state( self.simulation_state, + opacity_state, + macro_atom_state, self.plasma_solver, no_of_real_packets, no_of_virtual_packets=no_of_virtual_packets, @@ -402,9 +433,9 @@ def initialize_spectrum_solver( self.spectrum_solver.transport_state = transport_state if virtual_packet_energies is not None: - self.spectrum_solver._montecarlo_virtual_luminosity.value[:] = ( - virtual_packet_energies - ) + self.spectrum_solver._montecarlo_virtual_luminosity.value[ + : + ] = virtual_packet_energies if self.integrated_spectrum_settings is not None: # Set up spectrum solver integrator diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 37d423b6fbe..741ab17c118 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -9,9 +9,6 @@ from tardis.workflows.simple_simulation import SimpleSimulation from tardis.workflows.util import get_tau_integ from tardis.plasma.radiation_field import DilutePlanckianRadiationField -from tardis.opacities.opacity_solver import OpacitySolver -from tardis.opacities.macro_atom.macroatom_solver import MacroAtomSolver -from tardis.opacities.macro_atom.macroatom_state import MacroAtomState from scipy.interpolate import interp1d import copy from tardis.spectrum.luminosity import ( @@ -33,12 +30,7 @@ class InnerVelocitySimulationSolver(SimpleSimulation): TAU_TARGET = np.log(2.0 / 3) - def __init__( - self, - configuration, - mean_optical_depth="rossland", - tau=None - ): + def __init__(self, configuration, mean_optical_depth="rossland", tau=None): """ Args: convergence_strategy (_type_): _description_ @@ -51,15 +43,10 @@ def __init__( self.convergence_solvers["v_inner_boundary"] = ConvergenceSolver( self.convergence_strategy.v_inner_boundary - ) + ) # WARNING: ORDERING MATTERS self.property_mask_ = self.property_mask - self.opacity_solver = OpacitySolver(line_interaction_type=configuration.plasma.line_interaction_type, disable_line_scattering=False) - if configuration.plasma.line_interaction_type == 'scatter': - self.macro_atom_solver = None - else: - self.macro_atom_solver = MacroAtomSolver() if tau is not None: self.TAU_TARGET = np.log(tau) @@ -84,9 +71,20 @@ def estimate_v_inner(self): fill_value="extrapolate", ) # TODO: Make sure eastimed_v_inner is within the bounds of the simulation! - estimated_v_inner = interpolator(self.TAU_TARGET) + estimated_v_inner = interpolator(self.TAU_TARGET) * u.cm / u.s + + if estimated_v_inner < self.simulation_state.geometry.v_inner[0]: + estimated_v_inner = self.simulation_state.geometry.v_inner[0] + logger.warning( + "WARNING: v_inner_boundary outside of simulation, setting to first shell" + ) + elif estimated_v_inner > self.simulation_state.geometry.v_inner[-1]: + estimated_v_inner = self.simulation_state.geometry.v_inner[-1] + logger.wraning( + "WARNING: v_inner_boundary outside of simulation, setting to last shell" + ) - return estimated_v_inner * u.cm / u.s + return estimated_v_inner @property def property_mask(self): @@ -98,80 +96,23 @@ def property_mask(self): ] = True return mask - @property - def property_where(self): - - return np.where(self.property_mask) - def get_convergence_estimates(self, transport_state): - # print(self.transport_solver.transport_state) - # ( - # estimated_t_radiative, - # estimated_dilution_factor, - # ) = self.transport_solver.radfield_prop_solver.calculate_radiationfield_properties() - - estimated_radfield_properties = ( - self.transport_solver.radfield_prop_solver.solve( - transport_state.radfield_mc_estimators, - transport_state.time_explosion, - transport_state.time_of_simulation, - transport_state.geometry_state.volume, - transport_state.opacity_state.line_list_nu, - ) - ) - print("Volume_INNER:", transport_state.geometry_state.volume[0]) - - estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor - - self.initialize_spectrum_solver( - transport_state, - None, - ) - - emitted_luminosity = calculate_filtered_luminosity( - transport_state.emitted_packet_nu, - transport_state.emitted_packet_luminosity, - self.luminosity_nu_start, - self.luminosity_nu_end, - ) - - print("Emitted Luminosity:", emitted_luminosity) - luminosity_ratios = ( - (emitted_luminosity / self.luminosity_requested).to(1).value - ) - - estimated_t_inner = ( - self.simulation_state.t_inner - * luminosity_ratios - ** self.convergence_strategy.t_inner_update_exponent - ) + estimates = super().get_convergence_estimates(transport_state) estimated_v_inner = self.estimate_v_inner() - if estimated_v_inner < self.simulation_state.geometry.v_inner[0]: - estimated_v_inner = self.simulation_state.geometry.v_inner[0] - print("WARNING: v_inner_boundary outside of simulation, setting to first shell") - elif estimated_v_inner > self.simulation_state.geometry.v_inner[-1]: - estimated_v_inner = self.simulation_state.geometry.v_inner[-1] - print("WARNING: v_inner_boundary outside of simulation, setting to last shell") + estimates[0].update( + {"v_inner_boundary": estimated_v_inner, "mask": self.property_mask} + ) - #estimated_v_inner = self.simulation_state.v_inner_boundary - print(estimated_v_inner) + return estimates - return { - "t_radiative": estimated_t_radiative, - "dilution_factor": estimated_dilution_factor, - "t_inner": estimated_t_inner, - "v_inner_boundary": estimated_v_inner, - } - - def reproject(self, a1, a2, m1, m2): + def reproject(self, a1, m1, a2, m2): - a1_expanded = np.empty( - len(self.simulation_state.geometry.r_inner), - dtype=a1.dtype, + a1_expanded = np.empty_like( + a1, + shape=(self.simulation_state.geometry.no_of_shells,), ) a2_expanded = np.empty_like(a1_expanded) @@ -182,68 +123,37 @@ def reproject(self, a1, a2, m1, m2): return a1_expanded[joint_mask], a2_expanded[joint_mask] - def check_convergence( self, estimated_values, ): convergence_statuses = [] + mask = estimated_values["mask"] + + if not np.all(mask == self.property_mask): + convergence_statuses.append(False) + # Need to set status to False if change in mask size + logger.info(f"Resized Geometry, Convergence Suppressed") + for key, solver in self.convergence_solvers.items(): current_value = getattr(self.simulation_state, key) estimated_value = estimated_values[key] - print("Check Convergence") - print(key, estimated_value) - print(current_value) - joint_mask = np.ones(5) - if hasattr(current_value, "__len__") and ( - key not in ["t_inner", "v_inner_boundary"] - ): - if current_value.shape == estimated_value.shape: - pass - else: - print(key, "has", "__len__") - print("shape current:", current_value.shape) - print("shape next:", estimated_value.shape) - new_value = estimated_value - current_value_expanded = np.empty( - len(self.simulation_state.geometry.r_inner), - dtype=current_value.dtype, - ) - current_value_expanded[self.property_mask] = current_value - new_value_expanded = np.empty_like(current_value_expanded) - new_value_expanded[self.new_property_mask] = new_value - joint_mask = self.property_mask & self.new_property_mask - print(joint_mask) - print("diff:", current_value_expanded - new_value_expanded) - - if hasattr(current_value, "unit"): - current_value_expanded = ( - current_value_expanded * current_value.unit - ) - new_value_expanded = ( - new_value_expanded * current_value.unit - ) - estimated_value = new_value_expanded[joint_mask] - current_value = current_value_expanded[joint_mask] - - # no_of_shells = ( - # self.simulation_state.no_of_shells if key not in ["t_inner", "v_inner_boundary"] else 1 - # ) - no_of_shells = ( - joint_mask.sum() - if key not in ["t_inner", "v_inner_boundary"] - else 1 - ) + if key in ["t_radiative", "dilution_factor"]: + current_value, estimated_value = self.reproject( + current_value, self.property_mask, estimated_value, mask + ) + no_of_shells = current_value.shape[0] + else: + no_of_shells = 1 convergence_statuses.append( solver.get_convergence_status( current_value, estimated_value, no_of_shells ) ) - print("Status:", convergence_statuses[-1]) if np.all(convergence_statuses): hold_iterations = self.convergence_strategy.hold_iterations @@ -252,192 +162,115 @@ def check_convergence( f"Iteration converged {self.consecutive_converges_count:d}/{(hold_iterations + 1):d} consecutive " f"times." ) - print("Converged this iteration!") + return self.consecutive_converges_count == hold_iterations + 1 self.consecutive_converges_count = 0 return False - def clip(self, property): - """Clips a shell-dependent array to the current index""" - - return property[ - self.simulation_state.geometry.v_inner_boundary_index : self.simulation_state.geometry.v_outer_boundary_index - ] - - def solve_simulation_state( - self, - estimated_values, - ): - - next_values = {} - print(estimated_values) - self.new_property_mask = self.property_mask - self.old_property_mask = self.property_mask_ + def solve_simulation_state(self, estimated_values): - for key, solver in self.convergence_solvers.items(): - if ( - key in ["t_inner", "v_inner_boundary"] - and (self.completed_iterations + 1) - % self.convergence_strategy.lock_t_inner_cycles - != 0 - ): - next_values[key] = getattr(self.simulation_state, key) - else: - - print("key", key) - print(getattr(self.simulation_state, key)) - print(estimated_values[key]) - current_value = getattr(self.simulation_state, key) - new_value = estimated_values[key] - if hasattr(current_value, "__len__") and key not in [ - "t_inner", - "v_inner_boundary", - ]: - if current_value.shape == new_value.shape: - pass - else: - breakpoint() - print(key, "has", "__len__") - print("shape current:", current_value.shape) - print("shape next:", new_value.shape) - current_value_expanded = np.empty( - len(self.simulation_state.geometry.r_inner), - dtype=current_value.dtype, - ) - current_value_expanded[ - self.property_mask - ] = current_value - new_value_expanded = np.empty_like( - current_value_expanded - ) - new_value_expanded[self.new_property_mask] = new_value - joint_mask = self.property_mask & self.new_property_mask - print(joint_mask) - if hasattr(current_value, "unit"): - current_value_expanded = ( - current_value_expanded * current_value.unit - ) - new_value_expanded = ( - new_value_expanded * current_value.unit - ) - new_value = new_value_expanded[joint_mask] - current_value = current_value_expanded[joint_mask] - next_values[key] = solver.converge( - current_value, new_value - ) # TODO: This needs to be changed to account for changing array sizes - - self.simulation_state.t_radiative = next_values["t_radiative"] - self.simulation_state.dilution_factor = next_values["dilution_factor"] - self.simulation_state.blackbody_packet_source.temperature = next_values[ - "t_inner" - ] - self.simulation_state.t_inner = next_values["t_inner"] - - print("next v_inner", next_values["v_inner_boundary"]) + next_values = super().solve_simulation_state(estimated_values) self.simulation_state.geometry.v_inner_boundary = next_values[ "v_inner_boundary" ] - self.simulation_state.blackbody_packet_source.radius = self.simulation_state.r_inner[0] - self.property_mask_ = self.new_property_mask - - print("New Volume:", self.simulation_state.geometry.volume_active) - + self.simulation_state.blackbody_packet_source.radius = ( + self.simulation_state.r_inner[0] + ) - def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): + return next_values - opacity_state = self.opacity_solver.solve(self.plasma_solver) - #macro_atom_state = None - if self.macro_atom_solver is None: - macro_atom_state = None - else: - macro_atom_state = self.macro_atom_solver.solve( - self.plasma_solver, - self.plasma_solver.atomic_data, - opacity_state.tau_sobolev, - self.plasma_solver.stimulated_emission_factor, - ) - transport_state = self.transport_solver.initialize_transport_state( - self.simulation_state, - opacity_state, - macro_atom_state, - self.plasma_solver, - no_of_real_packets, - no_of_virtual_packets=no_of_virtual_packets, - iteration=self.completed_iterations, - ) + def solve_radiation_field(self): - virtual_packet_energies = self.transport_solver.run( - transport_state, - iteration=self.completed_iterations, - total_iterations=self.total_iterations, - show_progress_bars=False, + radiation_field = DilutePlanckianRadiationField( + temperature=self.simulation_state.radiation_field_state.temperature, + dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, ) - output_energy = transport_state.packet_collection.output_energies - if np.sum(output_energy < 0) == len(output_energy): - logger.critical("No r-packet escaped through the outer boundary.") - - return transport_state, virtual_packet_energies + return radiation_field def solve_plasma( self, - transport_state, + estimated_radfield_properties, + radiation_field, ): - # TODO: Find properties that need updating with shells - # self.simulation_state.radiation_field_state.t_radiative[self.simulation_state.radiation_field_state.t_radiative.value==0] = 10000.0 * u.K - # self.simulation_state.radiation_field_state.dilution_factor[self.simulation_state.radiation_field_state.dilution_factor==0] = 1.0 - - radiation_field = DilutePlanckianRadiationField( - temperature=self.simulation_state.radiation_field_state.temperature, - dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, - ) update_properties = dict( - dilute_planckian_radiation_field=radiation_field, + dilute_planckian_radiation_field=radiation_field ) # A check to see if the plasma is set with JBluesDetailed, in which # case it needs some extra kwargs. - j_blues = radiation_field.calculate_mean_intensity( + if ( + self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE + == "blackbody" + ): + planckian_radiation_field = ( + radiation_field.to_planckian_radiation_field() + ) + j_blues = planckian_radiation_field.calculate_mean_intensity( self.plasma_solver.atomic_data.lines.nu.values ) - update_properties["j_blues"] = pd.DataFrame( - j_blues, index=self.plasma_solver.atomic_data.lines.index - ) - if "j_blue_estimator" in self.plasma_solver.outputs_dict: - update_properties.update( - t_inner=self.simulation_state.blackbody_packet_source.temperature, - j_blue_estimator=transport_state.radfield_mc_estimators.j_blue_estimator, + update_properties["j_blues"] = pd.DataFrame( + j_blues, index=self.plasma_solver.atomic_data.lines.index + ) + elif ( + self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE + == "dilute-blackbody" + ): + j_blues = radiation_field.calculate_mean_intensity( + self.plasma_solver.atomic_data.lines.nu.values + ) + update_properties["j_blues"] = pd.DataFrame( + j_blues, index=self.plasma_solver.atomic_data.lines.index + ) + elif ( + self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE + == "detailed" + ): + update_properties["j_blues"] = pd.DataFrame( + estimated_radfield_properties.j_blues, + index=self.plasma_solver.atomic_data.lines.index, + ) + else: + raise ValueError( + f"radiative_rates_type type unknown - {self.plasma.plasma_solver_settings.RADIATIVE_RATES_TYPE}" ) self.plasma_solver.update(**update_properties) - def solve(self): + def run(self): converged = False while self.completed_iterations < self.total_iterations - 1: - - transport_state, virtual_packet_energies = self.solve_montecarlo( self.real_packet_count ) - estimated_values = self.get_convergence_estimates(transport_state) + ( + estimated_values, + estimated_radfield_properties, + ) = self.get_convergence_estimates(transport_state) self.solve_simulation_state(estimated_values) - self.solve_plasma(transport_state) + radiation_field = self.solve_radiation_field() - converged = self.check_convergence(estimated_values) + self.solve_plasma(estimated_radfield_properties, radiation_field) - #self.simulation_state.packet_source.radius = self.simulation_state.geometry.r_inner_active[0] + converged = self.check_convergence(estimated_values) self.completed_iterations += 1 - if converged: - print("SIMULATION CONVERGED!") + if converged and self.convergence_strategy.stop_if_converged: break + if converged: + logger.info("\n\tStarting final iteration") + else: + logger.error( + "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" + ) + transport_state, virtual_packet_energies = self.solve_montecarlo( self.final_iteration_packet_count, self.virtual_packet_count ) From 3d022a23b60ae58e0bf0a5fec2f89538f53a0540 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 12:40:32 -0400 Subject: [PATCH 32/61] cleared notebook outputs --- docs/workflows/v_inner_solver_workflow.ipynb | 176 ++----------------- 1 file changed, 13 insertions(+), 163 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 91a186b61e2..6dae343f33d 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -2,38 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Iterations: 0/? [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "plt.figure(figsize=(10, 6.5))\n", From af0430af19bc4bdc468d31f8245e28771f7df6fe Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 12:41:00 -0400 Subject: [PATCH 33/61] Updated notebook to use correctmethod --- docs/workflows/v_inner_solver_workflow.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 6dae343f33d..e7b92d66016 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -44,7 +44,7 @@ "metadata": {}, "outputs": [], "source": [ - "workflow.solve()" + "workflow.run()" ] }, { From fb9a49b31d58079c4100e3c829496f69c734fbe7 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 12:47:46 -0400 Subject: [PATCH 34/61] Updated the docstrings --- tardis/workflows/simple_simulation.py | 5 ++ tardis/workflows/v_inner_solver.py | 83 ++++++++++++++++++++++++--- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index 707a29a4ac5..cc717fa7743 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -279,6 +279,11 @@ def solve_simulation_state( ---------- estimated_values : dict Estimated from the previous iterations + + Returns + ------- + next_values : dict + The next values assigned to the simulation state """ next_values = {} diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 741ab17c118..77309519ac5 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -31,13 +31,7 @@ class InnerVelocitySimulationSolver(SimpleSimulation): TAU_TARGET = np.log(2.0 / 3) def __init__(self, configuration, mean_optical_depth="rossland", tau=None): - """ - Args: - convergence_strategy (_type_): _description_ - atom_data_path (_type_): _description_ - mean_optical_depth (str): 'rossland' or 'planck' - Method of estimating the mean optical depth - """ + super().__init__(configuration) self.mean_optical_depth = mean_optical_depth @@ -97,6 +91,20 @@ def property_mask(self): return mask def get_convergence_estimates(self, transport_state): + """Compute convergence estimates from the transport state + + Parameters + ---------- + transport_state : MonteCarloTransportState + Transport state object to compute estimates + + Returns + ------- + dict + Convergence estimates + EstimatedRadiationFieldProperties + Dilute radiation file and j_blues dataclass + """ estimates = super().get_convergence_estimates(transport_state) @@ -109,6 +117,26 @@ def get_convergence_estimates(self, transport_state): return estimates def reproject(self, a1, m1, a2, m2): + """Reprojects two sub_arrays defined by a set of masks onto an array where the masks of both objects are true + + Parameters + ---------- + a1 : np.ndarray + A sub array of an array with the shape of a geometry property + m1 : np.ndarray(bool) + Mask such that the parrent array accessed at this mask gives a1 + a2 : np.ndarray + A sub array of an array with the shape of a geometry property + m2 : np.ndarray(bool) + Mask such that the parrent array accessed at this mask gives a2 + + Returns + ------- + a1_joint + reprojection of a1 onto m1 & m2 + a2_joint + reprojection of a2 onto m1 & m2 + """ a1_expanded = np.empty_like( a1, @@ -127,6 +155,18 @@ def check_convergence( self, estimated_values, ): + """Check convergence status for a dict of estimated values + + Parameters + ---------- + estimated_values : dict + Estimates to check convergence + + Returns + ------- + bool + If convergence has occurred + """ convergence_statuses = [] mask = estimated_values["mask"] @@ -169,7 +209,19 @@ def check_convergence( return False def solve_simulation_state(self, estimated_values): - + """Update the simulation state with new inputs computed from previous + iteration estimates. + + Parameters + ---------- + estimated_values : dict + Estimated from the previous iterations + + Returns + ------- + next_values : dict + The next values assigned to the simulation state + """ next_values = super().solve_simulation_state(estimated_values) self.simulation_state.geometry.v_inner_boundary = next_values[ "v_inner_boundary" @@ -194,6 +246,20 @@ def solve_plasma( estimated_radfield_properties, radiation_field, ): + """Update the plasma solution with the new radiation field estimates + + Parameters + ---------- + estimated_radfield_properties : EstimatedRadiationFieldProperties + The radiation field properties to use for updating the plasma + radiation_field: tardis.plasma.radiation_field.RadiationField + Current radiation field object from the last iteration + + Raises + ------ + ValueError + If the plasma solver radiative rates type is unknown + """ update_properties = dict( dilute_planckian_radiation_field=radiation_field @@ -239,6 +305,7 @@ def solve_plasma( self.plasma_solver.update(**update_properties) def run(self): + """Run the TARDIS simulation until convergence is reached""" converged = False while self.completed_iterations < self.total_iterations - 1: From 5aded66e56e93a91eafcd41b2e4f78c15bae4be7 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 12:48:07 -0400 Subject: [PATCH 35/61] removed unused imports --- tardis/workflows/v_inner_solver.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 77309519ac5..bca018073d4 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -3,17 +3,11 @@ import numpy as np from astropy import units as u -from tardis.io.atom_data.base import AtomData from tardis.simulation.convergence import ConvergenceSolver -from tardis.spectrum.formal_integral import FormalIntegrator from tardis.workflows.simple_simulation import SimpleSimulation from tardis.workflows.util import get_tau_integ from tardis.plasma.radiation_field import DilutePlanckianRadiationField from scipy.interpolate import interp1d -import copy -from tardis.spectrum.luminosity import ( - calculate_filtered_luminosity, -) import pandas as pd # logging support From 4ce4ab9af851d1c207d55d7bfc20193b42b89fa0 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 12:52:57 -0400 Subject: [PATCH 36/61] Updated notebook to stop if converged --- docs/workflows/v_inner_solver_workflow.ipynb | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index e7b92d66016..7da75c25e07 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -33,6 +33,8 @@ " 'type' : 'damped'\n", " }\n", "\n", + "config.montecarlo.convergence_strategy.stop_if_converged = True\n", + "\n", "config.model.structure.velocity.start = 7000 * u.km/u.s\n", "\n", "workflow = InnerVelocitySimulationSolver(config)" @@ -47,15 +49,6 @@ "workflow.run()" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "%debug" - ] - }, { "cell_type": "code", "execution_count": null, @@ -72,8 +65,7 @@ "outputs": [], "source": [ "spectrum = workflow.spectrum_solver.spectrum_real_packets\n", - "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets\n", - "#spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" + "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets" ] }, { @@ -87,7 +79,6 @@ "\n", "spectrum.plot(label=\"Normal packets\")\n", "spectrum_virtual.plot(label=\"Virtual packets\")\n", - "#spectrum_integrated.plot(label='Formal integral')\n", "\n", "plt.xlim(500, 9000)\n", "plt.title(\"TARDIS example model spectrum\")\n", From 8ae61583f216761daa20d1af4465e7ca6d822f8f Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:06:44 -0400 Subject: [PATCH 37/61] Updated v_inner_solver to deal with detailed radiative rates types --- docs/workflows/v_inner_solver_workflow.ipynb | 16 ++-------------- tardis/workflows/v_inner_solver.py | 13 +++++++++++-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 7da75c25e07..5227d2aa880 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -37,6 +37,8 @@ "\n", "config.model.structure.velocity.start = 7000 * u.km/u.s\n", "\n", + "config.plasma.radiative_rates_type = 'detailed'\n", + "\n", "workflow = InnerVelocitySimulationSolver(config)" ] }, @@ -87,20 +89,6 @@ "plt.legend()\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index bca018073d4..e0b0a944bb9 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -238,6 +238,7 @@ def solve_radiation_field(self): def solve_plasma( self, estimated_radfield_properties, + mask, radiation_field, ): """Update the plasma solution with the new radiation field estimates @@ -287,8 +288,12 @@ def solve_plasma( self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE == "detailed" ): + j_blues = radiation_field.calculate_mean_intensity( + self.plasma_solver.atomic_data.lines.nu.values + ) + j_blues[:, mask] = estimated_radfield_properties.j_blues update_properties["j_blues"] = pd.DataFrame( - estimated_radfield_properties.j_blues, + j_blues, index=self.plasma_solver.atomic_data.lines.index, ) else: @@ -316,7 +321,11 @@ def run(self): radiation_field = self.solve_radiation_field() - self.solve_plasma(estimated_radfield_properties, radiation_field) + self.solve_plasma( + estimated_radfield_properties, + estimated_values["mask"], + radiation_field, + ) converged = self.check_convergence(estimated_values) From ba5696c4c57f5b6c72bd619ad7027370e63efc62 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:08:38 -0400 Subject: [PATCH 38/61] removed old comment --- tardis/workflows/v_inner_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index e0b0a944bb9..52284670e4b 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -58,7 +58,7 @@ def estimate_v_inner(self): self.simulation_state.geometry.v_inner, # Only use the active values as we only need a numerical estimate, not an index fill_value="extrapolate", ) - # TODO: Make sure eastimed_v_inner is within the bounds of the simulation! + estimated_v_inner = interpolator(self.TAU_TARGET) * u.cm / u.s if estimated_v_inner < self.simulation_state.geometry.v_inner[0]: From b1570dbfb1515632d4043d5090e420c37001b7c3 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:11:50 -0400 Subject: [PATCH 39/61] Added docstrings, removed old comments --- tardis/workflows/util.py | 76 ++++++++++++++++++++++++++++------------ 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/tardis/workflows/util.py b/tardis/workflows/util.py index 3f1707c68f7..6e2defb7b35 100644 --- a/tardis/workflows/util.py +++ b/tardis/workflows/util.py @@ -1,9 +1,27 @@ - - from astropy import units as u, constants as const import numpy as np + def get_tau_integ(plasma, simulation_state, bin_size=10): + """Estimate the integrated mean optical depth at each velocity bin + + Parameters + ---------- + plasma : tardis.plasma.BasePlasma + The tardis legacy plasma + simulation_state : tardis.model.base.SimulationState + the current simulation state + bin_size : int, optional. Default : 10 + bin size for the aggregation of line opacities + + Returns + ------- + dict + rossland : np.ndarray + Roassland Mean Optical Depth + planck : np.ndarray + Planck Mean Optical Depth + """ index = plasma.atomic_data.lines.nu.index taus = plasma.tau_sobolevs.loc[index] @@ -12,9 +30,9 @@ def get_tau_integ(plasma, simulation_state, bin_size=10): freqs = freqs[order] taus = plasma.tau_sobolevs.values[order] - extra = bin_size-len(freqs)%bin_size - extra_freqs = np.arange(extra+1)+1 - extra_taus = np.zeros((extra+1, taus.shape[1])) + extra = bin_size - len(freqs) % bin_size + extra_freqs = np.arange(extra + 1) + 1 + extra_taus = np.zeros((extra + 1, taus.shape[1])) freqs = np.hstack((extra_freqs, freqs)) taus = np.vstack((extra_taus, taus)) @@ -23,8 +41,8 @@ def get_tau_integ(plasma, simulation_state, bin_size=10): delta_nu = bins_high - bins_low n_bins = len(delta_nu) - taus = taus[1:n_bins*bin_size+1] - freqs = freqs[1:n_bins*bin_size+1] + taus = taus[1 : n_bins * bin_size + 1] + freqs = freqs[1 : n_bins * bin_size + 1] ct = simulation_state.time_explosion.cgs.value * const.c.cgs.value t_rad = simulation_state.radiation_field_state.temperature.cgs.value @@ -34,23 +52,37 @@ def get_tau_integ(plasma, simulation_state, bin_size=10): kb = const.k_B.cgs.value def B(nu, T): - return 2*h*nu**3/c**2/(np.exp(h*nu/(kb*T))-1) - + return 2 * h * nu**3 / c**2 / (np.exp(h * nu / (kb * T)) - 1) + def U(nu, T): - return B(nu, T)**2 * (c/nu)**2 * (2*kb*T**2)**-1 - - kappa_exp = (bins_low/delta_nu).reshape(-1, 1)/ct*(1-np.exp(-taus.reshape(n_bins, bin_size, -1))).sum(axis=1) - kappa_thom = (plasma.electron_densities.values*const.sigma_T.cgs.value) - Bdnu = B(bins_low.reshape(-1, 1), t_rad.reshape(1, -1))*delta_nu.reshape(-1, 1) - kappa_planck = (kappa_thom + (Bdnu*kappa_exp).sum(axis=0)/(Bdnu.sum(axis=0))) - - udnu = U(bins_low.reshape(-1, 1), t_rad.reshape(1, -1))*delta_nu.reshape(-1, 1) + return B(nu, T) ** 2 * (c / nu) ** 2 * (2 * kb * T**2) ** -1 + + kappa_exp = ( + (bins_low / delta_nu).reshape(-1, 1) + / ct + * (1 - np.exp(-taus.reshape(n_bins, bin_size, -1))).sum(axis=1) + ) + kappa_thom = plasma.electron_densities.values * const.sigma_T.cgs.value + Bdnu = B(bins_low.reshape(-1, 1), t_rad.reshape(1, -1)) * delta_nu.reshape( + -1, 1 + ) + kappa_planck = kappa_thom + (Bdnu * kappa_exp).sum(axis=0) / ( + Bdnu.sum(axis=0) + ) + + udnu = U(bins_low.reshape(-1, 1), t_rad.reshape(1, -1)) * delta_nu.reshape( + -1, 1 + ) kappa_tot = kappa_thom + kappa_exp - kappa_rossland = ((udnu*kappa_tot**-1).sum(axis=0)/(udnu.sum(axis=0)))**-1 + kappa_rossland = ( + (udnu * kappa_tot**-1).sum(axis=0) / (udnu.sum(axis=0)) + ) ** -1 - dr = (simulation_state.geometry.r_outer-simulation_state.geometry.r_inner).cgs.value - dtau = kappa_planck*dr + dr = ( + simulation_state.geometry.r_outer - simulation_state.geometry.r_inner + ).cgs.value + dtau = kappa_planck * dr planck_integ_tau = np.cumsum(dtau[::-1])[::-1] - rossland_integ_tau = np.cumsum((kappa_rossland*dr)[::-1])[::-1] + rossland_integ_tau = np.cumsum((kappa_rossland * dr)[::-1])[::-1] - return {'rossland':rossland_integ_tau, 'planck':planck_integ_tau} \ No newline at end of file + return {"rossland": rossland_integ_tau, "planck": planck_integ_tau} From 398f39f73f7031fcf009d4a6933146c75f73dc6e Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:19:56 -0400 Subject: [PATCH 40/61] Fixed typo --- tardis/workflows/v_inner_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 52284670e4b..165ef064829 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -68,7 +68,7 @@ def estimate_v_inner(self): ) elif estimated_v_inner > self.simulation_state.geometry.v_inner[-1]: estimated_v_inner = self.simulation_state.geometry.v_inner[-1] - logger.wraning( + logger.warning( "WARNING: v_inner_boundary outside of simulation, setting to last shell" ) From 75c9e9b24969fda78fbfd62b7ccf6d589a2f6adf Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:21:43 -0400 Subject: [PATCH 41/61] Updated notebook to be more explicit --- docs/workflows/v_inner_solver_workflow.ipynb | 9 ++++++++- tardis/workflows/v_inner_solver.py | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 5227d2aa880..a93812c195f 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -39,7 +39,7 @@ "\n", "config.plasma.radiative_rates_type = 'detailed'\n", "\n", - "workflow = InnerVelocitySimulationSolver(config)" + "workflow = InnerVelocitySimulationSolver(config, tau=2.0/3, mean_optical_depth=\"rossland\")" ] }, { @@ -89,6 +89,13 @@ "plt.legend()\n", "plt.show()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 165ef064829..023ec7f1819 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -27,7 +27,7 @@ class InnerVelocitySimulationSolver(SimpleSimulation): def __init__(self, configuration, mean_optical_depth="rossland", tau=None): super().__init__(configuration) - self.mean_optical_depth = mean_optical_depth + self.mean_optical_depth = mean_optical_depth.lower() self.convergence_solvers["v_inner_boundary"] = ConvergenceSolver( self.convergence_strategy.v_inner_boundary From 5cf5b4592dae80c5c3bbb322ae0867ac2d9c9e4c Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:22:14 -0400 Subject: [PATCH 42/61] removed old comment --- tardis/workflows/v_inner_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 023ec7f1819..6019f91deab 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -31,7 +31,7 @@ def __init__(self, configuration, mean_optical_depth="rossland", tau=None): self.convergence_solvers["v_inner_boundary"] = ConvergenceSolver( self.convergence_strategy.v_inner_boundary - ) # WARNING: ORDERING MATTERS + ) self.property_mask_ = self.property_mask From 004d32dbabf1e8f71e821d316114838e303bc676 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:23:05 -0400 Subject: [PATCH 43/61] removed unused variable --- tardis/workflows/v_inner_solver.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 6019f91deab..24b73db209f 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -33,8 +33,6 @@ def __init__(self, configuration, mean_optical_depth="rossland", tau=None): self.convergence_strategy.v_inner_boundary ) - self.property_mask_ = self.property_mask - if tau is not None: self.TAU_TARGET = np.log(tau) From 31a96d5e17aa8716666e66b13e6e2676950000ca Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:24:25 -0400 Subject: [PATCH 44/61] Changed the radiation_field to use the radiation field state properties with no explicit sovler method --- tardis/workflows/simple_simulation.py | 4 ++-- tardis/workflows/v_inner_solver.py | 13 ------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index cc717fa7743..9a0fc6da866 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -322,8 +322,8 @@ def solve_plasma(self, estimated_radfield_properties): If the plasma solver radiative rates type is unknown """ radiation_field = DilutePlanckianRadiationField( - temperature=self.simulation_state.t_radiative, - dilution_factor=self.simulation_state.dilution_factor, + temperature=self.simulation_state.radiation_field_state.temperature, + dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, ) update_properties = dict( dilute_planckian_radiation_field=radiation_field diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 24b73db209f..096531705d0 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -224,20 +224,10 @@ def solve_simulation_state(self, estimated_values): return next_values - def solve_radiation_field(self): - - radiation_field = DilutePlanckianRadiationField( - temperature=self.simulation_state.radiation_field_state.temperature, - dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, - ) - - return radiation_field - def solve_plasma( self, estimated_radfield_properties, mask, - radiation_field, ): """Update the plasma solution with the new radiation field estimates @@ -317,12 +307,9 @@ def run(self): self.solve_simulation_state(estimated_values) - radiation_field = self.solve_radiation_field() - self.solve_plasma( estimated_radfield_properties, estimated_values["mask"], - radiation_field, ) converged = self.check_convergence(estimated_values) From ca347431cbf8acf9a5d640bedd1e90059d5f482a Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:24:59 -0400 Subject: [PATCH 45/61] Added back radaition field to plasma solver in v_inner solver --- docs/workflows/v_inner_solver_workflow.ipynb | 152 +++++++++++++++++-- tardis/workflows/v_inner_solver.py | 5 +- 2 files changed, 145 insertions(+), 12 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index a93812c195f..a1251eb4bbb 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -2,9 +2,38 @@ "cells": [ { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Iterations: 0/? [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "%matplotlib inline\n", "plt.figure(figsize=(10, 6.5))\n", diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 096531705d0..e524e0b1d51 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -243,7 +243,10 @@ def solve_plasma( ValueError If the plasma solver radiative rates type is unknown """ - + radiation_field = DilutePlanckianRadiationField( + temperature=self.simulation_state.radiation_field_state.temperature, + dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, + ) update_properties = dict( dilute_planckian_radiation_field=radiation_field ) From d3363791dd901ea1706730b7127a66df7e3e84c9 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:34:35 -0400 Subject: [PATCH 46/61] Added a solve opacity method --- tardis/workflows/simple_simulation.py | 40 +++++++++++++++++++-------- tardis/workflows/v_inner_solver.py | 4 ++- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index 9a0fc6da866..ca1e1296746 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -368,7 +368,28 @@ def solve_plasma(self, estimated_radfield_properties): self.plasma_solver.update(**update_properties) - def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): + def solve_opacity(self): + + opacity_state = self.opacity_solver.solve(self.plasma_solver) + + if self.macro_atom_solver is None: + macro_atom_state = None + else: + macro_atom_state = self.macro_atom_solver.solve( + self.plasma_solver, + self.plasma_solver.atomic_data, + opacity_state.tau_sobolev, + self.plasma_solver.stimulated_emission_factor, + ) + + return { + "opacity_state": opacity_state, + "macro_atom_state": macro_atom_state, + } + + def solve_montecarlo( + self, opacity, no_of_real_packets, no_of_virtual_packets=0 + ): """Solve the MonteCarlo process Parameters @@ -386,17 +407,9 @@ def solve_montecarlo(self, no_of_real_packets, no_of_virtual_packets=0): Array of unnormalized virtual packet energies in each frequency bin """ - opacity_state = self.opacity_solver.solve(self.plasma_solver) + opacity_state = opacity["opacity_state"] + macro_atom_state = opacity["macro_atom_state"] - if self.macro_atom_solver is None: - macro_atom_state = None - else: - macro_atom_state = self.macro_atom_solver.solve( - self.plasma_solver, - self.plasma_solver.atomic_data, - opacity_state.tau_sobolev, - self.plasma_solver.stimulated_emission_factor, - ) transport_state = self.transport_solver.initialize_transport_state( self.simulation_state, opacity_state, @@ -458,8 +471,11 @@ def run(self): logger.info( f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" ) + + opacity = self.solve_opacity() + transport_state, virtual_packet_energies = self.solve_montecarlo( - self.real_packet_count + opacity, self.real_packet_count ) ( diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index e524e0b1d51..b2138c2e784 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -299,8 +299,10 @@ def run(self): converged = False while self.completed_iterations < self.total_iterations - 1: + opacity = self.solve_opacity() + transport_state, virtual_packet_energies = self.solve_montecarlo( - self.real_packet_count + opacity, self.real_packet_count ) ( From a73eee60f7b678ff9fe79c2558b138c27841c833 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:36:36 -0400 Subject: [PATCH 47/61] Added docstring to solve_opacity method --- tardis/workflows/simple_simulation.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index ca1e1296746..d9169f3528d 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -369,7 +369,16 @@ def solve_plasma(self, estimated_radfield_properties): self.plasma_solver.update(**update_properties) def solve_opacity(self): + """Solves the opacity state and any associated objects + Returns + ------- + dict + opacity_state : tardis.opacities.opacity_state.OpacityState + State of the line opacities + macro_atom_state : tardis.opacities.macro_atom.macro_atom_state.MacroAtomState or None + State of the macro atom + """ opacity_state = self.opacity_solver.solve(self.plasma_solver) if self.macro_atom_solver is None: From 783ecae662a8105fc5ed434d3ecb07e782f7052b Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:39:13 -0400 Subject: [PATCH 48/61] Fixed initializing opacity at the last iteration --- tardis/workflows/simple_simulation.py | 5 ++++- tardis/workflows/v_inner_solver.py | 6 ++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py index d9169f3528d..5d81c766951 100644 --- a/tardis/workflows/simple_simulation.py +++ b/tardis/workflows/simple_simulation.py @@ -508,8 +508,11 @@ def run(self): logger.error( "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" ) + opacity = self.solve_opacity() transport_state, virtual_packet_energies = self.solve_montecarlo( - self.final_iteration_packet_count, self.virtual_packet_count + opacity, + self.final_iteration_packet_count, + self.virtual_packet_count, ) self.initialize_spectrum_solver( diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index b2138c2e784..90372726a6c 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -330,9 +330,11 @@ def run(self): logger.error( "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" ) - + opacity = self.solve_opacity() transport_state, virtual_packet_energies = self.solve_montecarlo( - self.final_iteration_packet_count, self.virtual_packet_count + opacity, + self.final_iteration_packet_count, + self.virtual_packet_count, ) self.initialize_spectrum_solver( transport_state, From 9ebb6f22c904d9c71647583e95d4e72b0b02bfc9 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 13:50:55 -0400 Subject: [PATCH 49/61] Added initial v_inner estimate in the __init__ --- tardis/workflows/v_inner_solver.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 90372726a6c..d0f6c1aee7f 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -36,6 +36,13 @@ def __init__(self, configuration, mean_optical_depth="rossland", tau=None): if tau is not None: self.TAU_TARGET = np.log(tau) + initial_v_inner = self.estimate_v_inner() + + self.simulation_state.geometry.v_inner_boundary = initial_v_inner + self.simulation_state.blackbody_packet_source.radius = ( + self.simulation_state.r_inner[0] + ) + def estimate_v_inner(self): """Compute the Rossland Mean Optical Depth, Estimate location where v_inner makes t=2/3 (or target) From f7e974854024119e45ddf7486827c66afdc3b096 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 14:06:25 -0400 Subject: [PATCH 50/61] massively simplified the reproject method by just doing basic math --- tardis/workflows/v_inner_solver.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index d0f6c1aee7f..a1c651070d4 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -137,18 +137,7 @@ def reproject(self, a1, m1, a2, m2): reprojection of a2 onto m1 & m2 """ - a1_expanded = np.empty_like( - a1, - shape=(self.simulation_state.geometry.no_of_shells,), - ) - a2_expanded = np.empty_like(a1_expanded) - - a1_expanded[m1] = a1 - a2_expanded[m2] = a2 - - joint_mask = m1 & m2 - - return a1_expanded[joint_mask], a2_expanded[joint_mask] + return a1[m2[m1]], a2[m1[m2]] def check_convergence( self, From e79c8218ae6b8854b68494b8947f21b1cba1b4c5 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 14:14:18 -0400 Subject: [PATCH 51/61] added docstring describing the simplified reproject method so I don't forget why it works later --- tardis/workflows/v_inner_solver.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index a1c651070d4..ff6f34a91a4 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -118,6 +118,16 @@ def get_convergence_estimates(self, transport_state): def reproject(self, a1, m1, a2, m2): """Reprojects two sub_arrays defined by a set of masks onto an array where the masks of both objects are true + let A1, A2 be arrays of size gemetry.no_of_shells and + a1 = A1[m1], + a2 = A2[m2] + find a1*, a2* s.t. + a1* = A1[m1 & m2], + a2* = A2[m1 & m2] + this is equivalent to + a1* = A1[m1][m2[m1]] = a1[m2[m1]], + a2* = A2[m2][m1[m2]] = a2[m1[m2]] + Parameters ---------- a1 : np.ndarray @@ -131,9 +141,9 @@ def reproject(self, a1, m1, a2, m2): Returns ------- - a1_joint + a1* reprojection of a1 onto m1 & m2 - a2_joint + a2* reprojection of a2 onto m1 & m2 """ From 5627d73b318b97fd5ff99924583e67f075eaf1a9 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 14:15:16 -0400 Subject: [PATCH 52/61] Formatting error in doscstring --- tardis/workflows/v_inner_solver.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index ff6f34a91a4..1389201257e 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -144,7 +144,7 @@ def reproject(self, a1, m1, a2, m2): a1* reprojection of a1 onto m1 & m2 a2* - reprojection of a2 onto m1 & m2 + reprojection of a2 onto m1 & m2 """ return a1[m2[m1]], a2[m1[m2]] From a3178ad3e59f486ff538bccb72f2b6565944af9e Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 14:34:07 -0400 Subject: [PATCH 53/61] Added nice logger output showing changes in geometry state --- tardis/workflows/v_inner_solver.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index 1389201257e..b76d15729ca 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -149,6 +149,10 @@ def reproject(self, a1, m1, a2, m2): return a1[m2[m1]], a2[m1[m2]] + def print_mask(self, mask): + + return "".join([{True: "-", False: "X"}[m] for m in mask]).join("[]") + def check_convergence( self, estimated_values, @@ -172,7 +176,11 @@ def check_convergence( if not np.all(mask == self.property_mask): convergence_statuses.append(False) # Need to set status to False if change in mask size - logger.info(f"Resized Geometry, Convergence Suppressed") + logger.info( + f"Resized Geometry, Convergence Suppressed\n" + f"\t Old Geometry: {self.print_mask(mask)}\n" + f"\t New Geometry: {self.print_mask(self.property_mask)}" + ) for key, solver in self.convergence_solvers.items(): From bc173649aa7734c5658c4fbcdd2d2ef57548feb9 Mon Sep 17 00:00:00 2001 From: rodot- Date: Wed, 14 Aug 2024 14:38:32 -0400 Subject: [PATCH 54/61] Cleaned up the notebook a bit --- docs/workflows/v_inner_solver_workflow.ipynb | 174 +++---------------- 1 file changed, 20 insertions(+), 154 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index a1251eb4bbb..8730ee1aaaf 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -2,38 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Iterations: 0/? [00:00" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "%matplotlib inline\n", "plt.figure(figsize=(10, 6.5))\n", @@ -219,13 +92,6 @@ "plt.legend()\n", "plt.show()" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 2349245fecdfeb55a3ceb9775821d2acaaf8ecc0 Mon Sep 17 00:00:00 2001 From: rodot- Date: Thu, 15 Aug 2024 10:47:11 -0400 Subject: [PATCH 55/61] Updated the formal integral to handle changes in geometry --- tardis/spectrum/formal_integral.py | 57 ++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/tardis/spectrum/formal_integral.py b/tardis/spectrum/formal_integral.py index 3f938080a73..cf74703c60c 100644 --- a/tardis/spectrum/formal_integral.py +++ b/tardis/spectrum/formal_integral.py @@ -420,9 +420,27 @@ def make_source_function(self): ------- Numpy array containing ( 1 - exp(-tau_ul) ) S_ul ordered by wavelength of the transition u -> l """ + simulation_state = self.simulation_state + # slice for the active shells + local_slice = slice( + simulation_state.geometry.v_inner_boundary_index, + simulation_state.geometry.v_outer_boundary_index, + ) + transport = self.transport montecarlo_transport_state = transport.transport_state + transition_probabilities = ( + self.original_plasma.transition_probabilities.iloc[:, local_slice] + ) + tau_sobolevs = self.original_plasma.tau_sobolevs.iloc[:, local_slice] + electron_densities = self.original_plasma.electron_densities.values[ + local_slice + ] + columns = range(simulation_state.no_of_shells) + + tau_sobolevs.columns = columns + transition_probabilities.columns = columns # macro_ref = self.atomic_data.macro_atom_references macro_ref = self.atomic_data.macro_atom_references @@ -435,9 +453,7 @@ def make_source_function(self): if transport.line_interaction_type == "macroatom": internal_jump_mask = (macro_data.transition_type >= 0).values ma_int_data = macro_data[internal_jump_mask] - internal = self.original_plasma.transition_probabilities[ - internal_jump_mask - ] + internal = transition_probabilities[internal_jump_mask] source_level_idx = ma_int_data.source_level_idx.values destination_level_idx = ma_int_data.destination_level_idx.values @@ -446,7 +462,7 @@ def make_source_function(self): montecarlo_transport_state.packet_collection.time_of_simulation * simulation_state.volume ) - exptau = 1 - np.exp(-self.original_plasma.tau_sobolevs) + exptau = 1 - np.exp(-tau_sobolevs) Edotlu = ( Edotlu_norm_factor * exptau @@ -479,14 +495,14 @@ def make_source_function(self): upper_level_index = self.atomic_data.lines.index.droplevel( "level_number_lower" ) - e_dot_lu = pd.DataFrame(Edotlu.values, index=upper_level_index) + e_dot_lu = pd.DataFrame( + Edotlu.values, index=upper_level_index, columns=columns + ) e_dot_u = e_dot_lu.groupby(level=[0, 1, 2]).sum() e_dot_u_src_idx = macro_ref.loc[e_dot_u.index].references_idx.values if transport.line_interaction_type == "macroatom": - C_frame = pd.DataFrame( - columns=np.arange(no_shells), index=macro_ref.index - ) + C_frame = pd.DataFrame(columns=columns, index=macro_ref.index) q_indices = (source_level_idx, destination_level_idx) for shell in range(no_shells): Q = sp.coo_matrix( @@ -509,7 +525,7 @@ def make_source_function(self): transitions_index = transitions.set_index( ["atomic_number", "ion_number", "source_level_number"] ).index.copy() - tmp = self.original_plasma.transition_probabilities[ + tmp = transition_probabilities[ (self.atomic_data.macro_atom_data.transition_type == -1).values ] q_ul = tmp.set_index(transitions_index) @@ -524,13 +540,15 @@ def make_source_function(self): att_S_ul = wave * (q_ul * e_dot_u) * t / (4 * np.pi) result = pd.DataFrame( - att_S_ul.values, index=transitions.transition_line_id.values + att_S_ul.values, + index=transitions.transition_line_id.values, + columns=columns, ) att_S_ul = result.loc[lines.index.values].values # Jredlu should already by in the correct order, i.e. by wavelength of # the transition l->u (similar to Jbluelu) - Jredlu = Jbluelu * np.exp(-self.original_plasma.tau_sobolevs) + att_S_ul + Jredlu = Jbluelu * np.exp(-tau_sobolevs) + att_S_ul if self.interpolate_shells > 0: ( att_S_ul, @@ -547,12 +565,8 @@ def make_source_function(self): transport.r_outer_i = ( montecarlo_transport_state.geometry_state.r_outer ) - transport.tau_sobolevs_integ = ( - self.original_plasma.tau_sobolevs.values - ) - transport.electron_densities_integ = ( - self.original_plasma.electron_densities.values - ) + transport.tau_sobolevs_integ = tau_sobolevs.values + transport.electron_densities_integ = electron_densities return att_S_ul, Jredlu, Jbluelu, e_dot_u @@ -579,7 +593,9 @@ def interpolate_integrator_quantities( transport.electron_densities_integ = interp1d( r_middle, - plasma.electron_densities, + plasma.electron_densities.iloc[ + self.simulation_state.geometry.v_inner_boundary_index : self.simulation_state.geometry.v_outer_boundary_index + ], fill_value="extrapolate", kind="nearest", )(r_middle_integ) @@ -587,7 +603,10 @@ def interpolate_integrator_quantities( # (as in the MC simulation) transport.tau_sobolevs_integ = interp1d( r_middle, - plasma.tau_sobolevs, + plasma.tau_sobolevs.iloc[ + :, + self.simulation_state.geometry.v_inner_boundary_index : self.simulation_state.geometry.v_outer_boundary_index, + ], fill_value="extrapolate", kind="nearest", )(r_middle_integ) From a7f778dd52175c4f441e466640667c89cb542cdc Mon Sep 17 00:00:00 2001 From: rodot- Date: Thu, 15 Aug 2024 11:41:38 -0400 Subject: [PATCH 56/61] Fixed the standard simulation solver --- tardis/workflows/standard_simulation.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/tardis/workflows/standard_simulation.py b/tardis/workflows/standard_simulation.py index 429752b543c..00bae779860 100644 --- a/tardis/workflows/standard_simulation.py +++ b/tardis/workflows/standard_simulation.py @@ -104,8 +104,12 @@ def get_convergence_estimates(self, transport_state): ) ) - estimated_t_radiative = estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - estimated_dilution_factor = estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + estimated_t_radiative = ( + estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature + ) + estimated_dilution_factor = ( + estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor + ) emitted_luminosity = calculate_filtered_luminosity( transport_state.emitted_packet_nu, @@ -192,8 +196,11 @@ def run(self): self.plasma_solver.electron_densities, self.simulation_state.t_inner, ) + + opacity = self.solve_opacity() + transport_state, virtual_packet_energies = self.solve_montecarlo( - self.real_packet_count + opacity, self.real_packet_count ) ( @@ -220,8 +227,11 @@ def run(self): logger.error( "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" ) + opacity = self.solve_opacity() transport_state, virtual_packet_energies = self.solve_montecarlo( - self.final_iteration_packet_count, self.virtual_packet_count + opacity, + self.final_iteration_packet_count, + self.virtual_packet_count, ) self.store_plasma_state( self.completed_iterations, From 87252160cd0279420b458743e74af0f7afe93808 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Wed, 13 Nov 2024 16:11:40 -0500 Subject: [PATCH 57/61] Remove old files --- tardis/workflows/simple_simulation.py | 521 ------------------------ tardis/workflows/standard_simulation.py | 253 ------------ 2 files changed, 774 deletions(-) delete mode 100644 tardis/workflows/simple_simulation.py delete mode 100644 tardis/workflows/standard_simulation.py diff --git a/tardis/workflows/simple_simulation.py b/tardis/workflows/simple_simulation.py deleted file mode 100644 index 5d81c766951..00000000000 --- a/tardis/workflows/simple_simulation.py +++ /dev/null @@ -1,521 +0,0 @@ -import logging -from pathlib import Path - -import numpy as np -import pandas as pd -from astropy import units as u - -from tardis import constants as const -from tardis.io.atom_data.base import AtomData -from tardis.model import SimulationState -from tardis.plasma.radiation_field import DilutePlanckianRadiationField -from tardis.plasma.assembly.legacy_assembly import assemble_plasma -from tardis.simulation.convergence import ConvergenceSolver -from tardis.spectrum.base import SpectrumSolver -from tardis.spectrum.formal_integral import FormalIntegrator -from tardis.spectrum.luminosity import ( - calculate_filtered_luminosity, -) -from tardis.transport.montecarlo.base import MonteCarloTransportSolver -from tardis.util.base import is_notebook -from tardis.workflows.workflow_logging import WorkflowLogging -from tardis.opacities.opacity_solver import OpacitySolver -from tardis.opacities.macro_atom.macroatom_solver import MacroAtomSolver - -# logging support -logger = logging.getLogger(__name__) - - -class SimpleSimulation(WorkflowLogging): - show_progress_bars = is_notebook() - enable_virtual_packet_logging = False - log_level = None - specific_log_level = None - - def __init__(self, configuration): - super().__init__(configuration, self.log_level, self.specific_log_level) - atom_data = self._get_atom_data(configuration) - - # set up states and solvers - self.simulation_state = SimulationState.from_config( - configuration, - atom_data=atom_data, - ) - - self.plasma_solver = assemble_plasma( - configuration, - self.simulation_state, - atom_data=atom_data, - ) - - self.transport_solver = MonteCarloTransportSolver.from_config( - configuration, - packet_source=self.simulation_state.packet_source, - enable_virtual_packet_logging=self.enable_virtual_packet_logging, - ) - - # Luminosity filter frequencies - self.luminosity_nu_start = ( - configuration.supernova.luminosity_wavelength_end.to( - u.Hz, u.spectral() - ) - ) - - if u.isclose( - configuration.supernova.luminosity_wavelength_start, 0 * u.angstrom - ): - self.luminosity_nu_end = np.inf * u.Hz - else: - self.luminosity_nu_end = ( - const.c / configuration.supernova.luminosity_wavelength_start - ).to(u.Hz) - - # montecarlo settings - self.total_iterations = int(configuration.montecarlo.iterations) - - self.real_packet_count = int(configuration.montecarlo.no_of_packets) - - final_iteration_packet_count = ( - configuration.montecarlo.last_no_of_packets - ) - - if ( - final_iteration_packet_count is None - or final_iteration_packet_count < 0 - ): - final_iteration_packet_count = self.real_packet_count - - self.final_iteration_packet_count = int(final_iteration_packet_count) - - self.virtual_packet_count = int( - configuration.montecarlo.no_of_virtual_packets - ) - - # spectrum settings - self.integrated_spectrum_settings = configuration.spectrum.integrated - self.spectrum_solver = SpectrumSolver.from_config(configuration) - - # Convergence settings - self.consecutive_converges_count = 0 - self.converged = False - self.completed_iterations = 0 - self.luminosity_requested = ( - configuration.supernova.luminosity_requested.cgs - ) - - # Convergence solvers - self.convergence_strategy = ( - configuration.montecarlo.convergence_strategy - ) - - self.convergence_solvers = {} - self.convergence_solvers["t_radiative"] = ConvergenceSolver( - self.convergence_strategy.t_rad - ) - self.convergence_solvers["dilution_factor"] = ConvergenceSolver( - self.convergence_strategy.w - ) - self.convergence_solvers["t_inner"] = ConvergenceSolver( - self.convergence_strategy.t_inner - ) - - self.opacity_solver = OpacitySolver( - line_interaction_type=configuration.plasma.line_interaction_type, - disable_line_scattering=False, - ) - if configuration.plasma.line_interaction_type == "scatter": - self.macro_atom_solver = None - else: - self.macro_atom_solver = MacroAtomSolver() - - def _get_atom_data(self, configuration): - """Process atomic data from the configuration - - Parameters - ---------- - configuration : Configuration - TARDIS configuration object - - Returns - ------- - AtomData - Atomic data object - - Raises - ------ - ValueError - If atom data is missing from the configuration - """ - if "atom_data" in configuration: - if Path(configuration.atom_data).is_absolute(): - atom_data_fname = Path(configuration.atom_data) - else: - atom_data_fname = ( - Path(configuration.config_dirname) / configuration.atom_data - ) - - else: - raise ValueError("No atom_data option found in the configuration.") - - logger.info(f"\n\tReading Atomic Data from {atom_data_fname}") - - try: - atom_data = AtomData.from_hdf(atom_data_fname) - except TypeError: - logger.exception( - "TypeError might be from the use of an old-format of the atomic database, \n" - "please see https://github.com/tardis-sn/tardis-refdata/tree/master/atom_data" - " for the most recent version.", - ) - raise - - return atom_data - - def get_convergence_estimates(self, transport_state): - """Compute convergence estimates from the transport state - - Parameters - ---------- - transport_state : MonteCarloTransportState - Transport state object to compute estimates - - Returns - ------- - dict - Convergence estimates - EstimatedRadiationFieldProperties - Dilute radiation file and j_blues dataclass - """ - estimated_radfield_properties = ( - self.transport_solver.radfield_prop_solver.solve( - transport_state.radfield_mc_estimators, - transport_state.time_explosion, - transport_state.time_of_simulation, - transport_state.geometry_state.volume, - transport_state.opacity_state.line_list_nu, - ) - ) - - estimated_t_radiative = ( - estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - ) - estimated_dilution_factor = ( - estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor - ) - - emitted_luminosity = calculate_filtered_luminosity( - transport_state.emitted_packet_nu, - transport_state.emitted_packet_luminosity, - self.luminosity_nu_start, - self.luminosity_nu_end, - ) - - luminosity_ratios = ( - (emitted_luminosity / self.luminosity_requested).to(1).value - ) - - estimated_t_inner = ( - self.simulation_state.t_inner - * luminosity_ratios - ** self.convergence_strategy.t_inner_update_exponent - ) - - return { - "t_radiative": estimated_t_radiative, - "dilution_factor": estimated_dilution_factor, - "t_inner": estimated_t_inner, - }, estimated_radfield_properties - - def check_convergence( - self, - estimated_values, - ): - """Check convergence status for a dict of estimated values - - Parameters - ---------- - estimated_values : dict - Estimates to check convergence - - Returns - ------- - bool - If convergence has occurred - """ - convergence_statuses = [] - - for key, solver in self.convergence_solvers.items(): - current_value = getattr(self.simulation_state, key) - estimated_value = estimated_values[key] - no_of_shells = ( - self.simulation_state.no_of_shells if key != "t_inner" else 1 - ) - convergence_statuses.append( - solver.get_convergence_status( - current_value, estimated_value, no_of_shells - ) - ) - - if np.all(convergence_statuses): - hold_iterations = self.convergence_strategy.hold_iterations - self.consecutive_converges_count += 1 - logger.info( - f"Iteration converged {self.consecutive_converges_count:d}/{(hold_iterations + 1):d} consecutive " - f"times." - ) - return self.consecutive_converges_count >= hold_iterations + 1 - - self.consecutive_converges_count = 0 - return False - - def solve_simulation_state( - self, - estimated_values, - ): - """Update the simulation state with new inputs computed from previous - iteration estimates. - - Parameters - ---------- - estimated_values : dict - Estimated from the previous iterations - - Returns - ------- - next_values : dict - The next values assigned to the simulation state - """ - next_values = {} - - for key, solver in self.convergence_solvers.items(): - if ( - key == "t_inner" - and (self.completed_iterations + 1) - % self.convergence_strategy.lock_t_inner_cycles - != 0 - ): - next_values[key] = getattr(self.simulation_state, key) - else: - next_values[key] = solver.converge( - getattr(self.simulation_state, key), estimated_values[key] - ) - - self.simulation_state.t_radiative = next_values["t_radiative"] - self.simulation_state.dilution_factor = next_values["dilution_factor"] - self.simulation_state.blackbody_packet_source.temperature = next_values[ - "t_inner" - ] - - return next_values - - def solve_plasma(self, estimated_radfield_properties): - """Update the plasma solution with the new radiation field estimates - - Parameters - ---------- - estimated_radfield_properties : EstimatedRadiationFieldProperties - The radiation field properties to use for updating the plasma - - Raises - ------ - ValueError - If the plasma solver radiative rates type is unknown - """ - radiation_field = DilutePlanckianRadiationField( - temperature=self.simulation_state.radiation_field_state.temperature, - dilution_factor=self.simulation_state.radiation_field_state.dilution_factor, - ) - update_properties = dict( - dilute_planckian_radiation_field=radiation_field - ) - # A check to see if the plasma is set with JBluesDetailed, in which - # case it needs some extra kwargs. - if ( - self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE - == "blackbody" - ): - planckian_radiation_field = ( - radiation_field.to_planckian_radiation_field() - ) - j_blues = planckian_radiation_field.calculate_mean_intensity( - self.plasma_solver.atomic_data.lines.nu.values - ) - update_properties["j_blues"] = pd.DataFrame( - j_blues, index=self.plasma_solver.atomic_data.lines.index - ) - elif ( - self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE - == "dilute-blackbody" - ): - j_blues = radiation_field.calculate_mean_intensity( - self.plasma_solver.atomic_data.lines.nu.values - ) - update_properties["j_blues"] = pd.DataFrame( - j_blues, index=self.plasma_solver.atomic_data.lines.index - ) - elif ( - self.plasma_solver.plasma_solver_settings.RADIATIVE_RATES_TYPE - == "detailed" - ): - update_properties["j_blues"] = pd.DataFrame( - estimated_radfield_properties.j_blues, - index=self.plasma_solver.atomic_data.lines.index, - ) - else: - raise ValueError( - f"radiative_rates_type type unknown - {self.plasma.plasma_solver_settings.RADIATIVE_RATES_TYPE}" - ) - - self.plasma_solver.update(**update_properties) - - def solve_opacity(self): - """Solves the opacity state and any associated objects - - Returns - ------- - dict - opacity_state : tardis.opacities.opacity_state.OpacityState - State of the line opacities - macro_atom_state : tardis.opacities.macro_atom.macro_atom_state.MacroAtomState or None - State of the macro atom - """ - opacity_state = self.opacity_solver.solve(self.plasma_solver) - - if self.macro_atom_solver is None: - macro_atom_state = None - else: - macro_atom_state = self.macro_atom_solver.solve( - self.plasma_solver, - self.plasma_solver.atomic_data, - opacity_state.tau_sobolev, - self.plasma_solver.stimulated_emission_factor, - ) - - return { - "opacity_state": opacity_state, - "macro_atom_state": macro_atom_state, - } - - def solve_montecarlo( - self, opacity, no_of_real_packets, no_of_virtual_packets=0 - ): - """Solve the MonteCarlo process - - Parameters - ---------- - no_of_real_packets : int - Number of real packets to simulate - no_of_virtual_packets : int, optional - Number of virtual packets to simulate per interaction, by default 0 - - Returns - ------- - MonteCarloTransportState - The new transport state after simulation - ndarray - Array of unnormalized virtual packet energies in each frequency bin - """ - - opacity_state = opacity["opacity_state"] - macro_atom_state = opacity["macro_atom_state"] - - transport_state = self.transport_solver.initialize_transport_state( - self.simulation_state, - opacity_state, - macro_atom_state, - self.plasma_solver, - no_of_real_packets, - no_of_virtual_packets=no_of_virtual_packets, - iteration=self.completed_iterations, - ) - - virtual_packet_energies = self.transport_solver.run( - transport_state, - iteration=self.completed_iterations, - total_iterations=self.total_iterations, - show_progress_bars=self.show_progress_bars, - ) - - output_energy = transport_state.packet_collection.output_energies - if np.sum(output_energy < 0) == len(output_energy): - logger.critical("No r-packet escaped through the outer boundary.") - - return transport_state, virtual_packet_energies - - def initialize_spectrum_solver( - self, - transport_state, - virtual_packet_energies=None, - ): - """Set up the spectrum solver - - Parameters - ---------- - transport_state : MonteCarloTransportState - The transport state to init with - virtual_packet_energies : ndarray, optional - Array of virtual packet energies binned by frequency, by default None - """ - # Set up spectrum solver - self.spectrum_solver.transport_state = transport_state - - if virtual_packet_energies is not None: - self.spectrum_solver._montecarlo_virtual_luminosity.value[ - : - ] = virtual_packet_energies - - if self.integrated_spectrum_settings is not None: - # Set up spectrum solver integrator - self.spectrum_solver.integrator_settings = ( - self.integrated_spectrum_settings - ) - self.spectrum_solver._integrator = FormalIntegrator( - self.simulation_state, self.plasma_solver, self.transport_solver - ) - - def run(self): - """Run the TARDIS simulation until convergence is reached""" - converged = False - while self.completed_iterations < self.total_iterations - 1: - logger.info( - f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" - ) - - opacity = self.solve_opacity() - - transport_state, virtual_packet_energies = self.solve_montecarlo( - opacity, self.real_packet_count - ) - - ( - estimated_values, - estimated_radfield_properties, - ) = self.get_convergence_estimates(transport_state) - - self.solve_simulation_state(estimated_values) - - self.solve_plasma(estimated_radfield_properties) - - converged = self.check_convergence(estimated_values) - self.completed_iterations += 1 - - if converged and self.convergence_strategy.stop_if_converged: - break - - if converged: - logger.info("\n\tStarting final iteration") - else: - logger.error( - "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" - ) - opacity = self.solve_opacity() - transport_state, virtual_packet_energies = self.solve_montecarlo( - opacity, - self.final_iteration_packet_count, - self.virtual_packet_count, - ) - - self.initialize_spectrum_solver( - transport_state, - virtual_packet_energies, - ) diff --git a/tardis/workflows/standard_simulation.py b/tardis/workflows/standard_simulation.py deleted file mode 100644 index 00bae779860..00000000000 --- a/tardis/workflows/standard_simulation.py +++ /dev/null @@ -1,253 +0,0 @@ -import logging - -from tardis.io.util import HDFWriterMixin -from tardis.simulation.base import PlasmaStateStorerMixin -from tardis.spectrum.luminosity import ( - calculate_filtered_luminosity, -) -from tardis.util.base import is_notebook -from tardis.visualization import ConvergencePlots -from tardis.workflows.simple_simulation import SimpleSimulation - -# logging support -logger = logging.getLogger(__name__) - - -class StandardSimulation( - SimpleSimulation, PlasmaStateStorerMixin, HDFWriterMixin -): - hdf_properties = [ - "simulation_state", - "plasma_solver", - "transport_solver", - "iterations_w", - "iterations_t_rad", - "iterations_electron_densities", - "iterations_t_inner", - "spectrum_solver", - ] - - def __init__( - self, - configuration, - enable_virtual_packet_logging=False, - log_level=None, - specific_log_level=None, - show_progress_bars=False, - show_convergence_plots=False, - convergence_plots_kwargs={}, - ): - self.show_progress_bars = show_progress_bars - self.log_level = log_level - self.specific_log_level = specific_log_level - self.enable_virtual_packet_logging = enable_virtual_packet_logging - - SimpleSimulation.__init__(self, configuration) - - # set up plasma storage - PlasmaStateStorerMixin.__init__( - self, - iterations=self.total_iterations, - no_of_shells=self.simulation_state.no_of_shells, - ) - - # Convergence plots - if show_convergence_plots: - if not is_notebook(): - raise RuntimeError( - "Convergence Plots cannot be displayed in command-line. Set show_convergence_plots " - "to False." - ) - - self.convergence_plots = ConvergencePlots( - iterations=self.total_iterations, **convergence_plots_kwargs - ) - else: - self.convergence_plots = None - - if "export_convergence_plots" in convergence_plots_kwargs: - if not isinstance( - convergence_plots_kwargs["export_convergence_plots"], - bool, - ): - raise TypeError( - "Expected bool in export_convergence_plots argument" - ) - self.export_convergence_plots = convergence_plots_kwargs[ - "export_convergence_plots" - ] - else: - self.export_convergence_plots = False - - def get_convergence_estimates(self, transport_state): - """Compute convergence estimates from the transport state - - Parameters - ---------- - transport_state : MonteCarloTransportState - Transport state object to compute estimates - - Returns - ------- - dict - Convergence estimates - EstimatedRadiationFieldProperties - Dilute radiation file and j_blues dataclass - """ - estimated_radfield_properties = ( - self.transport_solver.radfield_prop_solver.solve( - transport_state.radfield_mc_estimators, - transport_state.time_explosion, - transport_state.time_of_simulation, - transport_state.geometry_state.volume, - transport_state.opacity_state.line_list_nu, - ) - ) - - estimated_t_radiative = ( - estimated_radfield_properties.dilute_blackbody_radiationfield_state.temperature - ) - estimated_dilution_factor = ( - estimated_radfield_properties.dilute_blackbody_radiationfield_state.dilution_factor - ) - - emitted_luminosity = calculate_filtered_luminosity( - transport_state.emitted_packet_nu, - transport_state.emitted_packet_luminosity, - self.luminosity_nu_start, - self.luminosity_nu_end, - ) - absorbed_luminosity = calculate_filtered_luminosity( - transport_state.reabsorbed_packet_nu, - transport_state.reabsorbed_packet_luminosity, - self.luminosity_nu_start, - self.luminosity_nu_end, - ) - - if self.convergence_plots is not None: - plot_data = { - "t_inner": [self.simulation_state.t_inner.value, "value"], - "t_rad": [self.simulation_state.t_radiative, "iterable"], - "w": [self.simulation_state.dilution_factor, "iterable"], - "velocity": [self.simulation_state.velocity, "iterable"], - "Emitted": [emitted_luminosity.value, "value"], - "Absorbed": [absorbed_luminosity.value, "value"], - "Requested": [self.luminosity_requested.value, "value"], - } - self.update_convergence_plot_data(plot_data) - - logger.info( - f"\n\tLuminosity emitted = {emitted_luminosity:.3e}\n" - f"\tLuminosity absorbed = {absorbed_luminosity:.3e}\n" - f"\tLuminosity requested = {self.luminosity_requested:.3e}\n" - ) - - luminosity_ratios = ( - (emitted_luminosity / self.luminosity_requested).to(1).value - ) - - estimated_t_inner = ( - self.simulation_state.t_inner - * luminosity_ratios - ** self.convergence_strategy.t_inner_update_exponent - ) - - self.log_plasma_state( - self.simulation_state.t_radiative, - self.simulation_state.dilution_factor, - self.simulation_state.t_inner, - estimated_t_radiative, - estimated_dilution_factor, - estimated_t_inner, - ) - - return { - "t_radiative": estimated_t_radiative, - "dilution_factor": estimated_dilution_factor, - "t_inner": estimated_t_inner, - }, estimated_radfield_properties - - def update_convergence_plot_data(self, plot_data_dict): - """Updates convergence plotting data - - Parameters - ---------- - plot_data_dict : dict - Dictionary of data to update of the form {"name": [value, item_type]} - """ - for name, (value, item_type) in plot_data_dict.items(): - self.convergence_plots.fetch_data( - name=name, - value=value, - item_type=item_type, - ) - - def run(self): - """Run the TARDIS simulation until convergence is reached""" - converged = False - while self.completed_iterations < self.total_iterations - 1: - logger.info( - f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" - ) - self.store_plasma_state( - self.completed_iterations, - self.simulation_state.dilution_factor, - self.simulation_state.t_radiative, - self.plasma_solver.electron_densities, - self.simulation_state.t_inner, - ) - - opacity = self.solve_opacity() - - transport_state, virtual_packet_energies = self.solve_montecarlo( - opacity, self.real_packet_count - ) - - ( - estimated_values, - estimated_radfield_properties, - ) = self.get_convergence_estimates(transport_state) - - if self.convergence_plots is not None: - self.convergence_plots.update() - - self.solve_simulation_state(estimated_values) - - self.solve_plasma(estimated_radfield_properties) - - converged = self.check_convergence(estimated_values) - self.completed_iterations += 1 - - if converged and self.convergence_strategy.stop_if_converged: - break - - if converged: - logger.info("\n\tStarting final iteration") - else: - logger.error( - "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" - ) - opacity = self.solve_opacity() - transport_state, virtual_packet_energies = self.solve_montecarlo( - opacity, - self.final_iteration_packet_count, - self.virtual_packet_count, - ) - self.store_plasma_state( - self.completed_iterations, - self.simulation_state.dilution_factor, - self.simulation_state.t_radiative, - self.plasma_solver.electron_densities, - self.simulation_state.t_inner, - ) - self.reshape_plasma_state_store(self.completed_iterations) - if self.convergence_plots is not None: - self.get_convergence_estimates(transport_state) - self.convergence_plots.update( - export_convergence_plots=self.export_convergence_plots, - last=True, - ) - self.initialize_spectrum_solver( - transport_state, - virtual_packet_energies, - ) From f33d708ccc67d18c1c5682e5e92bcd5f4231fed8 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Wed, 13 Nov 2024 16:11:59 -0500 Subject: [PATCH 58/61] Fixes v_inner workflow --- docs/workflows/v_inner_solver_workflow.ipynb | 12 +++---- tardis/workflows/simple_tardis_workflow.py | 2 ++ tardis/workflows/util.py | 9 +++-- tardis/workflows/v_inner_solver.py | 37 +++++++++----------- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 8730ee1aaaf..3698a60249e 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "outputs": [], "source": [ - "from tardis.workflows.v_inner_solver import InnerVelocitySimulationSolver\n", + "from tardis.workflows.v_inner_solver import InnerVelocitySolverWorkflow\n", "from tardis.io.configuration.config_reader import Configuration" ] }, @@ -39,9 +39,9 @@ "config.model.structure.velocity.start = 5000 * u.km/u.s # Larger window over which to search\n", "config.model.structure.velocity.num = 50 # Increase number of shells\n", "\n", - "workflow = InnerVelocitySimulationSolver(\n", - " config, tau=2.0/3, \n", - " mean_optical_depth=\"rossland\"\n", + "workflow = InnerVelocitySolverWorkflow(\n", + " config, tau=2.0/3,\n", + " mean_optical_depth=\"rosseland\"\n", ")" ] }, @@ -96,9 +96,9 @@ ], "metadata": { "kernelspec": { - "display_name": "Python [conda env:miniconda3-tardis]", + "display_name": "tardis", "language": "python", - "name": "conda-env-miniconda3-tardis-py" + "name": "python3" }, "language_info": { "codemirror_mode": { diff --git a/tardis/workflows/simple_tardis_workflow.py b/tardis/workflows/simple_tardis_workflow.py index 1f5b3cbbf39..84d7225a5cc 100644 --- a/tardis/workflows/simple_tardis_workflow.py +++ b/tardis/workflows/simple_tardis_workflow.py @@ -256,6 +256,8 @@ def solve_simulation_state( "t_inner" ] + return next_values + def solve_plasma(self, estimated_radfield_properties): """Update the plasma solution with the new radiation field estimates diff --git a/tardis/workflows/util.py b/tardis/workflows/util.py index 6e2defb7b35..6584c0dcfad 100644 --- a/tardis/workflows/util.py +++ b/tardis/workflows/util.py @@ -17,12 +17,11 @@ def get_tau_integ(plasma, simulation_state, bin_size=10): Returns ------- dict - rossland : np.ndarray + rosseland : np.ndarray Roassland Mean Optical Depth planck : np.ndarray Planck Mean Optical Depth """ - index = plasma.atomic_data.lines.nu.index taus = plasma.tau_sobolevs.loc[index] freqs = plasma.atomic_data.lines.nu.values @@ -74,7 +73,7 @@ def U(nu, T): -1, 1 ) kappa_tot = kappa_thom + kappa_exp - kappa_rossland = ( + kappa_rosseland = ( (udnu * kappa_tot**-1).sum(axis=0) / (udnu.sum(axis=0)) ) ** -1 @@ -83,6 +82,6 @@ def U(nu, T): ).cgs.value dtau = kappa_planck * dr planck_integ_tau = np.cumsum(dtau[::-1])[::-1] - rossland_integ_tau = np.cumsum((kappa_rossland * dr)[::-1])[::-1] + rosseland_integ_tau = np.cumsum((kappa_rosseland * dr)[::-1])[::-1] - return {"rossland": rossland_integ_tau, "planck": planck_integ_tau} + return {"rosseland": rosseland_integ_tau, "planck": planck_integ_tau} diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index b76d15729ca..b89c2f39f53 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -1,14 +1,14 @@ import logging import numpy as np +import pandas as pd from astropy import units as u +from scipy.interpolate import interp1d +from tardis.plasma.radiation_field import DilutePlanckianRadiationField from tardis.simulation.convergence import ConvergenceSolver -from tardis.workflows.simple_simulation import SimpleSimulation +from tardis.workflows.simple_tardis_workflow import SimpleTARDISWorkflow from tardis.workflows.util import get_tau_integ -from tardis.plasma.radiation_field import DilutePlanckianRadiationField -from scipy.interpolate import interp1d -import pandas as pd # logging support logger = logging.getLogger(__name__) @@ -20,12 +20,10 @@ # Handle non-explicit formats when going out of the simulation -class InnerVelocitySimulationSolver(SimpleSimulation): - +class InnerVelocitySolverWorkflow(SimpleTARDISWorkflow): TAU_TARGET = np.log(2.0 / 3) - def __init__(self, configuration, mean_optical_depth="rossland", tau=None): - + def __init__(self, configuration, mean_optical_depth="rosseland", tau=None): super().__init__(configuration) self.mean_optical_depth = mean_optical_depth.lower() @@ -44,13 +42,13 @@ def __init__(self, configuration, mean_optical_depth="rossland", tau=None): ) def estimate_v_inner(self): - """Compute the Rossland Mean Optical Depth, + """ + Compute the Rosseland Mean Optical Depth, Estimate location where v_inner makes t=2/3 (or target) Extrapolate with exponential fits - Need some way to return and inspect the optical depths for later logging""" - pass - + Need some way to return and inspect the optical depths for later logging + """ tau_integ = np.log( get_tau_integ( self.plasma_solver, @@ -104,7 +102,6 @@ def get_convergence_estimates(self, transport_state): EstimatedRadiationFieldProperties Dilute radiation file and j_blues dataclass """ - estimates = super().get_convergence_estimates(transport_state) estimated_v_inner = self.estimate_v_inner() @@ -146,11 +143,9 @@ def reproject(self, a1, m1, a2, m2): a2* reprojection of a2 onto m1 & m2 """ - return a1[m2[m1]], a2[m1[m2]] def print_mask(self, mask): - return "".join([{True: "-", False: "X"}[m] for m in mask]).join("[]") def check_convergence( @@ -183,7 +178,6 @@ def check_convergence( ) for key, solver in self.convergence_solvers.items(): - current_value = getattr(self.simulation_state, key) estimated_value = estimated_values[key] @@ -312,11 +306,14 @@ def run(self): """Run the TARDIS simulation until convergence is reached""" converged = False while self.completed_iterations < self.total_iterations - 1: + logger.info( + f"\n\tStarting iteration {(self.completed_iterations + 1):d} of {self.total_iterations:d}" + ) - opacity = self.solve_opacity() + opacity_states = self.solve_opacity() transport_state, virtual_packet_energies = self.solve_montecarlo( - opacity, self.real_packet_count + opacity_states, self.real_packet_count ) ( @@ -344,9 +341,9 @@ def run(self): logger.error( "\n\tITERATIONS HAVE NOT CONVERGED, starting final iteration" ) - opacity = self.solve_opacity() + opacity_states = self.solve_opacity() transport_state, virtual_packet_energies = self.solve_montecarlo( - opacity, + opacity_states, self.final_iteration_packet_count, self.virtual_packet_count, ) From f163e7ad62c4302bab685b5f6c9c59a4cd03adb5 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Wed, 13 Nov 2024 16:28:05 -0500 Subject: [PATCH 59/61] Minor formatting changes --- tardis/workflows/util.py | 2 +- tardis/workflows/v_inner_solver.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tardis/workflows/util.py b/tardis/workflows/util.py index 6584c0dcfad..39b3c489c85 100644 --- a/tardis/workflows/util.py +++ b/tardis/workflows/util.py @@ -1,5 +1,5 @@ -from astropy import units as u, constants as const import numpy as np +from astropy import constants as const def get_tau_integ(plasma, simulation_state, bin_size=10): diff --git a/tardis/workflows/v_inner_solver.py b/tardis/workflows/v_inner_solver.py index b89c2f39f53..039574b4bd9 100644 --- a/tardis/workflows/v_inner_solver.py +++ b/tardis/workflows/v_inner_solver.py @@ -21,7 +21,7 @@ class InnerVelocitySolverWorkflow(SimpleTARDISWorkflow): - TAU_TARGET = np.log(2.0 / 3) + TAU_TARGET = np.log(2.0 / 3.0) def __init__(self, configuration, mean_optical_depth="rosseland", tau=None): super().__init__(configuration) From f22ac60850e00d5ade9e2b6aedd625916e50ac97 Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Wed, 13 Nov 2024 16:28:52 -0500 Subject: [PATCH 60/61] Clean up confusing v_boundary_inner vs v_inner_boundary variable names --- docs/physics/setup/model.ipynb | 8 ++++---- .../schemas/montecarlo_definitions.yml | 1 - .../io/model/parse_geometry_configuration.py | 16 ++++++++-------- tardis/model/base.py | 18 +++++++----------- 4 files changed, 19 insertions(+), 24 deletions(-) diff --git a/docs/physics/setup/model.ipynb b/docs/physics/setup/model.ipynb index 426d8010ebd..e9ca9fffda8 100644 --- a/docs/physics/setup/model.ipynb +++ b/docs/physics/setup/model.ipynb @@ -81,7 +81,7 @@ "id": "cee054e9", "metadata": {}, "source": [ - "In the cell below, we set up a model. We use the [specific structure](../../io/configuration/components/models/index.rst#specific-structure) where we supply $t_\\mathrm{explosion}$, the velocity of the inner and outer boundaries of the supernova (labeled `start` and `stop`), and the number of shells (labeled `num`). The shells are then evenly spaced between the inner and outer boundaries of the supernova. The time after the explosion, the inner and outer velocities, and the number of shells can be varied to get different shell structures. The `SimulationState` object stores information about the model in the following attributes: `velocity` shows the velocity of the shell boundaries, `v_inner` shows the velocities of the inner boundaries of each shell, `v_outer` shows the velocity of the outer boundaries of each shell, and `v_middle` shows the velocity of the middle of each shell. Similarly, `radius`, `r_inner`, `r_outer`, and `r_middle` show the radii of each shell boundary, the inner boundaries, the outer boundaries, and the middles of each shell, respectively. `v_boundary_inner` shows the velocity of the inner boundary of the computational domain, and `v_boundary_outer` shows the velocity of the outer boundary of the computational domain. Finally, `volume` shows the volume of each shell, calculated via the formula of the volume of a spherical shell: $V=\\frac{4}{3}\\pi (r_\\mathrm{outer}^3-r_\\mathrm{inner}^3)$." + "In the cell below, we set up a model. We use the [specific structure](../../io/configuration/components/models/index.rst#specific-structure) where we supply $t_\\mathrm{explosion}$, the velocity of the inner and outer boundaries of the supernova (labeled `start` and `stop`), and the number of shells (labeled `num`). The shells are then evenly spaced between the inner and outer boundaries of the supernova. The time after the explosion, the inner and outer velocities, and the number of shells can be varied to get different shell structures. The `SimulationState` object stores information about the model in the following attributes: `velocity` shows the velocity of the shell boundaries, `v_inner` shows the velocities of the inner boundaries of each shell, `v_outer` shows the velocity of the outer boundaries of each shell, and `v_middle` shows the velocity of the middle of each shell. Similarly, `radius`, `r_inner`, `r_outer`, and `r_middle` show the radii of each shell boundary, the inner boundaries, the outer boundaries, and the middles of each shell, respectively. `v_inner_boundary` shows the velocity of the inner boundary of the computational domain, and `v_outer_boundary` shows the velocity of the outer boundary of the computational domain. Finally, `volume` shows the volume of each shell, calculated via the formula of the volume of a spherical shell: $V=\\frac{4}{3}\\pi (r_\\mathrm{outer}^3-r_\\mathrm{inner}^3)$." ] }, { @@ -111,8 +111,8 @@ "print('v_inner:\\n', shell_simulation_state.v_inner)\n", "print('v_outer:\\n', shell_simulation_state.v_outer)\n", "print('v_middle:\\n', shell_simulation_state.v_middle)\n", - "print('v_boundary_inner:\\n', shell_simulation_state.v_boundary_inner)\n", - "print('v_boundary_outer:\\n', shell_simulation_state.v_boundary_outer)\n", + "print('v_inner_boundary:\\n', shell_simulation_state.v_inner_boundary)\n", + "print('v_outer_boundary:\\n', shell_simulation_state.v_outer_boundary)\n", "print('radius:\\n', shell_simulation_state.radius)\n", "print('r_inner:\\n', shell_simulation_state.r_inner)\n", "print('r_outer:\\n', shell_simulation_state.r_outer)\n", @@ -125,7 +125,7 @@ "id": "1ee56110", "metadata": {}, "source": [ - "Notice that `radius = velocity*time_explosion`, and similarly for `r_inner`, `r_outer`, and `r_middle`. You can get the radius of the photosphere via `v_boundary_inner*time_explosion` and outer edge of the supernova via `v_boundary_outer*time_explosion`.\n", + "Notice that `radius = velocity*time_explosion`, and similarly for `r_inner`, `r_outer`, and `r_middle`. You can get the radius of the photosphere via `v_inner_boundary*time_explosion` and outer edge of the supernova via `v_boundary_outer*time_explosion`.\n", "\n", "
\n", " \n", diff --git a/tardis/io/configuration/schemas/montecarlo_definitions.yml b/tardis/io/configuration/schemas/montecarlo_definitions.yml index 050e7d5c2fb..b79a4b7da00 100644 --- a/tardis/io/configuration/schemas/montecarlo_definitions.yml +++ b/tardis/io/configuration/schemas/montecarlo_definitions.yml @@ -5,7 +5,6 @@ definitions: title: 'Damped Convergence Strategy' type: object additionalProperties: false - properties: properties: type: enum: diff --git a/tardis/io/model/parse_geometry_configuration.py b/tardis/io/model/parse_geometry_configuration.py index c517a4a7ea4..e2f0c8fd20f 100644 --- a/tardis/io/model/parse_geometry_configuration.py +++ b/tardis/io/model/parse_geometry_configuration.py @@ -135,17 +135,17 @@ def parse_geometry_from_csvy( """ if hasattr(config, "model"): if hasattr(config.model, "v_inner_boundary"): - v_boundary_inner = config.model.v_inner_boundary + v_inner_boundary = config.model.v_inner_boundary else: - v_boundary_inner = None + v_inner_boundary = None if hasattr(config.model, "v_outer_boundary"): - v_boundary_outer = config.model.v_outer_boundary + v_outer_boundary = config.model.v_outer_boundary else: - v_boundary_outer = None + v_outer_boundary = None else: - v_boundary_inner = None - v_boundary_outer = None + v_inner_boundary = None + v_outer_boundary = None if hasattr(csvy_model_config, "velocity"): velocity = quantity_linspace( @@ -166,8 +166,8 @@ def parse_geometry_from_csvy( geometry = HomologousRadial1DGeometry( velocity[:-1], # v_inner velocity[1:], # v_outer - v_inner_boundary=v_boundary_inner, - v_outer_boundary=v_boundary_outer, + v_inner_boundary=v_inner_boundary, + v_outer_boundary=v_outer_boundary, time_explosion=time_explosion, ) return geometry diff --git a/tardis/model/base.py b/tardis/model/base.py index ad285482b62..960c47a9455 100644 --- a/tardis/model/base.py +++ b/tardis/model/base.py @@ -58,11 +58,11 @@ class SimulationState(HDFWriterMixin): dilution_factor : np.ndarray If None, the dilution_factor will be initialized with the geometric dilution factor. - v_boundary_inner : astropy.units.Quantity - v_boundary_outer : astropy.units.Quantity + v_inner_boundary : astropy.units.Quantity + v_outer_boundary : astropy.units.Quantity raw_velocity : np.ndarray The complete array of the velocities, without being cut by - `v_boundary_inner` and `v_boundary_outer` + `v_inner_boundary` and `v_outer_boundary` electron_densities : astropy.units.quantity.Quantity Attributes @@ -81,8 +81,8 @@ class SimulationState(HDFWriterMixin): density : astropy.units.quantity.Quantity volume : astropy.units.quantity.Quantity no_of_shells : int - The number of shells as formed by `v_boundary_inner` and - `v_boundary_outer` + The number of shells as formed by `v_inner_boundary` and + `v_outer_boundary` no_of_raw_shells : int """ @@ -205,16 +205,12 @@ def isotopic_number_density(self): def radius(self): return self.time_explosion * self.velocity - @property - def v_boundary_inner(self): - return self.geometry.v_inner_boundary - @property def v_inner_boundary(self): - return self.v_boundary_inner + return self.geometry.v_inner_boundary @property - def v_boundary_outer(self): + def v_outer_boundary(self): return self.geometry.v_outer_boundary @property From e6b2f2327925fff57bb43e406f5211a7338ba00f Mon Sep 17 00:00:00 2001 From: Andrew Fullard Date: Wed, 13 Nov 2024 16:38:00 -0500 Subject: [PATCH 61/61] Add integrated spectrum to workflow example --- docs/workflows/v_inner_solver_workflow.ipynb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/workflows/v_inner_solver_workflow.ipynb b/docs/workflows/v_inner_solver_workflow.ipynb index 3698a60249e..f52d347223f 100644 --- a/docs/workflows/v_inner_solver_workflow.ipynb +++ b/docs/workflows/v_inner_solver_workflow.ipynb @@ -70,7 +70,8 @@ "outputs": [], "source": [ "spectrum = workflow.spectrum_solver.spectrum_real_packets\n", - "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets" + "spectrum_virtual = workflow.spectrum_solver.spectrum_virtual_packets\n", + "spectrum_integrated = workflow.spectrum_solver.spectrum_integrated" ] }, { @@ -84,6 +85,7 @@ "\n", "spectrum.plot(label=\"Normal packets\")\n", "spectrum_virtual.plot(label=\"Virtual packets\")\n", + "spectrum_integrated.plot(label='Formal integral')\n", "\n", "plt.xlim(500, 9000)\n", "plt.title(\"TARDIS example model spectrum\")\n",