Ejemplo n.º 1
0
def fve_gun(exp, nom, plt):
    from fit import Opt
    from gun import magic
    from gun import Gun
    
    fig = plt.figure('fve_gun',figsize=fig_y_size(9))    
    p2f = magic.newton2dyne*magic.area/1e11
    opt = Opt(
        nom.eos,
        {'gun':nom.gun,'stick':nom.stick},
        {'gun':exp.vt,'stick':exp.stick_data})
    cs,costs = opt.fit(max_iter=5)
    print('costs={0}'.format(costs))
    opt_gun = Gun(opt.eos)
    nom.gun.eos = nom.eos # Restore nominal eos after optimization
    t2vs = [Gun(eos).fit_t2v() for eos in [opt.eos.new_c(c) for c in cs]]
    e = [exp.v - t2v(exp.t) for t2v in t2vs[1:]]

    data = {'nominal':(
        (exp.x, nom.eos(exp.x)*p2f, 'f'),
        (exp.x, nom.gun.x_dot(exp.x)/magic.cm2km, 'v'))}
    data['experimental']=(
        (exp.x, exp.eos(exp.x)*p2f, 'f'),
        (exp.x, exp.gun.x_dot(exp.x)/magic.cm2km, 'v'))
    data['fit']=(
        (exp.x, opt.eos(exp.x)*p2f, 'f'),
        (exp.x, opt_gun.x_dot(exp.x)/magic.cm2km, 'v'))
    
    cm = r'$x/(\rm{cm})$'
    mu_sec = r'$t/(\mu\rm{sec})$'
    f_key = r'$f/({\rm dyn}\cdot 10^{11})$'
    v_key = r'$v/(\rm{km/s})$'
    e_key = r'$\epsilon_k/(\rm{m/s})$'
    ax_d = {
        'f':{'ax':fig.add_subplot(3,1,1), 'l_x':cm,
             'l_y':f_key, 'loc':'upper right'},
        'v':{'ax':fig.add_subplot(3,1,2), 'l_x':cm,
            'l_y':v_key, 'loc':'lower right'},
        'e':{'ax':fig.add_subplot(3,1,3), 'l_x':mu_sec,
             'l_y':e_key, 'loc':'upper right'}
    }
    for mod,xyn in data.items():
        for x,y,name in xyn:
            if mod == 'experimental':
                ax_d[name]['ax'].plot(x,y,'r-.',label=r'$\rm %s$'%mod)
            else:
                ax_d[name]['ax'].plot(x,y,label=r'$\rm %s$'%mod)
    for i in range(len(e)):
        ax_d['e']['ax'].plot(exp.t*1e6,e[i]/100,label=r'$\epsilon_%d$'%(i+1))
    for name,d in ax_d.items():
        d['ax'].legend(loc=ax_d[name]['loc'])
        d['ax'].set_xlabel(d['l_x'])
        d['ax'].set_ylabel(r'$%s$'%name)
        if 'l_y' in d:
            d['ax'].set_ylabel(d['l_y'])
    
    return fig