Exemplo n.º 1
0
 def integrate_data(self,quantity,*domains,**kwargs):
     return_list = False
     if 'domains' in kwargs:
         domains = kwargs['domains']
         return_list = True
     #end if
     if 'return_list' in kwargs:
         return_list = kwargs['return_list']
     #end if
     if quantity not in SpaceGridBase.quantities:
         msg = 'requested integration of quantity '+quantity+'\n'
         msg +='  '+quantity+' is not a valid SpaceGrid quantity\n'
         msg +='  valid quantities are:\n'
         msg +='  '+str(SpaceGridBase.quantities)
         self.error(msg)
     #end if
     q = self.data[quantity]
     results = list()
     nblocks = q.shape[-1]
     qi = zeros((nblocks,))
     if len(domains)==0:
         for b in xrange(nblocks):
             qi[b] = q[...,b].sum()
         #end for
         (mean,var,error,kappa)=simstats(qi)
     else:
         for domain in domains:
             for b in xrange(nblocks):
                 qb = q[...,b]
                 qi[b] = qb[domain].sum()
             #end for                
             (mean,var,error,kappa)=simstats(qi)
             res = QAobject()
             res.mean  = mean
             res.error = error
             res.data  = qi.copy()
             results.append(res)
         #end for
     #end for
     if len(domains)<2:
         return mean,error
     else:
         if not return_list:
             return tuple(results)
         else:
             means = list()
             errors = list()
             for res in results:
                 means.append(res.mean)
                 errors.append(res.error)
             #end for
             return means,errors
Exemplo n.º 2
0
 def integrate_data(self, quantity, *domains, **kwargs):
     return_list = False
     if 'domains' in kwargs:
         domains = kwargs['domains']
         return_list = True
     #end if
     if 'return_list' in kwargs:
         return_list = kwargs['return_list']
     #end if
     if quantity not in SpaceGridBase.quantities:
         msg = 'requested integration of quantity ' + quantity + '\n'
         msg += '  ' + quantity + ' is not a valid SpaceGrid quantity\n'
         msg += '  valid quantities are:\n'
         msg += '  ' + str(SpaceGridBase.quantities)
         self.error(msg)
     #end if
     q = self.data[quantity]
     results = list()
     nblocks = q.shape[-1]
     qi = zeros((nblocks, ))
     if len(domains) == 0:
         for b in xrange(nblocks):
             qi[b] = q[..., b].sum()
         #end for
         (mean, var, error, kappa) = simstats(qi)
     else:
         for domain in domains:
             for b in xrange(nblocks):
                 qb = q[..., b]
                 qi[b] = qb[domain].sum()
             #end for
             (mean, var, error, kappa) = simstats(qi)
             res = QAobject()
             res.mean = mean
             res.error = error
             res.data = qi.copy()
             results.append(res)
         #end for
     #end for
     if len(domains) < 2:
         return mean, error
     else:
         if not return_list:
             return tuple(results)
         else:
             means = list()
             errors = list()
             for res in results:
                 means.append(res.mean)
                 errors.append(res.error)
             #end for
             return means, errors
Exemplo n.º 3
0
    def analyze_local(self):
        structure = QAanalyzer.run_info.system.structure

        jnames = {'One-Body': 'J1', 'Two-Body': 'J2', 'Three-Body': 'J3'}
        jastrows = QAobject()
        for jt, jn in jnames.iteritems():
            jastrows[jn] = QAobject()
        #end for
        del jastrows.J3

        if len(structure.axes) == 3:
            rcut_cell = structure.rwigner()
        else:
            rcut_cell = 10
        #end if

        J1, J2, J3 = self.info.wfn_xml.get(['J1', 'J2', 'J3'])
        if J1 != None:
            jname = 'J1'
            func = J1.function.lower()
            if func == 'bspline':
                for jn, corr in J1.correlations.iteritems():
                    if 'rcut' in corr:
                        rcut = corr.rcut
                    else:
                        rcut = rcut_cell
                    #end if
                    coeff = corr.coefficients.coeff
                    jastrows[jname][jn] = Jastrow1B(func, coeff, rcut)
                #end for
            #end if
        #end if
        if J2 != None:
            jname = 'J2'
            func = J2.function.lower()
            if func == 'bspline':
                for jn, corr in J2.correlations.iteritems():
                    if 'rcut' in corr:
                        rcut = corr.rcut
                    else:
                        rcut = rcut_cell
                    #end if
                    s1 = corr.speciesa
                    s2 = corr.speciesb
                    coeff = corr.coefficients.coeff
                    jastrows[jname][jn] = Jastrow2B(func, coeff, s1, s2, rcut)
                #end for
            #end if
        #end if
        self._transfer_from(jastrows)
Exemplo n.º 4
0
 def interpolate(self,points,quantities=None):
     if quantities==None:
         quantities=SpaceGridBase.quantities
     #end if
     npoints,ndim = points.shape
     ind = empty((npoints,2),dtype=int)
     out = ones((npoints,) ,dtype=int)
     nin = self.points2domains(points,ind,out)
     result = QAobject()
     for q in quantities:
         result._add_attribute(q,QAobject())
         result[q].mean  = zeros((npoints,))
         result[q].error = zeros((npoints,))
         result[q].mean[ind[0:nin,0]]  = self[q].mean[ind[0:nin,1]].copy()
         result[q].error[ind[0:nin,0]] = self[q].error[ind[0:nin,1]].copy()
     #end for
     return result
Exemplo n.º 5
0
    def plot_jastrow_convergence(self,
                                 title=None,
                                 saveonly=False,
                                 optconv=True):
        if title is None:
            tsin = None
        else:
            tsin = title
        #end if
        from matplotlib.pyplot import figure, subplot, xlabel, ylabel, plot, errorbar, title, xticks, xlim

        opt = self.opts
        nopt = len(opt)
        if nopt == 0:
            return
        #end if

        if optconv:
            self.plot_opt_convergence(saveonly=saveonly)
        #end if

        #plot Jastrow functions
        w = opt[0].wavefunction
        jtypes = w.jastrow_types
        order = QAobject()
        for jt in jtypes:
            if jt in w:
                order[jt] = list(w[jt].__dict__.keys())
                order[jt].sort()
            #end if
        #end for
        cs = array([1., 0, 0])
        ce = array([0, 0, 1.])
        for jt in jtypes:
            if jt in w:
                figure()
                nsubplots = len(order[jt])
                n = 0
                for o in order[jt]:
                    n += 1
                    subplot(nsubplots, 1, n)
                    if n == 1:
                        if tsin is None:
                            ts = 'Optimization: ' + jt + ' Convergence'
                        else:
                            ts = tsin
                        #end if
                        title(ts)
                    #end if
                    for i in range(len(opt)):
                        f = float(i) / len(opt)
                        c = f * ce + (1 - f) * cs
                        J = opt[i].wavefunction[jt][o]
                        J.plot(color=c)
                    #end for
                    ylabel(o)
                #end for
                xlabel('r (Bohr)')
Exemplo n.º 6
0
 def interpolate(self, points, quantities=None):
     if quantities == None:
         quantities = SpaceGridBase.quantities
     #end if
     npoints, ndim = points.shape
     ind = empty((npoints, 2), dtype=int)
     out = ones((npoints, ), dtype=int)
     nin = self.points2domains(points, ind, out)
     result = QAobject()
     for q in quantities:
         result._add_attribute(q, QAobject())
         result[q].mean = zeros((npoints, ))
         result[q].error = zeros((npoints, ))
         result[q].mean[ind[0:nin, 0]] = self[q].mean[ind[0:nin, 1]].copy()
         result[q].error[ind[0:nin, 0]] = self[q].error[ind[0:nin,
                                                            1]].copy()
     #end for
     return result
Exemplo n.º 7
0
    def __init__(self,initobj,options):
        if options==None:
            options = QAobject()
            options.wasNone = True
            options.points       = None
            options.exit_on_fail = True
            options.nblocks_exclude = 0
        else:
            if 'points' not in options: 
                options.points = None
            if 'exit_on_fail' not in options:
                options.exit_on_fail = True
            if 'nblocks_exclude' not in options:
                options.nblocks_exclude = 0
        #end if

        self.points          = options.points
        self.init_exit_fail  = options.exit_on_fail
        self.nblocks_exclude = options.nblocks_exclude
        self.keep_data = True
        delvars = ['init_exit_fail','keep_data']
            
        self.coord          = None # string
        self.coordinate     = None
        self.ndomains       = None
        self.domain_volumes = None
        self.domain_centers = None
        self.nvalues_per_domain = -1
        self.nblocks            = -1
        self.D  = QAobject() #Number Density
        self.T  = QAobject() #Kinetic Energy Density
        self.V  = QAobject() #Potential Energy Density
        self.E  = QAobject() #Energy Density, T+V
        self.P  = QAobject() #Local Pressure, (Volume)*P=(2*T+V)/3


        self.init_special()

        if initobj==None:
            return
        #end if

        self.DIM=3

        iname = initobj.__class__.__name__
        self.iname=iname
        if iname==self.__class__.__name__+'Initializer':
            self.init_from_initializer(initobj)
        elif iname==self.__class__.__name__:
            self.init_from_spacegrid(initobj)
        elif iname=='HDFgroup':
            self.init_from_hdfgroup(initobj)
        elif iname=='XMLelement':
            self.init_from_xmlelement(initobj)
        else:
            self.error('Spacegrid cannot be initialized from '+iname)
        #end if
        delvars.append('iname')

        self.check_complete()

        for dv in delvars:
            del self[dv]
        #end for

        self._reset_dynamic_methods()
        self._register_dynamic_methods()
        return
Exemplo n.º 8
0
    def test(self):
        from enthought.mayavi import mlab
        from numpy import array,dot,arange,sin,ogrid,mgrid,zeros

        n=10
        n2=2*n
        s = '-'+str(n)+':'+str(n)+':'+str(n2)+'j'
        exec 'x, y, z = ogrid['+s+','+s+','+s+']'
        del s

        #x, y, z = ogrid[-10:10:20j, -10:10:20j, -10:10:20j]
        #x, y, z = mgrid[-10:11:1, -10:11:1, -10:11:1]

        s = sin(x*y*z)/(x*y*z)


        #xl = [-5.0,-4.2,-3.5,-2.1,-1.7,-0.4,0.7,1.8,2.6,3.7,4.3,5.0]
        #yl = [-5.0,-4.3,-3.6,-2.2,-1.8,-0.3,0.8,1.7,2.7,3.6,4.4,5.0]
        #zl = [-5.0,-4.4,-3.7,-2.3,-1.9,-0.4,0.9,1.6,2.8,3.5,4.5,5.0]
        dx = 2.0*n/(2.0*n-1.0)
        xl = arange(-n,n+dx,dx)
        yl = xl
        zl = xl

        x,y,z = ndgrid(xl,yl,zl)

        s2 = sin(x*y*z)/(x*y*z)

        #shear the grid
        nx,ny,nz = x.shape
        A = array([[1,1,-1],[1,-1,1],[-1,1,1]])
        #A = array([[3,2,1],[0,2,1],[0,0,1]])
        #A = array([[4,7,2],[8,4,3],[2,5,3]])
        #A = 1.0*array([[1,2,3],[4,5,6],[7,8,9]]).transpose()
        r = zeros((3,))
        np=0
        for i in range(nx):
            for j in range(ny):
                for k in range(nz):
                    r[0] = x[i,j,k]
                    r[1] = y[i,j,k]
                    r[2] = z[i,j,k]
                    
                    #print np,r[0],r[1],r[2]
                    np+=1

                    r = dot(A,r)
                    x[i,j,k] = r[0]  
                    y[i,j,k] = r[1]  
                    z[i,j,k] = r[2]  
                #end for
            #end for
        #end for
        s2 = sin(x*y*z)/(x*y*z)

        mlab.contour3d(x,y,z,s2)
        mlab.show()

        out = QAobject()
        out.x=x
        out.y=y
        out.z=z
        out.s=s2
        out.A=A

        return out
Exemplo n.º 9
0
    def analyze_local(self):
        from spacegrid import SpaceGrid

        nbe = QAanalyzer.method_info.nblocks_exclude
        self.info.nblocks_exclude = nbe 
        data = self.data

        #why is this called 3 times?
        print nbe

        #transfer hdf data
        sg_pattern = re.compile(r'spacegrid\d*')
        nspacegrids=0
        #  add simple data first
        for k,v in data._iteritems():
            if not sg_pattern.match(k):
                self._add_attribute(k,v)
            else:
                nspacegrids+=1
            #end if
        #end for
        #  add spacegrids second
        opts = QAobject()
        opts.points = self.reference_points
        opts.nblocks_exclude = nbe
        self.spacegrids=[]
        if nspacegrids==0:
            self.spacegrids.append(SpaceGrid(data.spacegrid,opts))
        else:
            for ig in range(nspacegrids):
                sg=SpaceGrid(data['spacegrid'+str(ig+1)],opts)
                self.spacegrids.append(sg)
            #end for
        #end if

        #reorder atomic data to match input file for Voronoi grids
        if self.run_info.type=='bundled':
            self.info.reordered=True
        #end if
        if not self.info.reordered:
            self.reorder_atomic_data()
        #end if

        #convert quantities outside all spacegrids
        outside = QAobject()
        iD,iT,iV = tuple(range(3))        
        outside.D  = QAobject()
        outside.T  = QAobject()
        outside.V  = QAobject()
        outside.E  = QAobject()
        outside.P  = QAobject()

        value = self.outside.value.transpose()[...,nbe:]

        #mean,error = simplestats(value)
        mean,var,error,kappa = simstats(value)
        outside.D.mean   = mean[iD]
        outside.D.error  = error[iD]
        outside.T.mean   = mean[iT]
        outside.T.error  = error[iT]
        outside.V.mean   = mean[iV]
        outside.V.error  = error[iV]

        E  = value[iT,:]+value[iV,:]
        #mean,error = simplestats(E)
        mean,var,error,kappa = simstats(E)
        outside.E.mean  = mean
        outside.E.error = error

        P  = 2./3.*value[iT,:]+1./3.*value[iV,:]
        #mean,error = simplestats(P)
        mean,var,error,kappa = simstats(P)
        outside.P.mean  = mean
        outside.P.error = error

        self.outside = outside

        self.outside.data = obj(
            D = value[iD,:],
            T = value[iT,:],
            V = value[iV,:],
            E = E,
            P = P
            )

        return
Exemplo n.º 10
0
    def __init__(self, initobj, options):
        if options == None:
            options = QAobject()
            options.wasNone = True
            options.points = None
            options.exit_on_fail = True
            options.nblocks_exclude = 0
        else:
            if 'points' not in options:
                options.points = None
            if 'exit_on_fail' not in options:
                options.exit_on_fail = True
            if 'nblocks_exclude' not in options:
                options.nblocks_exclude = 0
        #end if

        self.points = options.points
        self.init_exit_fail = options.exit_on_fail
        self.nblocks_exclude = options.nblocks_exclude
        self.keep_data = True
        delvars = ['init_exit_fail', 'keep_data']

        self.coord = None  # string
        self.coordinate = None
        self.ndomains = None
        self.domain_volumes = None
        self.domain_centers = None
        self.nvalues_per_domain = -1
        self.nblocks = -1
        self.D = QAobject()  #Number Density
        self.T = QAobject()  #Kinetic Energy Density
        self.V = QAobject()  #Potential Energy Density
        self.E = QAobject()  #Energy Density, T+V
        self.P = QAobject()  #Local Pressure, (Volume)*P=(2*T+V)/3

        self.init_special()

        if initobj == None:
            return
        #end if

        self.DIM = 3

        iname = initobj.__class__.__name__
        self.iname = iname
        if iname == self.__class__.__name__ + 'Initializer':
            self.init_from_initializer(initobj)
        elif iname == self.__class__.__name__:
            self.init_from_spacegrid(initobj)
        elif iname == 'HDFgroup':
            self.init_from_hdfgroup(initobj)
        elif iname == 'XMLelement':
            self.init_from_xmlelement(initobj)
        else:
            self.error('Spacegrid cannot be initialized from ' + iname)
        #end if
        delvars.append('iname')

        self.check_complete()

        for dv in delvars:
            del self[dv]
        #end for

        self._reset_dynamic_methods()
        self._register_dynamic_methods()
        return
Exemplo n.º 11
0
    def init_from_hdfgroup(self, init):
        #copy all datasets from hdf group
        value_pattern = re.compile('value')
        gmap_pattern = re.compile(r'gmap\d*')
        for k, v in init._iteritems():
            exclude = k[0] == '_' or gmap_pattern.match(
                k) or value_pattern.match(k)
            if not exclude:
                self.__dict__[k] = v
            #end if
        #end for

        #convert 1x and 1x1 numpy arrays to just numbers
        #convert Nx1 and 1xN numpy arrays to Nx arrays
        array_type = type(array([]))
        exclude = set(['value', 'value_squared'])
        for k, v in self._iteritems():
            if k[0] != '_' and type(v) == array_type and k not in exclude:
                sh = v.shape
                ndim = len(sh)
                if ndim == 1 and sh[0] == 1:
                    self.__dict__[k] = v[0]
                elif ndim == 2:
                    if sh[0] == 1 and sh[1] == 1:
                        self.__dict__[k] = v[0, 0]
                    elif sh[0] == 1 or sh[1] == 1:
                        self.__dict__[k] = v.reshape((sh[0] * sh[1], ))
                    #end if
                #end if
            #end if
        #end for

        #set coord string
        self.coord = SpaceGridBase.coord_n2s[self.coordinate]

        #determine if chempot grid
        chempot = 'min_part' in init
        self.chempot = chempot
        if chempot:
            npvalues = self.max_part - self.min_part + 1
            self.npvalues = npvalues
        #end if

        #process the data in hdf value,value_squared
        nbe = self.nblocks_exclude
        nquant = self.nvalues_per_domain
        ndomains = self.ndomains
        nblocks, ntmp = init.value.shape
        self.nblocks = nblocks

        if not chempot:
            value = init.value.reshape(nblocks, ndomains,
                                       nquant).transpose(2, 1, 0)
        else:
            value = init.value.reshape(nblocks, ndomains, npvalues,
                                       nquant).transpose(3, 2, 1, 0)
        #end if
        value = value[..., nbe:]

        #(mean,error)=simplestats(value)
        (mean, var, error, kappa) = simstats(value)
        quants = ['D', 'T', 'V']
        for i in range(len(quants)):
            q = quants[i]
            self[q].mean = mean[i, ...]
            self[q].error = error[i, ...]
            exec 'i' + q + '=' + str(i)
        #end for

        E = value[iT, ...] + value[iV, ...]
        #        (mean,error)=simplestats(E)
        (mean, var, error, kappa) = simstats(E)
        self.E.mean = mean
        self.E.error = error

        P = 2. / 3. * value[iT, ...] + 1. / 3. * value[iV, ...]
        #(mean,error)=simplestats(P)
        (mean, var, error, kappa) = simstats(P)
        self.P.mean = mean
        self.P.error = error

        #convert all quantities into true densities
        ovol = 1. / self.domain_volumes
        sqovol = sqrt(ovol)
        for q in SpaceGridBase.quantities:
            self[q].mean *= ovol
            self[q].error *= sqovol
        #end for

        #keep original data, if requested
        if self.keep_data:
            self.data = QAobject()
            for i in range(len(quants)):
                q = quants[i]
                self.data[q] = value[i, ...]
            #end for
            self.data.E = E
            self.data.P = P
        #end if

        #print 'sg'
        #import code
        #code.interact(local=locals())

        return