Re-using previous models

Re-using previous models#

In some cases, it can be useful to re-use the geometry, physical quantities, sources, or other parameters, from a previous model. For example, one might want to separate the calculation of the temperature/specific energy from the calculation of the images. A number of methods are available for this, and are described in the sections below.

Re-using a whole model#

The simplest case is that you may want to read in a previous model, modify it, and write it out/run it again. The easiest way to do this is to use the read() method:

m = Model.read('some_model.rtin')

Once the model has been read in, it is possible to modify any of the parameters, add more density grids, sources, and change the parameters.

It is also possible to read in a model from an output file. In this case, what is read in are the initial parameters/settings/quantities for the model. If you would like to use the final specific energy (and optionally density if available), you can call read with the only_initial= argument set to False:

m = Model.read(‘some_model.rtout’, only_initial=False)

If, instead of reading in the whole model, you want to re-use only certain aspects of a previous model, see the following sections.

Geometry#

It is possible to re-use the geometry (i.e. the definition of the grid, excluding quantities such as density of specific energy) from either a previous input or output file by doing:

m = Model()
m.use_geometry(<filename>)

For example, if you create a model with:

m1 = Model()
m1.set_cartesian_grid([-1., 1.], [-1., 1.], [-1., 1.])
m1.add_density_grid(np.array([[[1.e-10]]]), 'kmh.hdf5')
s = m1.add_point_source()
s.luminosity = lsun
s.temperature = 6000.
m1.set_n_photons(initial=1000, imaging=1000)
m1.write('model_1.rtin')

and run the model to produce model_1.rtout, then you can create a new model that makes use of the geometry to set up a model with the same grid, but different density values and source properties by doing:

m2 = Model()
m2.use_geometry('model_1.rtout')
m2.add_density_grid(np.array([[[2.e-10]]]), 'kmh.hdf5')
s = m2.add_point_source()
s.luminosity = 0.5 * lsun
s.temperature = 6000.
m2.set_n_photons(initial=1000, imaging=1000)
m2.write('model_2.rtin')

The use_geometry() method can take either a previous input or output file. See use_geometry() for more information.

Quantities#

Similarly, you can also instruct Hyperion to use the same density grid by doing:

m.use_quantities(<filename>, quantities=<quantities to use>)

As for the geometry, the file can be a previous input or output file from Hyperion. If an input file, then by default the previous input density (and optionally specific energy) will be used, whereas if an output file, then by default the final specific energy and the initial density will be used. By default, this will also read in the minimum specific energy requested for the grids, and the dust properties.

For example, in the example mentioned in Geometry you can do:

m2 = Model()
m2.use_geometry('model_1.rtout')
m2.use_quantities('model_1.rtout')
s = m2.add_point_source()
s.luminosity = lsun
s.temperature = 6000.
m2.set_n_photons(initial=1000, imaging=1000)
m2.write('model_2.rtin')

to use the density, specific energy, and dust from model_1.rtout. If you want to keep the specific energy as-is and avoid computing it further, you should make sure that you disable the calculation of the specific energy:

m2 = Model()
m2.use_geometry('model_1.rtout')
m2.use_quantities('model_1.rtout')
s = m2.add_point_source()
s.luminosity = lsun
s.temperature = 6000.
m2.set_n_initial_iterations(0)  # disable specific energy calculation
m2.set_n_photons(imaging=1000)  # don't specify initial number of photons
m2.write('model_2.rtin')

Note that you can also use just the density or just the specific energy if you wish, by using the quantities argument, e.g.:

m2.use_quantities('model_1.rtout', quantities=['density'])

or:

m2.use_quantities('model_1.rtout', quantities=['specific_energy'])

In the case where quantities are being read from an output file, you can also explicitly request that only the input quantities be read in:

m2.use_quantities('model_1.rtout', only_initial=True)

You can disable using the dust from the previous model (in case you want to change it):

m2.use_quantities('model_1.rtout', use_dust=False)

and you can also disable using the minimum specific energy:

m2.use_quantities('model_1.rtout', use_minimum_specific_energy=False)

If you are computing a model where the density is changing from one iteration to the next (for example due to dust sublimation), and if you want to use the final density, you will need to make sure that you run the initial model with the option to output the density at the last iteration:

m1.conf.output.output_density = 'last'

Finally, by default the behavior of use_quantities() is to read in the data, so that it can be modified, but if you do not plan to modify the density, specific energy, or dust properties, you can also simply link to the previous quantities by doing:

m2.use_quantities(..., copy=False)

For more information, see use_quantities().

Sources#

You can import sources from a previous input or output file with:

m2.use_sources('model_1.rtout')

This will read in the sources, and you can then modify them if needed, or add new ones to the model. For more information, see use_sources().

Configuration#

Several methods are available to read in the image/SED configuration, runtime parameters, and output parameters from a previous model:

m1.use_image_config(filename)
m1.use_run_config(filename)
m1.use_output_config(filename)

As for the Sources, it is then possible to modify these parameters, and optionally add new images. For more information, see use_image_config(), use_run_config(), and use_output_config().