示例#1
0
 def test_hyd_load_hyd_abn_no_dum(self):
     name = 'u50fenv'
     path = '/home/bakl/Sn/my/papers/18/fischer/model'
     # eve = StellaHydAbn(name, path=path).load_hyd()
     eve = sn_eve.load_hyd_abn(name, path=path, is_dum=False)
     self.assertTrue(eve.is_set('Rho'),
                     "hyd-file have not been loaded: %s" % name)
示例#2
0
 def test_hyd_load(self):
     name = 'm030307mhh'
     path = join(dirname(abspath(__file__)), 'data', 'stella')
     # eve = StellaHydAbn(name, path=path).load_hyd()
     eve = sn_eve.load_hyd_abn(name, path=path)
     self.assertTrue(eve.is_set('Rho'),
                     "hyd-file have not been loaded: %s" % name)
示例#3
0
    def test_hyd_abn_load(self):
        name = 'm030307mhh'
        path = join(dirname(abspath(__file__)), 'data', 'stella')
        eve = sn_eve.load_hyd_abn(name, path=path)

        self.assertTrue(eve.nzon > 0,
                        "Zones numbers should be more 0 [%d]." % eve.nzon)
示例#4
0
 def test_abn_write(self):
     name = 'm030307mhh'
     path = join(dirname(abspath(__file__)), 'data', 'stella')
     eve = sn_eve.load_hyd_abn(name, path=path)
     fname = 'tmp.abn'
     res = eve.write_abn(fname)
     self.assertTrue(res, "Fail to write in %s" % fname)
示例#5
0
 def get_eve(self, name=None, path=None, is_hyd_abn=False, **kwargs):
     from pystella.model import sn_eve
     if name is None:
         name = self.Name
     if path is None:
         path = self.Path
     if is_hyd_abn:
         eve = sn_eve.load_hyd_abn(name, path, **kwargs)
     else:
         eve = sn_eve.load_rho(os.path.join(path, name + '.rho'))
     return eve
示例#6
0
    def test_presn_reshape(self):
        name = 'u50fenv'
        path = '/home/bakl/Sn/my/papers/18/fischer/model'
        eve = sn_eve.load_hyd_abn(name, path=path, is_dum=False)

        # for same size must be the same
        evenew = eve.reshape(nz=eve.nzon)
        self.assertEqual(
            evenew.nzon, eve.nzon,
            "Reshape PreSn: you have {} zone, but it should be {}".format(
                eve.nzon, eve.nzon))
        # todo check range for Rho, V, T
        for k in (0, -1):
            self.assertAlmostEqual(
                eve.m[k] / evenew.m[k],
                1.,
                msg=
                "Mass PreSn: you have the first zone where old mass {} = new {}"
                .format(eve.m[k], evenew.m[k]))
            self.assertAlmostEqual(
                eve.r[k] / evenew.r[k],
                1.,
                msg=
                "Radius PreSn: you have the last zone where old r {} = new {}".
                format(eve.r[k], evenew.r[k]))
            self.assertAlmostEqual(
                eve.rho[k] / evenew.rho[k],
                1.,
                msg=
                "Density PreSn: you have the last zone where old rho {} = new {}"
                .format(eve.rho[k], evenew.rho[k]))
        nzon = 500
        nstart = 309
        evenew = eve.reshape(nz=nzon, start=nstart, end=None)
        self.assertEqual(
            evenew.nzon, nstart + nzon,
            "Reshape PreSn: you have {} zone, but it should be {}".format(
                eve.nzon, nstart + nzon))
        evenew.plot_chem()
        plt.show()
示例#7
0
    def test_presn_zone_reduce(self):
        name = 'u50fenv'
        path = '/home/bakl/Sn/my/papers/18/fischer/model'
        # eve = StellaHydAbn(name, path=path).load_hyd()
        eve = sn_eve.load_hyd_abn(name, path=path, is_dum=False)

        # evenew = eve.zone_reduce(diff=1.005, start=110, end=-20)
        evenew = eve.zone_reduce(by='M', diff=1.01, start=309, end=-100)

        ii = np.arange(evenew.nzon)
        if not np.all(np.diff(evenew.m) > 0.):
            print("Not np.all(np.diff(evenew.m) > 0.): {}".format(
                ii[np.diff(evenew.m) < 0.]))
        self.assertTrue(np.all(np.diff(evenew.m) > 0.), " Any M[i] < M[i+1]")
        self.assertTrue(np.all(np.diff(evenew.r) > 0.), " Any R[i] < R[i+1]")

        # plot
        plt.plot(evenew.m / ps.phys.M_sun,
                 np.log10(evenew.rho),
                 marker='d',
                 ls='',
                 label='eveinterp',
                 linewidth=4)
        plt.plot(evenew.m / ps.phys.M_sun,
                 np.log10(evenew.rho),
                 ls='',
                 marker='<',
                 label='evenew',
                 markersize='3')
        plt.plot(eve.m / ps.phys.M_sun,
                 np.log10(eve.rho),
                 ls='--',
                 label='u50fenv',
                 linewidth=2)
        plt.xlabel('M, [Msun]')
        plt.ylabel(r'$log_{10}(\rho)$')

        plt.legend(loc='best')
        plt.show()
示例#8
0
文件: eve.py 项目: baklanovp/pystella
def main():
    import os
    import sys
    from itertools import cycle

    def get(arr, i, default):
        if i < len(arr):
            if a[i] != '*':
                return a[i]
        return default

    parser = get_parser()
    args, unknownargs = parser.parse_known_args()
    eve_prev = None
    markersize = 6
    fig = None

    if args.path:
        pathDef = os.path.expanduser(args.path)
    else:
        pathDef = os.getcwd()

    # if args.elements:
    if '_' in args.elements:
        elements = list(sneve.eve_elements)
        excluded = args.elements.split(':')
        for e in excluded:
            if not e.startswith('_'):
                logger.error(
                    'For excluded mode all elements should be starts from _. Even element: '
                    + e)
                sys.exit(2)
            e = e[1:]
            if e not in sneve.eve_elements:
                logger.error('No such element: ' + e)
                sys.exit(2)
            elements.remove(e)
    else:
        elements = args.elements.split(':')
        for e in elements:
            if e not in sneve.eve_elements:
                logger.error('No such element: ' + e)
                sys.exit(2)

    # Set model names
    names = []
    if args.input:
        for nm in args.input:
            names.append(nm[0])  # remove extension
    else:
        if len(unknownargs) > 0:
            names.append(unknownargs[0])

    if len(names) == 0:
        # logger.error(" No data. Use key '-i' ")
        parser.print_help()
        sys.exit(2)

    if len(names) > 1:  # special case
        markers_cycler = cycle(markers_style)
        lines_cycler = cycle(lines_style)
    else:
        markers_cycler = cycle([None])
        lines_cycler = cycle(['-'])

    ax = None
    ax2 = None
    handles_nm = []
    for nm in names:
        # print("Run eve-model %s" % nm)
        path, fullname = os.path.split(nm)
        if len(path) == 0:
            path = pathDef
        # print("Run eve-model %s in %s" % (name, path))

        if fullname.endswith('hyd') or fullname.endswith('abn'):
            name = fullname.replace('.hyd', '')  # remove extension
            name = name.replace('.abn', '')  # remove extension
            try:
                # With header
                eve = sneve.load_hyd_abn(name=name,
                                         path=path,
                                         is_dm=False,
                                         is_dum=args.is_dum)
            except ValueError:
                # No header
                eve = sneve.load_hyd_abn(name=name,
                                         path=path,
                                         is_dm=False,
                                         is_dum=args.is_dum,
                                         skiprows=0)
        else:
            name = fullname.replace('.rho', '')  # remove extension
            rho_file = os.path.join(path, name + '.rho')
            eve = sneve.load_rho(rho_file)

        if args.reshape is not None:
            a = args.reshape.split(':')
            nz, axis, xmode = get(a, 0,
                                  eve.nzon), get(a, 1,
                                                 'M'), get(a, 2,
                                                           'resize')  # rlog
            start, end = get(a, 3, 0), get(a, 4, None)
            kind = get(a, 5, 'np')
            start = int(start)
            if end is None or end.upper() in 'NONE':
                end = None
            if end is not None:
                end = int(end)
            nz = int(nz)
            print(f'Resize: before Nzon={eve.nzon}')
            print(
                f'Resize parameters: nznew= {nz}  axis={axis}  xmode={xmode}  '
                f'start= {start}  end= {end} kind= {kind}')
            print("The element masses: before Resize")
            print_masses(eve)
            eve = eve.reshape(nz=nz,
                              axis=axis,
                              xmode=xmode,
                              start=start,
                              end=end,
                              kind=kind)
            eve.chem_norm()
            # eve = eve_resize
            print(f'Resize: after Nzon={eve.nzon}')
            print("The element masses: after Resize")
            print_masses(eve)

        # Boxcar
        if args.box is not None:
            is_info = False
            s = args.box.split(':')
            dm, n = float(s[0]), int(s[1])
            if len(s) == 3:
                is_info = bool(s[2])
            print(f'Running boxcar average: dm= {dm} Msun  Repeats= {n}')
            print("The element masses: Before boxcar")
            print_masses(eve)
            eve_box = eve.boxcar(box_dm=dm,
                                 n=n,
                                 el_included=elements,
                                 is_info=is_info)
            print("The element masses: After boxcar")
            print_masses(eve_box)
            eve, eve_prev = eve_box, eve

        # Smooth
        if args.smooth is not None:
            is_info = False
            s = args.smooth.split(':')
            window_length, polyorder = int(s[0]), int(s[1])
            mode = 'interp'
            if len(s) == 3:
                mode = s[2]
            if len(s) == 4:
                is_info = True
            print(
                f'Running Savitzky-Golay filter to Rho: '
                f'window_length= {window_length} Msun  polyorder= {polyorder} mode= {mode}'
            )
            print("The element masses: Before smoothing")
            print_masses(eve, is_el=is_info)
            eve_smooth = eve.smooth(window_length=window_length,
                                    polyorder=polyorder,
                                    mode=mode,
                                    is_info=is_info)
            print("The element masses: After smoothing")
            print_masses(eve_smooth, is_el=is_info)
            eve, eve_prev = eve_smooth, eve

        if args.write_to:
            fname = os.path.expanduser(args.write_to)
            # fname = os.path.join(path, name)
            # f = fname + '.eve.abn'
            fname = fname.replace('.rho', '')
            f = fname + '.abn'
            if eve.write_abn(f, is_header=True):
                print(" abn has been saved to {}".format(f))
            else:
                print("Error with abn saving to {}".format(f))
            # f = fname + '.eve.hyd'
            f = fname + '.hyd'
            if eve.write_hyd(f):
                print(" hyd has been saved to {}".format(f))
            else:
                print("Error with hyd saving to {}".format(f))

            continue

        marker = next(markers_cycler)
        ls = next(lines_cycler)

        if args.is_structure:
            fig = eve.plot_structure(elements=elements,
                                     title=name,
                                     ylimChem=(1e-8, 1.))
        else:
            if args.is_chem:
                # print "Plot eve-model %s" % name
                ax = eve.plot_chem(elements=elements,
                                   ax=ax,
                                   x=args.x,
                                   ylim=(1e-8, 1.),
                                   marker=marker,
                                   markersize=markersize,
                                   leg_loc='lower center')
                if eve_prev is not None:
                    eve_prev.plot_chem(elements=elements,
                                       ax=ax,
                                       x=args.x,
                                       ylim=(1e-8, 1.),
                                       marker=marker,
                                       markersize=max(1, markersize - 2),
                                       alpha=0.5,
                                       leg_loc='lower center')
                    # ax.set_title('{}: before boxcar'.format(eve_prev.Name))

            if args.rho:
                if args.is_chem:
                    if ax2 is None:
                        ax2 = ax.twinx()
                        ax2.set_ylabel(r'$\rho, [g/cm^3]$ ')
                else:
                    ax2 = ax
                ax2 = eve.plot_rho(x=args.x, ax=ax2, ls=ls, marker=marker)
                if eve_prev is not None:
                    eve_prev.plot_rho(x=args.x,
                                      ax=ax2,
                                      ls=ls,
                                      markersize=max(1, markersize - 2),
                                      alpha=0.5)
            else:
                ls = 'None'

            handle = mlines.Line2D([], [],
                                   color='black',
                                   marker=marker,
                                   markersize=markersize,
                                   label=name,
                                   linestyle=ls)
            handles_nm.append(handle)
            if len(names) > 1:
                if ax2 is None:
                    ax2 = ax.twinx()
                ax2.legend(handles=handles_nm,
                           loc=4,
                           fancybox=False,
                           frameon=False)

            if args.is_verb:
                m_tot = 0.
                m_ni56 = 0.
                print('{:22s}: '.format(eve.Name))
                for n, m in eve.mass_tot_el().items():
                    m_tot += m
                    print(f'{n} {m/phys.M_sun:.3e}')
                print('  m_tot= {:6.3f}    m_tot(El)= {:6.3f} '.format(
                    eve.m_tot / phys.M_sun, m_tot / phys.M_sun))

                # eve.chem_norm()

                # print('{:22s} after Norm '.format(eve.Name))
                # for n, m in eve.mass_tot_el().items():
                #     m_tot += m
                #     print(f'{n} {m/phys.M_sun:.3e}')
                # print('  m_tot= {:6.3f}    m_tot(El)= {:6.3f} '.format(eve.m_tot/phys.M_sun, m_tot/phys.M_sun))

    if not args.write_to:
        if args.save_plot:
            fsave = os.path.expanduser(args.save_plot)
            # if args.rho:
            #     fsave = os.path.join(os.path.expanduser('~/'), 'rho_%s.pdf' % names[0])
            # else:
            #     fsave = os.path.join(os.path.expanduser('~/'), 'chem_%s.pdf' % names[0])
            logger.info(" Save plot to %s " % fsave)
            if fig is None:
                fig = ax.get_figure()
            fig.savefig(fsave, bbox_inches='tight')
        else:
            plt.show()
示例#9
0
 def test_hyd_abn_load_H(self):
     name = 'm030307mhh'
     path = join(dirname(abspath(__file__)), 'data', 'stella')
     eve = sn_eve.load_hyd_abn(name, path=path)
     self.assertTrue(
         len(eve.el('H')) > 0, "abn-file have not been loaded: %s" % name)