Ejemplo n.º 1
0
Archivo: cloudy.py Proyecto: nhmc/H2
def main():
    if not os.path.lexists('grid.cfg'):
        print ('./grid.cfg file not found, writing an example grid.cfg to '
               'the current directory')
        write_example_grid_config()
        sys.exit()

    cfg = read_config('grid.cfg')

    print ''
    print 'Input values:'
    for k in sorted(cfg):
        print '  %s: %s' % (k, cfg[k])
    print ''

    if cfg.table is None:
        fluxname = cfg.prefix + '_temp_uvb.dat'
        uvb = calc_uvb(cfg.z, cfg.cuba_name, match_fg=True)
        writetable('cloudy_jnu_HM.tbl', [uvb['energy'], uvb['logjnu']],
                   overwrite=1,
                   units=['Rydbergs', 'log10(erg/s/cm^2/Hz/ster)'],
                   names=['energy', 'jnu'])

        if cfg.distance_starburst_kpc is not None:
            wa, F = read_starburst99('starburst.spectrum1')
            nu, logjnu = calc_local_jnu(wa, F, cfg.distance_starburst_kpc,
                                        cfg.fesc)
            energy = nu * hplanck / Ryd
            # use HM uvb energy limits
            cond = between(uvb['energy'], energy[0], energy[-1])
            logjnu1 = np.interp(uvb['energy'][cond], energy, logjnu)
            uvb['logjnu'][cond] = np.log10(10**uvb['logjnu'][cond] +
                                           10**logjnu1)
            writetable('cloudy_jnu_total.tbl', [uvb['energy'], uvb['logjnu']],
                       overwrite=1,
                       units=['Rydbergs', 'log10(erg/s/cm^2/Hz/ster)'],
                       names=['energy', 'jnu'])

        write_uvb(fluxname, uvb['energy'], uvb['logjnu'], cfg.overwrite)

        # Fnu at 1 Rydberg
        k = np.argmin(np.abs(uvb['energy'] - 1.))
        logfnu912 = np.log10(10**uvb['logjnu'][k] * 4 * pi)
    else:
        logfnu912 = cfg.logfnu912
        fluxname = None

    write_grid_input(cfg, fnu912=logfnu912, fluxfilename=fluxname, table=cfg.table,
                     abundances=cfg.abundances)

    if cfg.run_cloudy:
        run_grid(nproc=cfg.nproc, overwrite=cfg.overwrite)

    models = parse_grid2(cfg)

    filename = cfg.prefix + '_grid.sav.gz'
    print 'Writing to', filename
    saveobj(filename, models, overwrite=cfg.overwrite)
Ejemplo n.º 2
0
def main():
    if not os.path.lexists('grid.cfg'):
        print ('./grid.cfg file not found, writing an example grid.cfg to '
               'the current directory')
        write_example_grid_config()
        sys.exit()

    cfg = read_config('grid.cfg')

    print ''
    print 'Input values:'
    for k in sorted(cfg):
        print '  %s: %s' % (k, cfg[k])
    print ''

    if cfg.table is None:
        fluxname = cfg.prefix + '_temp_uvb.dat'
        if cfg.cuba_name is None:
            cfg.cuba_name = get_data_path() + 'UVB.out'

        uvb = calc_uvb(cfg.z, cfg.cuba_name, match_fg=False)

        writetable('cloudy_jnu_HM.tbl', [uvb['energy'], uvb['logjnu']],
                   overwrite=1,
                   units=['Rydbergs', 'erg/s/cm^2/Hz/ster'],
                   names=['energy', 'log10jnu'])

        if cfg.uvb_tilt is not None:
            if cfg.distance_starburst_kpc is not None:
                raise RuntimeError('Must only specify one of uvb_tilt and\
                distance_starburst_kpc!')

            # remember which bits had 1e-30
            clow = uvb['logjnu'] == -30
            # tilt the UV background between 1 and 10 Rydbergs
            logjnu = tilt_spec(cfg.uvb_tilt, uvb['energy'], uvb['logjnu'],
                               emin=1, emax=10)

            logjnu[clow] = -30

            print('Tilting UVB using parameter {}'.format(cfg.uvb_tilt))

            # now re-normalise to match the photoionization rate of the
            # default spectrum.

            gamma_default = find_gamma(uvb['energy'], 10**uvb['logjnu'])
            mult = gamma_default / find_gamma(uvb['energy'], 10**logjnu)
            print 'Scaling tilted Jnu by %.3g to match default gamma' % mult
            logjnu = logjnu + np.log10(mult)

            writetable('cloudy_jnu_tilted.tbl', [uvb['energy'], logjnu],
                       overwrite=1,
                       units=['Rydbergs', 'erg/s/cm^2/Hz/ster'],
                       names=['energy', 'log10jnu'])
            uvb['logjnu'] = logjnu

        elif cfg.distance_starburst_kpc is not None:
            wa, F = read_starburst99(get_data_path() + 'starburst.spectrum1')
            nu, logjnu = calc_local_jnu(wa, F, cfg.distance_starburst_kpc,
                                        cfg.fesc)
            energy = nu * hplanck / Ryd
            # use HM uvb energy limits
            cond = between(uvb['energy'], energy[0], energy[-1])
            logjnu1 = np.interp(uvb['energy'][cond], energy, logjnu)
            uvb['logjnu'][cond] = np.log10(10**uvb['logjnu'][cond] +
                                           10**logjnu1)
            writetable('cloudy_jnu_total.tbl', [uvb['energy'], uvb['logjnu']],
                       overwrite=1,
                       units=['Rydbergs', 'erg/s/cm^2/Hz/ster'],
                       names=['energy', 'log10jnu'])

        write_uvb(fluxname, uvb['energy'], uvb['logjnu'], cfg.overwrite)

        # Fnu at 1 Rydberg
        k = np.argmin(np.abs(uvb['energy'] - 1.))
        logfnu912 = np.log10(10**uvb['logjnu'][k] * 4 * pi)
    else:
        logfnu912 = cfg.logfnu912
        fluxname = None

    write_grid_input(cfg, fnu912=logfnu912, fluxfilename=fluxname, table=cfg.table,
                     abundances=cfg.abundances)

    if cfg.run_cloudy:
        run_grid(nproc=cfg.nproc, overwrite=cfg.overwrite)

    models = parse_grid(cfg)

    filename = cfg.prefix + '_grid.sav.gz'
    print 'Writing to', filename
    saveobj(filename, models, overwrite=cfg.overwrite)
    savehdf5(filename.replace('.sav.gz', '.hdf5'), models,
             overwrite=cfg.overwrite)