Example #1
0
def ex_01(fns=[
    'powder_collection_25JUL12/25JUL12_0002Data1Phi-90.txt',
    'powder_collection_25JUL12/25JUL12_0002Data2Phi0.txt',
    'powder_collection_25JUL12/25JUL12_0002Data3Phi45.txt',
    'powder_collection_25JUL12/25JUL12_0002Data4Phi135.txt'
]):
    from MP.lib.mpl_lib import wide_fig as wf
    from MP.lib.mpl_lib import fancy_legend
    from MP.lib.axes_label import __deco__ as deco

    fig = wf(nh=1, nw=1, uw=4, left=0.2)
    ax = fig.axes[0]
    ehkl_dat = []
    for i in xrange(len(fns)):
        sign_sin2psi, ehkl, dspacing, psi = read(fns[i], iopt=0, isort=True)
        ax.plot(sign_sin2psi,
                ehkl,
                '-x',
                label=fns[i].split('Phi')[1].split('.')[0])
        ehkl_dat.append(ehkl)

    print 'mean:', np.array(ehkl_dat).mean()
    print 'std:', np.array(ehkl_dat).std()
    deco(iopt=0, ft=15, ax=ax, ipsi_opt=1)
    fancy_legend(ax=ax, size=10, ncol=2)
Example #2
0
def ex_01(fns=[
        'powder_collection_25JUL12/25JUL12_0002Data1Phi-90.txt',
        'powder_collection_25JUL12/25JUL12_0002Data2Phi0.txt',
        'powder_collection_25JUL12/25JUL12_0002Data3Phi45.txt',
        'powder_collection_25JUL12/25JUL12_0002Data4Phi135.txt']):
    from MP.lib.mpl_lib import wide_fig as wf
    from MP.lib.mpl_lib import fancy_legend
    from MP.lib.axes_label import __deco__ as deco

    fig = wf(nh=1,nw=1,uw=4,left=0.2); ax=fig.axes[0]
    ehkl_dat = []
    for i in range(len(fns)):
        sign_sin2psi,ehkl,dspacing,psi = read(fns[i],iopt=0,isort=True)
        ax.plot(sign_sin2psi,ehkl,'-x',label=fns[i].split('Phi')[1].split('.')[0])
        ehkl_dat.append(ehkl)


    print 'mean:', np.array(ehkl_dat).mean()
    print 'std:', np.array(ehkl_dat).std()
    deco(iopt=0,ft=15,ax=ax,ipsi_opt=1)
    fancy_legend(ax=ax,size=10,ncol=2)
Example #3
0
def ex_igb(fn='igstrain_fbulk_ph1.out',ifig=2,iphi=0,isf=0,
           mxnst=None,flow=None):
    """
    Read ig strain file and analyze... (igstrain_fbulk_ph1.out)

    igstrain_fbulk_ph1.out contains diffraction for each and every
    reloading from 'unloaded' polycrystal.

    Arguments
    =========
    fn = 'igstrain_fbulk_ph1.out'
    ifig = 2
    iphi=0
    isf=0
    mxnst=None
    """
    import matplotlib.pyplot as plt
    from sff_converter import condition
    from MP.ssort import sh as sort
    from MP.mat import voigt
    from MP.lib.mpl_lib import wide_fig as wf

    difl, nphi, phis, nbeta, dum1, dum2 = condition(fn=None)

    if flow==None: raise IOError, 'Flow stress is missing'
    eps = flow.epsilon_vm[::]
    neps = flow.nstp

    nw = 4
    remainder = np.mod(neps,nw)
    if remainder==0:
        nh = neps/nw
    elif remainder>0:
        nh = neps/nw + 1

    fig  =wf(nw=2, nh=2,ifig=ifig,iarange=True);  axes  =fig.axes
    ax01, ax02, ax03, ax04 = axes
    fig01=wf(nw=nw,nh=nh,ifig=ifig+1,iarange=True,nfig=neps);axes01=fig01.axes
    fig02=wf(nw=nw,nh=nh,ifig=ifig+2,iarange=True,nfig=neps);axes02=fig02.axes
    fig03=wf(nw=nw,nh=nh,ifig=ifig+3,iarange=True,nfig=neps);axes03=fig03.axes
    fig04=wf(nw=nw,nh=nh,ifig=ifig+4,iarange=True,nfig=neps);axes04=fig04.axes

    tdat, usf = reader2(fn,iopt=1)
    print tdat.shape
    nsf = len(usf); nst = len(tdat[0]); npsi = len(tdat[0,0,0,0,:])
    if nst!=neps: raise IOError, 'Inconsistency between neps and nst'
    markers = ['o','x','+','^','d','*','o','x','+','^','d','*''o','x','+','^','d','*']
    colors  = ['r','g','b','k','m','y','r','g','b','k','m','y','r','g','b','k','m','y']
    from string import ascii_lowercase as alphabet
    axe_lab=[]
    for ab in alphabet: axe_lab.append('(%s)'%ab)
    yl = 0; yh = 0
    avg = np.zeros((2,nst,npsi)) #
    sft  = np.zeros((6,nst,npsi)) # f^{hkl}
    rsqt = np.zeros((6,nst,npsi)) # f^{hkl}

    if mxnst!=None: nst=mxnst
    for i in range(nst):
        ehkl  = tdat[0,i,isf,iphi,:] # e(hkl,phi,psi)
        e     = tdat[1,i,isf,iphi,:] # macro
        ehkle = tdat[2,i,isf,iphi,:] # e - macro
        fhkl  = tdat[3,i,isf,iphi,:] # Fhkl
        fbulk = tdat[4,i,isf,iphi,:] # Fbulk
        ige   = tdat[5,i,isf,iphi,:] # e - F_ij *Sij
        sij   = tdat[6,i,isf,iphi,:] # Sij
        psi   = tdat[8,i,isf,iphi,:]
        rsq   = tdat[9,i,isf,iphi,:]
        sin2psi = np.sin(psi*np.pi/180.)**2
        axes01[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        axes02[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        axes03[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        axes04[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        igys = []; igos = []; igts = []
        for j in range(nsf): ## Number of elastic loading for stress factor calc.
            ehkl_ = tdat[0,i,j,iphi,:] # e(hkl,phi,psi)
            e_    = tdat[1,i,j,iphi,:] # macro
            fhkl_ = tdat[3,i,j,iphi,:] # Fhkl
            fbulk_= tdat[4,i,j,iphi,:] # Fbulk
            sij_  = tdat[6,i,j,iphi,:] # Sij
            rsq_  = tdat[6,i,j,iphi,:] # R^2

            sft[j,i,:]  = fhkl_[::] #
            rsqt[j,i,:] = rsq_[::]

            i1,i2 = usf[j]
            igo = ehkl_ - e_ ## old way
            igt = []
            m = 0
            for k in range(len(fbulk_)):
                if fbulk_[k]==0:
                    m=m+1
                    igt.append(0.)
                else: igt.append(
                        ehkl_[k] - \
                        fhkl_[k] / fbulk_[k] * e_[k])

            if m!=0: print m, 'case of fbulk'+\
               '(phi,psi)=0 happened'

            igt = np.array(igt)
            igy = ehkl_ - fhkl_ * sij_ ## new way (YJ)
            if j==0:
                igy_avg = igy/nsf
                igo_avg = igo/nsf
                igt_avg = igt/nsf
            else:
                igy_avg = igy_avg + igy/nsf
                igo_avg = igo_avg + igo/nsf
                igt_avg = igt_avg + igt/nsf
            igys.append(igy);igos.append(igo);igts.append(igt)

            # The old method
            if j==4: m = markers[j]
            else: m= '--'
            y = igo
            x = np.sin(psi[:]*np.pi/180.)**2
            newx,newy = sort(x,y) # shell sort
            axes01[i].plot(
                newx,newy*1e6,m,color=colors[j],
                label=r'$\Sigma_{%1i%1i}$'%(i1,i2))
            if i==0:axes01[i].legend(loc='best',
                fancybox=True).get_frame().set_alpha(0.5)
            if j==0:axes01[i].grid('on')
            yl0, yh0 = axes01[i].get_ylim()
            if yl0<yl: yl = yl0
            if yh0>yh: yh = yh0

            # GHT
            y = igt
            x = np.sin(psi[:]*np.pi/180.)**2
            newx,newy = sort(x,y) # shell sort
            axes02[i].plot(
                newx,newy*1e6,m,color=colors[j],
                label=r'$\Sigma_{%1i%1i}$'%(i1,i2))
            if i==0:axes02[i].legend(loc='best',
                fancybox=True).get_frame().set_alpha(0.5)
            if j==0:axes02[i].grid('on')
            yl0, yh0 = axes02[i].get_ylim()
            if yl0<yl: yl = yl0
            if yh0>yh: yh = yh0

            # YJ
            y = igy
            x = np.sin(psi[:]*np.pi/180.)**2
            newx,newy = sort(x,y) # shell sort
            axes03[i].plot(
                newx,newy*1e6,m,color=colors[j],
                label=r'$\Sigma_{%1i%1i}$'%(i1,i2))
            if i==0:axes03[i].legend(loc='best',
                fancybox=True).get_frame().set_alpha(0.5)
            if j==0:axes03[i].grid('on')
            yl0, yh0 = axes03[i].get_ylim()
            if yl0<yl: yl = yl0
            if yh0>yh: yh = yh0

            pass # over nsf

        # errors for 6 cases of SF loading
        igos = np.array(igos).swapaxes(0,1)
        igys = np.array(igys).swapaxes(0,1)
        igts = np.array(igts).swapaxes(0,1)
        igoe=[]; igye=[]; igte=[]
        for m in range(len(igo_avg)):
            igoe.append(igos[m].std())
            igte.append(igts[m].std())
            igye.append(igys[m].std())
        igoe,igte,igye = np.array(igoe),np.array(igte),np.array(igye)
        ##

        # average old
        y = igo_avg
        ye= igoe
        x = np.sin(psi[:]*np.pi/180.)**2
        newx, newy, newye = sort(x,y,ye)
        axes04[i].errorbar(
            x=newx,y=newy*1e6,yerr=newye*1e6,
            ls='-',color='r',label='old')

        # average YU
        y  = igy_avg
        avg[0,i,:] = psi[:]; avg[1,i,:] = y[:]

        ye = igye
        x  = np.sin(psi[:]*np.pi/180.)**2

        newx, newy, newye = sort(x,y,ye)

        axes04[i].errorbar(
            x=newx,y=newy*1e6,yerr=newye*1e6,
            ls='-',ms=3,color='b',label='YJ')
        axes04[i].grid('on')
        axes04[0].legend(loc='best',fancybox=True)\
            .get_frame().set_alpha(0.5)

        i1,i2 = voigt.ijv[:,isf]
        sin2psi = np.sin(psi*np.pi/180.)**2

        ax01.plot(sin2psi,ige*1e6,markers[i]#,color='k',
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        ax02.plot(sin2psi,ehkle*1e6,markers[i]#,color='k'
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        l, = ax04.plot(sin2psi,fhkl*1e6,markers[i]#,color='k'
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        if i==0: ax04.plot(sin2psi,fbulk*1e6,'-',alpha=0.2,color='k')
        # ax03.plot(sin2psi,e*1e6,markers[i],
        #           label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        ax03.plot(sin2psi,(ehkl-fhkl/fbulk*e)*1e6,markers[i]
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        sin2psi = np.sin(psi*np.pi/180.)**2

    ## Deco the axes
    for i in range(nst):
        axes01[i].set_ylim(yl,yh)
        axes02[i].set_ylim(yl,yh)
        axes03[i].set_ylim(yl,yh)
        #axes04[i].set_ylim(yl,yh)
        axes01[i].set_xlim(0.,); axes02[i].set_xlim(0.,)
        axes03[i].set_xlim(0.,); axes04[i].set_xlim(0.,)
    for i in range(len(axes)):
        axes[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes01[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes02[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes03[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes04[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
    for i in range(len(axes)): axes[i].grid('on')
    for i in range(len(axes)): axes[i].set_xlim(0.,0.5)
    ax01.set_ylabel(
        r'$\varepsilon^{hkl} - F^{hkl}_{ij}\bar{\Sigma}_{ij}$'+\
        r'  $[\mu\varepsilon]$',dict(fontsize=15))
    ax02.set_ylabel(
        r'$\varepsilon^{hkl} - E$  $[\mu\varepsilon]$',dict(fontsize=15))
    ax03.set_ylabel(r'$\varepsilon^{hkl} - $'+
        r'$F_{ij}^{hkl}/F^{\mathrm{bulk}}_{ij}$'+
        r'$ \bar{E} $  $[\mu \varepsilon]$',dict(fontsize=15))
    ax04.set_ylabel(r'$F_{ij}^{hkl}, F^{\mathrm{bulk}}_{ij}$  $[TPa^{-1}]$',
        dict(fontsize=15))
    ax01.set_title(r'(a) $\varepsilon(hkl,%3.0f^\circ,\psi)$'\
        r'$ - F_{%1i%1i}(hkl,%3.0f^\circ,\psi)$'\
        r'$\bar{\Sigma}_{%1i%1i}$'%(phis[iphi],i1,i2,phis[iphi],i1,i2),
        dict(fontsize=13))
    ax02.set_title(
        r'(b) $\varepsilon(hkl,%3.0f^\circ,\psi)$'%(phis[iphi])+\
            r'$ - \bar{E}(%3.0f^\circ,\psi)$'%\
            (phis[iphi]),dict(fontsize=13))
    ax03.set_title(
        r'(c) $\varepsilon(hkl,%3.0f^\circ,\psi)$'%(phis[iphi])+
        r'$-F_{%1i%1i}(hkl,%3.0f^\circ,\psi)/$'%(i1,i2,phis[iphi])+
        r'$F_{%1i%1i}^{\mathrm{bulk}}(%3.0f^\circ,\psi)$'%(
            i1,i2,phis[iphi])+
        r'$\bar{E}(%3.0f^\circ,\psi)$'%(phis[iphi]),dict(fontsize=13))
    ax04.set_title(r'(d) $F^{hkl}_{%1i%1i}$ and '%(i1,i2)+\
                       r'$F^{\mathrm{bulk}}_{%1i%1i}$'%
                   (i1,i2), dict(fontsize=13))
    ax04.legend(loc='lower right',fancybox=True).get_frame().set_alpha(0.5)
    # fig.tight_layout(); fig01.tight_layout(); fig02.tight_layout()
    # fig03.tight_layout(); fig04.tight_layout()
    fig.savefig('ig_bulk.pdf');fig01.savefig('ig_bulk_Old.pdf')
    fig02.savefig('ig_bulk_GHT.pdf'); fig03.savefig('ig_bulk_YJ.pdf')
    fig04.savefig('ig_bulk_avg.pdf')
    ## save the averaged IG strain

    return avg, sft # avg[2,nst,npsi], sft[6,nst,npsi]
Example #4
0
def main_disc(fn='BB/2011NOV10/node_disc_36.csv',
              dist_bb=[10],
              dist_rb=[5],
              fang=90.,
              ixy_flip=False,
              ioff=True,
              ntot_col=14,
              fig=None,
              fout=None):
    """
    fn       = file name: " /dum/[strainpath]/[date].csv "
    dist     = distances from the critical point
    fang     = fracture angle
    ixy_flip = flag if x-y cooridnate should be switched
    ioff     = interactive mode switch for MPL
    ntot_col = total number of column belonging to a dat block

    ## below is the column information for a block
    icol:     0 1 2 3   4   5   6  7  8  9      10     11     12
    variable: x,y,z,exx,eyy,exy,e1,e2,vm,exxdot,eyydot,exydot,e33
    """
    import os
    from MP.lib.axes_label import __deco_fld__ as deco_fld
    import matplotlib.pyplot as plt
    from MP.lib.mpl_lib import wide_fig as wf
    from MP.lib.mpl_lib import rm_all_lab as ral
    from matplotlib.backends.backend_pdf import PdfPages
    from readers import read_disc

    ## output file name
    strain_path = fn.split(os.sep)[1]
    date = fn.split(os.sep)[2].split('.')[0]
    fn_out = '%s_%s' % (strain_path, date)

    pdf_all = PdfPages('%s.pdf' % fn_out)

    ## MPL interactive mode switch
    if ioff: plt.ioff()
    else: plt.ion()

    ## Read data from VIC-3d software
    dat = read_disc(fn=fn, ndat_col=ntot_col, ixy_flip=ixy_flip)

    ## through thickness strain rate minimum
    fig1 = wf(nw=1,
              nh=1,
              w0=0.0,
              ws=1.0,
              w1=0.0,
              h0=0.0,
              hs=1.0,
              h1=0.0,
              uw=2.3,
              uh=2.3,
              left=0.2,
              up=0.1,
              down=0.2,
              iarange=True)

    n_image = 15  ## last n-th image
    ## from which maximum reference is taken
    ax = fig1.axes[0]
    fig2, fig3, mdat, c = plot_xy_disc_e33dot(dat,
                                              istp=-n_image - 1,
                                              icol=12,
                                              ax=ax,
                                              fang=fang,
                                              dist_bb=dist_bb,
                                              dist_rb=dist_rb)
    ax.set_xlim(-40, 40)
    ax.set_ylim(-40, 40)
    ax.set_aspect('equal')
    ral(fig1.axes)

    col = ['path', 'date', 'dist [mm]', 'Exx', 'Eyy', 'Std1', 'Std2', 'color']
    row = ['%9s', '%9s', '%9i', '%9.3f', '%9.3f', '%9.3f', '%9.3f', '%9s']
    header = ''
    fmt = ''
    for i in range(len(col)):
        header = '%s %s' % (header, '%9s' % col[i])
        fmt = '%s %s' % (fmt, row[i])
    print header
    if fout != None: fout.write(header + '\n')

    db = np.array(dist_bb)
    dum = (db[::-1]).tolist() + [0]

    ndat = mdat.shape[-1]
    for i in range(ndat):
        dat = mdat[:, :, i]
        ex = dat[0, 0]
        ey = dat[0, 1]
        exe = dat[1, 0]
        eye = dat[1, 1]
        fig.axes[0].errorbar(ey, ex, xerr=eye, yerr=exe, fmt='.', color=c[i])
        line = fmt % (strain_path, date, dum[i], ex, ey, exe, eye, c[i])
        print line
        if fout != None:
            fout.write(line + '\n')

    pdf_all.savefig(fig1)
    # pdf_all.savefig(fig2)
    pdf_all.savefig(fig3)
    pdf_all.close()
    deco_fld(ax=fig.axes[0], iopt=2, ft=15, iasp=True)
    ## if ioff: plt.close('all')

    return fig1, fig2, fig3
Example #5
0
def ex02(
        ## non-smooth
        fns=[  #'Bsteel_non_smooth/BB/2011NOV10.csv',
            'Bsteel_non_smooth/BB/2012JUL11.csv',
            #'Bsteel_non_smooth/PSRD/2011NOV17.csv',
            'Bsteel_non_smooth/PSRD/2012JUL12.csv',
            'Bsteel_non_smooth/PSRD/2012JUL13.csv',
            #'Bsteel_non_smooth/PSTD/2011NOV17.csv',
            'Bsteel_non_smooth/PSTD/2012JUL17.csv'
        ],
        fangs=[  #90,
            90,
            #0,
            90,
            90,
            #90,
            0
        ],
        dist_bb=[2, 4, 6],
        dist_rb=[2, 3, 4, 5, 6, 7, 8],

        ## dist=[5,10,15,20],
        ixy_flip=[  #False,
            False,
            #False,
            True,
            True,
            #False,
            False
        ],
        ntot_col=[  #14,
            14,
            #14,
            14,
            14,
            #14,
            14
        ],
        ioff=True):

    from MP.lib.mpl_lib import wide_fig as wf
    import matplotlib.pyplot as plt
    from MP.lib.axes_label import __deco_fld__ as deco_fld

    fn = open('EXP_FLD.txt', 'w')

    fig4 = wf(nw=1, nh=1)

    for i in range(len(fns)):
        #try:
        ## print fns[i]
        fig1, fig2, fig3 = main_disc(fn=fns[i],
                                     dist_bb=dist_bb,
                                     dist_rb=dist_rb,
                                     fang=fangs[i],
                                     ixy_flip=ixy_flip[i],
                                     ntot_col=ntot_col[i],
                                     ioff=ioff,
                                     fig=fig4,
                                     fout=fn)
        # except ValueError:
        #     print 'error occured in %s'%fns[i]
    print 'Analysis results have been saved to %s' % fn.name
    fn.close()
    fig4.savefig('EXP_FLD.pdf')
    plt.close('all')
Example #6
0
def plot_xy_disc_e33dot(
        dat,
        istp=-1,
        ax=None,
        icol=11,
        fang=90,
        dist_bb=[5, 10],  ## backbone
        dist_rb=[1, 5]):
    """
    Extract DIC data from 'disc' area
    """
    from MP.lib.mpl_lib import wide_fig as wf
    from MP.lib.mpl_lib import rm_all_lab as ral
    import matplotlib as mpl
    from MP.lib import mpl_lib
    from MP import ssort

    sort = ssort.shellSort
    d = dat[istp, :, :]
    dz = np.log10(abs(d[:, icol]))
    for i in range(len(dz)):
        if dz[i] == np.inf or dz[i] == -np.inf:
            dz[i] = np.nan
    mn = min(dz)
    mx = max(dz)
    norm = mpl.colors.Normalize(vmin=mn, vmax=mx)
    cmap, m = mpl_lib.norm_cmap(mn=mn, mx=mx, cm_name='brg')
    n = d.shape[0]

    ## find values in the back-bone branch shape
    ids = []
    xs = []
    ys = []
    zs = []
    for i in range(n):
        x, y, z = d[i, 0], d[i, 1], -d[i, icol]
        if np.isnan(z): pass
        else:
            zs.append(d[i, icol])
            ids.append(i)
            xs.append(d[i, 0])
            ys.append(d[i, 1])
        c = m.to_rgba(np.log10(z))
        ax.plot(x, y, 'o', ms=1.5, color=c, mfc=c, mec='None')

    val, ind = sort(zs)
    imn = ids[ind[0]]
    ax.plot(d[imn, 0], d[imn, 1], 'g.')  ## minimum

    ## draw a backbone grid
    x0, y0 = d[imn, 0], d[imn, 1]  # center of backbone

    db = np.array(dist_bb)
    dr = np.array(dist_rb)
    DB = []
    DR = []
    for i in range(len(db)):
        DB.append(-db[-i - 1])
    DB.append(0)
    for i in range(len(db)):
        DB.append(db[i])
    for i in range(len(dr)):
        DR.append(-dr[-i - 1])
    DR.append(0)
    for i in range(len(dr)):
        DR.append(dr[i])

    db = DB[::]
    dr = DR[::]
    xy_db_dr = np.zeros((len(db), len(dr), 2))
    for i in range(len(db)):
        for j in range(len(dr)):
            xy_db_dr[i, j, :] = db[i], dr[j]

    ## rotate xy by fang
    for i in range(len(db)):
        for j in range(len(dr)):
            y, x = xy_db_dr[i, j, :]
            xy_db_dr[i, j, :] = rot_xy([x, y], fang)

    ## translate
    xy_db_dr[:, :, 0] = xy_db_dr[:, :, 0] + x0
    xy_db_dr[:, :, 1] = xy_db_dr[:, :, 1] + y0

    ## print xy_db_dr.shape
    ## return xy_db_dr

    if len(db) > 3:
        nw = len(db) / 3
        nh = 4

    fig = wf(nw=nw,
             nh=nh,
             w0=0.0,
             ws=1.0,
             w1=0.0,
             h0=0.0,
             hs=1.0,
             h1=0.0,
             uw=2.3,
             uh=2.3,
             left=0.2,
             up=0.1,
             down=0.2,
             iarange=True)
    fig1 = wf(nw=2,
              nh=2,
              w0=0.1,
              ws=0.7,
              w1=0.2,
              h0=0.1,
              hs=0.7,
              h1=0.2,
              uw=2.3,
              uh=2.3,
              left=0.2,
              up=0.1,
              down=0.2,
              iarange=True)
    iax = 0
    sym = [
        'k^', 'k+', 'kd', 'kx', 'k<', 'k>', 'k*', 'k1', 'k2', 'k3', 'k4', 'k8',
        'ks', 'kp', 'kh', 'kH', 'kD'
    ]

    ## thickness strain rate
    epst_dot_av = []
    epst_dot_std = []
    ## epsxx
    exx_av = []
    exx_std = []
    ## epsyy
    eyy_av = []
    eyy_std = []
    for i in range(len(db)):
        indices_along_ribs = []
        for j in range(len(dr)):
            x, y = xy_db_dr[i, j, :]
            ind = find_nearest([x, y], xs, ys, err=2)
            if not (np.isnan(ind)):
                indices_along_ribs.append(ids[ind])

        epsx = []
        epsy = []
        epst_dot = []
        coord = []
        for k in range(len(indices_along_ribs)):
            indx = indices_along_ribs[k]
            x = d[indx, 0]
            y = d[indx, 1]
            coord.append([x, y])
            ## ax.plot(x,y,sym[i],ms=3)
            ex = dat[:, indx, 3]
            ey = dat[:, indx, 4]

            et = dat[:, indx, 12]

            ex_d = dat[:, indx, 9]
            ey_d = dat[:, indx, 10]
            ez_d = ex_d + ey_d  ## positive value
            epst_dot.append(ez_d)
            epsx.append(ex)
            epsy.append(ey)

            fig.axes[iax].plot(ez_d)

        iax = iax + 1
        x, y = np.array(coord).T[:]
        ax.plot(x, y, '-', color='k', alpha=0.5)

        epst_dot = np.array(epst_dot).T
        epsx = np.array(epsx).T
        epsy = np.array(epsy).T

        D = []
        D_e = []
        E_ex = []
        E_exe = []
        E_ey = []
        E_eye = []
        for j in range(len(epst_dot)):  ## number of ribs
            D.append(np.mean(epst_dot[j]))
            D_e.append(np.std(epst_dot[j]))
            E_ex.append(np.mean(epsx[j]))
            E_exe.append(np.std(epsx[j]))
            E_ey.append(np.mean(epsy[j]))
            E_eye.append(np.std(epsy[j]))

    ## fig1.axes[0].plot(D,label=db[i])
        epst_dot_av.append(D)
        epst_dot_std.append(D_e)
        exx_av.append(E_ex)
        exx_std.append(E_exe)
        eyy_av.append(E_ey)
        eyy_std.append(E_eye)

    ## find maximum D value's index to trim the data
    ndat = (len(epst_dot_av) - 1) / 2 + 1
    ref = epst_dot_av[ndat - 1]  ## data at necking center spot
    _ref_ = []
    _ind_ = []
    for i in range(len(ref)):
        if not (np.isnan(ref[i])):
            _ref_.append(ref[i])
            _ind_.append(i)
    _val_, _i_ = sort(_ref_)
    ix = _ind_[_i_[-1]]

    mdat = np.zeros((2, 2, ndat))
    c = []

    for i in range(ndat):
        i0 = i
        i1 = -i - 1
        ## thickness strain rate
        d1 = epst_dot_av[i0]
        d2 = epst_dot_av[i1]
        e1 = epst_dot_std[i0]
        e2 = epst_dot_std[i1]
        d = []
        e = []

        ## epsilon xx
        ex1 = exx_av[i0]
        ex2 = exx_av[i1]
        exe1 = exx_std[i0]
        exe2 = exx_std[i1]
        ex = []
        exe = []

        ## epsilon yy
        ey1 = eyy_av[i0]
        ey2 = eyy_av[i1]
        eye1 = eyy_std[i0]
        eye2 = eyy_std[i1]
        ey = []
        eye = []

        for j in range(len(d1)):  # along the time axis
            d.append((d1[j] + d2[j]) / 2.)
            e.append((e1[j] + e2[j]) / 2.)
            ex.append((ex1[j] + ex2[j]) / 2.)
            exe.append((exe1[j] + exe2[j]) / 2.)
            ey.append((ey1[j] + ey2[j]) / 2.)
            eye.append((eye1[j] + eye2[j]) / 2.)

        xind = np.arange(len(d)) + 1
        p = 0.7
        i0 = int(float(len(xind)) * p)
        ## find maximum value and index?
        l, = fig1.axes[0].plot(xind, d, '-', label=abs(db[-i - 1]))
        fig1.axes[1].plot(xind[i0:ix + 1], d[i0:ix + 1], '+')
        fig1.axes[2].errorbar(xind[i0:ix + 1],
                              d[i0:ix + 1],
                              yerr=e1[i0:ix + 1],
                              fmt='+')

        l, = fig1.axes[3].plot(ex[i0:ix + 1], ey[i0:ix + 1])
        fig1.axes[3].errorbar(ex[ix],
                              ey[ix],
                              color=l.get_color(),
                              xerr=exe[ix],
                              yerr=eye[ix])

        mdat[0, 0, i] = ex[ix]
        mdat[0, 1, i] = ey[ix]
        mdat[1, 0, i] = exe[ix]
        mdat[1, 1, i] = eye[ix]
        c.append(l.get_color())

    ## deco
    from MP.lib.mpl_lib import tune_xy_lim
    tune_xy_lim(fig.axes)
    fig1.axes[2].set_yscale('log')
    fig1.axes[2].set_ylim(1e-3)
    fig1.axes[0].legend(loc='best',ncol=2,fontsize=5).\
        get_frame().set_alpha(0.5)
    return fig, fig1, mdat, c
Example #7
0
def main_disc(fn='BB/2011NOV10/node_disc_36.csv',
              dist_bb=[10],
              dist_rb=[5],
              fang=90.,ixy_flip=False,ioff=True,
              ntot_col=14,
              fig=None,
              fout=None):
    """
    fn       = file name: " /dum/[strainpath]/[date].csv "
    dist     = distances from the critical point
    fang     = fracture angle
    ixy_flip = flag if x-y cooridnate should be switched
    ioff     = interactive mode switch for MPL
    ntot_col = total number of column belonging to a dat block

    ## below is the column information for a block
    icol:     0 1 2 3   4   5   6  7  8  9      10     11     12
    variable: x,y,z,exx,eyy,exy,e1,e2,vm,exxdot,eyydot,exydot,e33
    """
    import os
    from MP.lib.axes_label import __deco_fld__ as deco_fld
    import matplotlib.pyplot as plt
    from MP.lib.mpl_lib import wide_fig as wf
    from MP.lib.mpl_lib import rm_all_lab as ral
    from matplotlib.backends.backend_pdf import PdfPages
    from readers import read_disc

    ## output file name
    strain_path = fn.split(os.sep)[1]
    date = fn.split(os.sep)[2].split('.')[0]
    fn_out = '%s_%s'%(strain_path,date)

    pdf_all = PdfPages('%s.pdf'%fn_out)

    ## MPL interactive mode switch
    if ioff: plt.ioff()
    else: plt.ion()

    ## Read data from VIC-3d software
    dat=read_disc(fn=fn,ndat_col=ntot_col,
                  ixy_flip=ixy_flip)

    ## through thickness strain rate minimum
    fig1=wf(nw=1,nh=1,w0=0.0,ws=1.0,w1=0.0,
           h0=0.0,hs=1.0,h1=0.0,uw=2.3,uh=2.3,
           left=0.2,up=0.1,down=0.2,iarange=True)

    n_image=15 ## last n-th image
               ## from which maximum reference is taken
    ax=fig1.axes[0]
    fig2,fig3,mdat,c=plot_xy_disc_e33dot(
        dat,istp=-n_image-1,icol=12,
        ax=ax,fang=fang,dist_bb=dist_bb,
        dist_rb=dist_rb)
    ax.set_xlim(-40,40);ax.set_ylim(-40,40)
    ax.set_aspect('equal')
    ral(fig1.axes)

    col=['path','date','dist [mm]','Exx','Eyy','Std1','Std2','color']
    row=['%9s','%9s','%9i','%9.3f','%9.3f','%9.3f','%9.3f','%9s']
    header =''
    fmt    =''
    for i in range(len(col)):
        header='%s %s'%(header,'%9s'%col[i])
        fmt   ='%s %s'%(fmt,row[i])
    print header
    if fout!=None: fout.write(header+'\n')

    db=np.array(dist_bb)
    dum = (db[::-1]).tolist()+[0]

    ndat = mdat.shape[-1]
    for i in range(ndat):
        dat = mdat[:,:,i]
        ex = dat[0,0]
        ey = dat[0,1]
        exe= dat[1,0]
        eye= dat[1,1]
        fig.axes[0].errorbar(ey,ex,xerr=eye,yerr=exe,fmt='.',
                             color=c[i])
        line= fmt%(strain_path,date,dum[i],ex,ey,exe,eye,c[i])
        print line
        if fout!=None:
            fout.write(line + '\n')

    pdf_all.savefig(fig1)
    # pdf_all.savefig(fig2)
    pdf_all.savefig(fig3)
    pdf_all.close()
    deco_fld(ax=fig.axes[0],iopt=2,ft=15,iasp=True)
    ## if ioff: plt.close('all')

    return fig1, fig2, fig3
Example #8
0
def ex02(
        ## non-smooth
        fns=[#'Bsteel_non_smooth/BB/2011NOV10.csv',
             'Bsteel_non_smooth/BB/2012JUL11.csv',
            #'Bsteel_non_smooth/PSRD/2011NOV17.csv',
             'Bsteel_non_smooth/PSRD/2012JUL12.csv',
             'Bsteel_non_smooth/PSRD/2012JUL13.csv',
            #'Bsteel_non_smooth/PSTD/2011NOV17.csv',
             'Bsteel_non_smooth/PSTD/2012JUL17.csv'],
        fangs=[#90,
               90,
            #0,
               90,
               90,
            #90,
               0],
        dist_bb=[2,4,6],
        dist_rb=[2,3,4,5,6,7,8],

        ## dist=[5,10,15,20],
        ixy_flip=[#False,
                  False,
            #False,
            True,
            True,
            #False,
            False],
        ntot_col=[#14,
                  14,
            #14,
                  14,
                  14,
            #14,
                  14],
        ioff=True):

    from MP.lib.mpl_lib import wide_fig as wf
    import matplotlib.pyplot as plt
    from MP.lib.axes_label import __deco_fld__ as deco_fld

    fn = open('EXP_FLD.txt','w')

    fig4=wf(nw=1,nh=1)

    for i in range(len(fns)):
        #try:
            ## print fns[i]
        fig1, fig2, fig3 = main_disc(
            fn=fns[i],
            dist_bb=dist_bb,
            dist_rb=dist_rb,
            fang=fangs[i],
            ixy_flip=ixy_flip[i],
            ntot_col=ntot_col[i],
            ioff=ioff,fig=fig4,fout=fn)
        # except ValueError:
        #     print 'error occured in %s'%fns[i]
    print 'Analysis results have been saved to %s'%fn.name
    fn.close()
    fig4.savefig('EXP_FLD.pdf')
    plt.close('all')
Example #9
0
def plot_xy_disc_e33dot(
        dat,istp=-1,ax=None,icol=11,fang=90,
        dist_bb=[5,10], ## backbone
        dist_rb=[1,5]):
    """
    Extract DIC data from 'disc' area
    """
    from MP.lib.mpl_lib import wide_fig as wf
    from MP.lib.mpl_lib import rm_all_lab as ral
    import matplotlib as mpl
    from MP.lib import mpl_lib
    from MP import ssort

    sort=ssort.shellSort
    d=dat[istp,:,:]
    dz = np.log10(abs(d[:,icol]))
    for i in range(len(dz)):
        if dz[i]==np.inf or dz[i]==-np.inf:
            dz[i] = np.nan
    mn=min(dz);mx=max(dz)
    norm=mpl.colors.Normalize(vmin=mn, vmax=mx)
    cmap, m = mpl_lib.norm_cmap(
        mn=mn,mx=mx,cm_name='brg')
    n=d.shape[0]

    ## find values in the back-bone branch shape
    ids = []; xs = []; ys = []; zs = []
    for i in range(n):
        x,y,z=d[i,0],d[i,1],-d[i,icol]
        if np.isnan(z): pass
        else:
            zs.append(d[i,icol])
            ids.append(i)
            xs.append(d[i,0])
            ys.append(d[i,1])
        c = m.to_rgba(np.log10(z))
        ax.plot(x,y,'o',ms=1.5,
                color=c,mfc=c,mec='None')

    val, ind = sort(zs)
    imn = ids[ind[0]]
    ax.plot(d[imn,0],d[imn,1],'g.') ## minimum

    ## draw a backbone grid
    x0,y0=d[imn,0],d[imn,1] # center of backbone

    db=np.array(dist_bb); dr=np.array(dist_rb)
    DB=[]; DR=[]
    for i in range(len(db)):
        DB.append(-db[-i-1])
    DB.append(0)
    for i in range(len(db)):
        DB.append(db[i])
    for i in range(len(dr)):
        DR.append(-dr[-i-1])
    DR.append(0)
    for i in range(len(dr)):
        DR.append(dr[i])

    db=DB[::];dr=DR[::]
    xy_db_dr = np.zeros((len(db),len(dr),2))
    for i in range(len(db)):
        for j in range(len(dr)):
            xy_db_dr[i,j,:] = db[i], dr[j]

    ## rotate xy by fang
    for i in range(len(db)):
        for j in range(len(dr)):
            y,x = xy_db_dr[i,j,:]
            xy_db_dr[i,j,:] = rot_xy([x,y],fang)

    ## translate
    xy_db_dr[:,:,0] =     xy_db_dr[:,:,0] + x0
    xy_db_dr[:,:,1] =     xy_db_dr[:,:,1] + y0

    ## print xy_db_dr.shape
    ## return xy_db_dr

    if len(db)>3:
        nw = len(db)/3
        nh = 4

    fig=wf(nw=nw,nh=nh,w0=0.0,ws=1.0,w1=0.0,
           h0=0.0,hs=1.0,h1=0.0,uw=2.3,uh=2.3,
           left=0.2,up=0.1,down=0.2,iarange=True)
    fig1=wf(nw=2,nh=2,w0=0.1,ws=0.7,w1=0.2,
            h0=0.1,hs=0.7,h1=0.2,uw=2.3,uh=2.3,
            left=0.2,up=0.1,down=0.2,iarange=True)
    iax=0
    sym=['k^','k+','kd','kx','k<','k>','k*',
         'k1','k2','k3','k4','k8','ks','kp',
         'kh','kH','kD']

    ## thickness strain rate
    epst_dot_av = []; epst_dot_std = []
    ## epsxx
    exx_av      = []; exx_std      = []
    ## epsyy
    eyy_av      = []; eyy_std      = []
    for i in range(len(db)):
        indices_along_ribs = []
        for j in range(len(dr)):
            x,y = xy_db_dr[i,j,:]
            ind = find_nearest([x,y],xs,ys,err=2)
            if not(np.isnan(ind)):
                indices_along_ribs.append(ids[ind])

        epsx = []; epsy = []; epst_dot = []
        coord = []
        for k in range(len(indices_along_ribs)):
            indx = indices_along_ribs[k]
            x = d[indx,0]; y = d[indx,1]
            coord.append([x,y])
            ## ax.plot(x,y,sym[i],ms=3)
            ex=dat[:,indx,3]
            ey=dat[:,indx,4]


            et=dat[:,indx,12]

            ex_d=dat[:,indx,9]
            ey_d=dat[:,indx,10]
            ez_d=ex_d+ey_d ## positive value
            epst_dot.append(ez_d)
            epsx.append(ex)
            epsy.append(ey)

            fig.axes[iax].plot(ez_d)

        iax = iax + 1
        x,y = np.array(coord).T[:]
        ax.plot(x,y,'-',color='k',alpha=0.5)

        epst_dot=np.array(epst_dot).T
        epsx    =np.array(epsx).T
        epsy    =np.array(epsy).T

        D    = []; D_e   = [];
        E_ex = []; E_exe = [];
        E_ey = []; E_eye = [];
        for j in range(len(epst_dot)): ## number of ribs
            D.append(np.mean(epst_dot[j]))
            D_e.append(np.std(epst_dot[j]))
            E_ex.append(np.mean(epsx[j]))
            E_exe.append(np.std(epsx[j]))
            E_ey.append(np.mean(epsy[j]))
            E_eye.append(np.std(epsy[j]))

    ## fig1.axes[0].plot(D,label=db[i])
        epst_dot_av.append(D)
        epst_dot_std.append(D_e)
        exx_av.append(E_ex)
        exx_std.append(E_exe)
        eyy_av.append(E_ey)
        eyy_std.append(E_eye)

    ## find maximum D value's index to trim the data
    ndat = (len(epst_dot_av)-1)/2+1
    ref=epst_dot_av[ndat-1] ## data at necking center spot
    _ref_=[]; _ind_ =[]
    for i in range(len(ref)):
        if not(np.isnan(ref[i])):
            _ref_.append(ref[i]); _ind_.append(i)
    _val_, _i_ = sort(_ref_)
    ix = _ind_[_i_[-1]]

    mdat = np.zeros((2,2,ndat))
    c    = []

    for i in range(ndat):
        i0 =  i
        i1 = -i -1
        ## thickness strain rate
        d1=epst_dot_av[i0];  d2=epst_dot_av[i1]
        e1=epst_dot_std[i0]; e2=epst_dot_std[i1]
        d =[]; e=[]

        ## epsilon xx
        ex1  = exx_av[i0];  ex2  = exx_av[i1]
        exe1 = exx_std[i0]; exe2 = exx_std[i1]
        ex=[]; exe=[]

        ## epsilon yy
        ey1  = eyy_av[i0];  ey2  = eyy_av[i1]
        eye1 = eyy_std[i0]; eye2 = eyy_std[i1]
        ey=[]; eye=[]

        for j in range(len(d1)):  # along the time axis
            d.append((d1[j]+d2[j])/2.)
            e.append((e1[j]+e2[j])/2.)
            ex.append((ex1[j]+ex2[j])/2.)
            exe.append((exe1[j]+exe2[j])/2.)
            ey.append((ey1[j]+ey2[j])/2.)
            eye.append((eye1[j]+eye2[j])/2.)

        xind=np.arange(len(d))+1
        p = 0.7
        i0 = int(float(len(xind))*p)
        ## find maximum value and index?
        l, =fig1.axes[0].plot(xind,d,'-',label=abs(db[-i-1]))
        fig1.axes[1].plot(xind[i0:ix+1],d[i0:ix+1],'+')
        fig1.axes[2].errorbar(xind[i0:ix+1],d[i0:ix+1],
                              yerr=e1[i0:ix+1],fmt='+')

        l, =fig1.axes[3].plot(ex[i0:ix+1],ey[i0:ix+1])
        fig1.axes[3].errorbar(
            ex[ix],ey[ix],color=l.get_color(),
            xerr=exe[ix],yerr=eye[ix])

        mdat[0,0,i] = ex[ix]
        mdat[0,1,i] = ey[ix]
        mdat[1,0,i] = exe[ix]
        mdat[1,1,i] = eye[ix]
        c.append(l.get_color())

    ## deco
    from MP.lib.mpl_lib import tune_xy_lim
    tune_xy_lim(fig.axes)
    fig1.axes[2].set_yscale('log')
    fig1.axes[2].set_ylim(1e-3)
    fig1.axes[0].legend(loc='best',ncol=2,fontsize=5).\
        get_frame().set_alpha(0.5)
    return fig,fig1,mdat,c
Example #10
0
def ex_igb(fn='igstrain_fbulk_ph1.out',ifig=2,iphi=0,isf=0,
           mxnst=None,flow=None):
    """
    Read ig strain file and analyze... (igstrain_fbulk_ph1.out)

    igstrain_fbulk_ph1.out contains diffraction for each and every
    reloading from 'unloaded' polycrystal.

    Arguments
    =========
    fn = 'igstrain_fbulk_ph1.out'
    ifig = 2
    iphi=0
    isf=0
    mxnst=None
    """
    import matplotlib.pyplot as plt
    from sff_converter import condition
    from MP.ssort import sh as sort
    from MP.mat import voigt
    from MP.lib.mpl_lib import wide_fig as wf

    difl, nphi, phis, nbeta, dum1, dum2 = condition(fn=None)

    if flow==None: raise IOError, 'Flow stress is missing'
    eps = flow.epsilon_vm[::]
    neps = flow.nstp

    nw = 4
    remainder = np.mod(neps,nw)
    if remainder==0:
        nh = neps/nw
    elif remainder>0:
        nh = neps/nw + 1

    fig  =wf(nw=2, nh=2,ifig=ifig,iarange=True);  axes  =fig.axes
    ax01, ax02, ax03, ax04 = axes
    fig01=wf(nw=nw,nh=nh,ifig=ifig+1,iarange=True,nfig=neps);axes01=fig01.axes
    fig02=wf(nw=nw,nh=nh,ifig=ifig+2,iarange=True,nfig=neps);axes02=fig02.axes
    fig03=wf(nw=nw,nh=nh,ifig=ifig+3,iarange=True,nfig=neps);axes03=fig03.axes
    fig04=wf(nw=nw,nh=nh,ifig=ifig+4,iarange=True,nfig=neps);axes04=fig04.axes

    tdat, usf = reader2(fn,iopt=1)
    print tdat.shape
    nsf = len(usf); nst = len(tdat[0]); npsi = len(tdat[0,0,0,0,:])
    if nst!=neps: raise IOError, 'Inconsistency between neps and nst'
    markers = ['o','x','+','^','d','*','o','x','+','^','d','*''o','x','+','^','d','*']
    colors  = ['r','g','b','k','m','y','r','g','b','k','m','y','r','g','b','k','m','y']
    from string import ascii_lowercase as alphabet
    axe_lab=[]
    for ab in alphabet: axe_lab.append('(%s)'%ab)
    yl = 0; yh = 0
    avg = np.zeros((2,nst,npsi)) #
    sft  = np.zeros((6,nst,npsi)) # f^{hkl}
    rsqt = np.zeros((6,nst,npsi)) # f^{hkl}

    if mxnst!=None: nst=mxnst
    for i in xrange(nst):
        ehkl  = tdat[0,i,isf,iphi,:] # e(hkl,phi,psi)
        e     = tdat[1,i,isf,iphi,:] # macro
        ehkle = tdat[2,i,isf,iphi,:] # e - macro
        fhkl  = tdat[3,i,isf,iphi,:] # Fhkl
        fbulk = tdat[4,i,isf,iphi,:] # Fbulk
        ige   = tdat[5,i,isf,iphi,:] # e - F_ij *Sij
        sij   = tdat[6,i,isf,iphi,:] # Sij
        psi   = tdat[8,i,isf,iphi,:]
        rsq   = tdat[9,i,isf,iphi,:]
        sin2psi = np.sin(psi*np.pi/180.)**2
        axes01[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        axes02[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        axes03[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        axes04[i].set_title(r'%s $\bar{E}^{\mathrm{eff}} = %4.2f$'%(
                axe_lab[i],eps[i]))
        igys = []; igos = []; igts = []
        for j in xrange(nsf): ## Number of elastic loading for stress factor calc.
            ehkl_ = tdat[0,i,j,iphi,:] # e(hkl,phi,psi)
            e_    = tdat[1,i,j,iphi,:] # macro
            fhkl_ = tdat[3,i,j,iphi,:] # Fhkl
            fbulk_= tdat[4,i,j,iphi,:] # Fbulk
            sij_  = tdat[6,i,j,iphi,:] # Sij
            rsq_  = tdat[6,i,j,iphi,:] # R^2

            sft[j,i,:]  = fhkl_[::] #
            rsqt[j,i,:] = rsq_[::]

            i1,i2 = usf[j]
            igo = ehkl_ - e_ ## old way
            igt = []
            m = 0
            for k in xrange(len(fbulk_)):
                if fbulk_[k]==0:
                    m=m+1
                    igt.append(0.)
                else: igt.append(
                        ehkl_[k] - \
                        fhkl_[k] / fbulk_[k] * e_[k])

            if m!=0: print m, 'case of fbulk'+\
               '(phi,psi)=0 happened'

            igt = np.array(igt)
            igy = ehkl_ - fhkl_ * sij_ ## new way (YJ)
            if j==0:
                igy_avg = igy/nsf
                igo_avg = igo/nsf
                igt_avg = igt/nsf
            else:
                igy_avg = igy_avg + igy/nsf
                igo_avg = igo_avg + igo/nsf
                igt_avg = igt_avg + igt/nsf
            igys.append(igy);igos.append(igo);igts.append(igt)

            # The old method
            if j==4: m = markers[j]
            else: m= '--'
            y = igo
            x = np.sin(psi[:]*np.pi/180.)**2
            newx,newy = sort(x,y) # shell sort
            axes01[i].plot(
                newx,newy*1e6,m,color=colors[j],
                label=r'$\Sigma_{%1i%1i}$'%(i1,i2))
            if i==0:axes01[i].legend(loc='best',
                fancybox=True).get_frame().set_alpha(0.5)
            if j==0:axes01[i].grid('on')
            yl0, yh0 = axes01[i].get_ylim()
            if yl0<yl: yl = yl0
            if yh0>yh: yh = yh0

            # GHT
            y = igt
            x = np.sin(psi[:]*np.pi/180.)**2
            newx,newy = sort(x,y) # shell sort
            axes02[i].plot(
                newx,newy*1e6,m,color=colors[j],
                label=r'$\Sigma_{%1i%1i}$'%(i1,i2))
            if i==0:axes02[i].legend(loc='best',
                fancybox=True).get_frame().set_alpha(0.5)
            if j==0:axes02[i].grid('on')
            yl0, yh0 = axes02[i].get_ylim()
            if yl0<yl: yl = yl0
            if yh0>yh: yh = yh0

            # YJ
            y = igy
            x = np.sin(psi[:]*np.pi/180.)**2
            newx,newy = sort(x,y) # shell sort
            axes03[i].plot(
                newx,newy*1e6,m,color=colors[j],
                label=r'$\Sigma_{%1i%1i}$'%(i1,i2))
            if i==0:axes03[i].legend(loc='best',
                fancybox=True).get_frame().set_alpha(0.5)
            if j==0:axes03[i].grid('on')
            yl0, yh0 = axes03[i].get_ylim()
            if yl0<yl: yl = yl0
            if yh0>yh: yh = yh0

            pass # over nsf

        # errors for 6 cases of SF loading
        igos = np.array(igos).swapaxes(0,1)
        igys = np.array(igys).swapaxes(0,1)
        igts = np.array(igts).swapaxes(0,1)
        igoe=[]; igye=[]; igte=[]
        for m in xrange(len(igo_avg)):
            igoe.append(igos[m].std())
            igte.append(igts[m].std())
            igye.append(igys[m].std())
        igoe,igte,igye = np.array(igoe),np.array(igte),np.array(igye)
        ##

        # average old
        y = igo_avg
        ye= igoe
        x = np.sin(psi[:]*np.pi/180.)**2
        newx, newy, newye = sort(x,y,ye)
        axes04[i].errorbar(
            x=newx,y=newy*1e6,yerr=newye*1e6,
            ls='-',color='r',label='old')

        # average YU
        y  = igy_avg
        avg[0,i,:] = psi[:]; avg[1,i,:] = y[:]

        ye = igye
        x  = np.sin(psi[:]*np.pi/180.)**2

        newx, newy, newye = sort(x,y,ye)

        axes04[i].errorbar(
            x=newx,y=newy*1e6,yerr=newye*1e6,
            ls='-',ms=3,color='b',label='YJ')
        axes04[i].grid('on')
        axes04[0].legend(loc='best',fancybox=True)\
            .get_frame().set_alpha(0.5)

        i1,i2 = voigt.ijv[:,isf]
        sin2psi = np.sin(psi*np.pi/180.)**2

        ax01.plot(sin2psi,ige*1e6,markers[i]#,color='k',
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        ax02.plot(sin2psi,ehkle*1e6,markers[i]#,color='k'
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        l, = ax04.plot(sin2psi,fhkl*1e6,markers[i]#,color='k'
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        if i==0: ax04.plot(sin2psi,fbulk*1e6,'-',alpha=0.2,color='k')
        # ax03.plot(sin2psi,e*1e6,markers[i],
        #           label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        ax03.plot(sin2psi,(ehkl-fhkl/fbulk*e)*1e6,markers[i]
           ,label=r'$\bar{E}^{\mathrm{eff}} = %4.2f$'%eps[i])
        sin2psi = np.sin(psi*np.pi/180.)**2

    ## Deco the axes
    for i in xrange(nst):
        axes01[i].set_ylim(yl,yh)
        axes02[i].set_ylim(yl,yh)
        axes03[i].set_ylim(yl,yh)
        #axes04[i].set_ylim(yl,yh)
        axes01[i].set_xlim(0.,); axes02[i].set_xlim(0.,)
        axes03[i].set_xlim(0.,); axes04[i].set_xlim(0.,)
    for i in xrange(len(axes)):
        axes[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes01[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes02[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes03[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
        axes04[i].set_xlabel(r'$\sin^2{\psi}$', dict(fontsize=20))
    for i in xrange(len(axes)): axes[i].grid('on')
    for i in xrange(len(axes)): axes[i].set_xlim(0.,0.5)
    ax01.set_ylabel(
        r'$\varepsilon^{hkl} - F^{hkl}_{ij}\bar{\Sigma}_{ij}$'+\
        r'  $[\mu\varepsilon]$',dict(fontsize=15))
    ax02.set_ylabel(
        r'$\varepsilon^{hkl} - E$  $[\mu\varepsilon]$',dict(fontsize=15))
    ax03.set_ylabel(r'$\varepsilon^{hkl} - $'+
        r'$F_{ij}^{hkl}/F^{\mathrm{bulk}}_{ij}$'+
        r'$ \bar{E} $  $[\mu \varepsilon]$',dict(fontsize=15))
    ax04.set_ylabel(r'$F_{ij}^{hkl}, F^{\mathrm{bulk}}_{ij}$  $[TPa^{-1}]$',
        dict(fontsize=15))
    ax01.set_title(r'(a) $\varepsilon(hkl,%3.0f^\circ,\psi)$'\
        r'$ - F_{%1i%1i}(hkl,%3.0f^\circ,\psi)$'\
        r'$\bar{\Sigma}_{%1i%1i}$'%(phis[iphi],i1,i2,phis[iphi],i1,i2),
        dict(fontsize=13))
    ax02.set_title(
        r'(b) $\varepsilon(hkl,%3.0f^\circ,\psi)$'%(phis[iphi])+\
            r'$ - \bar{E}(%3.0f^\circ,\psi)$'%\
            (phis[iphi]),dict(fontsize=13))
    ax03.set_title(
        r'(c) $\varepsilon(hkl,%3.0f^\circ,\psi)$'%(phis[iphi])+
        r'$-F_{%1i%1i}(hkl,%3.0f^\circ,\psi)/$'%(i1,i2,phis[iphi])+
        r'$F_{%1i%1i}^{\mathrm{bulk}}(%3.0f^\circ,\psi)$'%(
            i1,i2,phis[iphi])+
        r'$\bar{E}(%3.0f^\circ,\psi)$'%(phis[iphi]),dict(fontsize=13))
    ax04.set_title(r'(d) $F^{hkl}_{%1i%1i}$ and '%(i1,i2)+\
                       r'$F^{\mathrm{bulk}}_{%1i%1i}$'%
                   (i1,i2), dict(fontsize=13))
    ax04.legend(loc='lower right',fancybox=True).get_frame().set_alpha(0.5)
    # fig.tight_layout(); fig01.tight_layout(); fig02.tight_layout()
    # fig03.tight_layout(); fig04.tight_layout()
    fig.savefig('ig_bulk.pdf');fig01.savefig('ig_bulk_Old.pdf')
    fig02.savefig('ig_bulk_GHT.pdf'); fig03.savefig('ig_bulk_YJ.pdf')
    fig04.savefig('ig_bulk_avg.pdf')
    ## save the averaged IG strain

    return avg, sft # avg[2,nst,npsi], sft[6,nst,npsi]