예제 #1
0
 def incorporate_structure(self,structure):
     s = structure.copy()
     s.change_units('A')
     s.recenter()
     elem = []
     for e in s.elem:
         ne = len(e)
         if ne>1:
             if ne==2 and not e[1].isalpha():
                 e = e[0]
             elif ne>2:
                 e = e[0:2]
             #end if
         #end if
         if is_element(e):
             elem.append(ptable.elements[e].atomic_number)
         else:
             elem.append(0)
         #end if
     #end for
     self.filetype    = 'xsf'
     self.periodicity = 'crystal' # assumed
     self.primvec     = s.axes
     self.elem        = array(elem,dtype=int)
     self.pos         = s.pos
예제 #2
0
def test_is_element():
    from periodic_table import is_element

    elements = '''
        H He 
        Li Be B C N O F Ne 
        Na Mg Al Si P S Cl Ar 
        K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr 
        Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe 
        Cs Ba La Ce Pr Nd Pm Sm Eu Gd Tb Dy Ho Er Tm Yb Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn 
        Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr 
        '''.split()

    for e in elements:
        assert (is_element(e))
        is_elem, symbol = is_element(e, symbol=True)
        assert (is_elem)
        assert (symbol == e)
    #end for

    valid = '''
        C
        C1
        C2
        C12
        C123
        C_1
        C_2
        C_12
        C_123
        C_a
        C_abc
        '''.split()
    for e in valid:
        assert (is_element(e))
        is_elem, symbol = is_element(e, symbol=True)
        assert (is_elem)
        assert (symbol == 'C')
    #end for

    valid = '''
        Co
        Co1
        Co2
        Co12
        Co123
        Co_1
        Co_2
        Co_12
        Co_123
        Co_a
        Co_abc
        '''.split()
    for e in valid:
        assert (is_element(e))
        is_elem, symbol = is_element(e, symbol=True)
        assert (is_elem)
        assert (symbol == 'Co')
예제 #3
0
 def __init__(self,filepath=None):
     self.element       = None
     self.element_label = None
     self.filename      = None
     self.location      = None
     if filepath!=None:
         self.filename = os.path.basename(filepath)
         self.location = os.path.abspath(filepath)
         elem_label = self.filename.split('.')[0]
         is_elem,symbol = is_element(elem_label,symbol=True)
         if not is_elem:
             self.error('cannot determine element for basis file: {0}\nbasis file names must be prefixed by an atomic symbol or label\n(e.g. Si, Si1, etc)'.format(filepath))
         #end if
         self.element = symbol
         self.element_label = elem_label
예제 #4
0
 def __init__(self,filepath=None):
     self.element       = None
     self.element_label = None
     self.filename      = None
     self.location      = None
     if filepath!=None:
         self.filename = os.path.basename(filepath)
         self.location = os.path.abspath(filepath)
         elem_label = self.filename.split('.')[0]
         is_elem,symbol = is_element(elem_label,symbol=True)
         if not is_elem:
             self.error('cannot determine element for basis file: {0}\nbasis file names must be prefixed by an atomic symbol or label\n(e.g. Si, Si1, etc)'.format(filepath))
         #end if
         self.element = symbol
         self.element_label = elem_label
예제 #5
0
 def write_text(self):
     text = ''
     if self.description is None:
         text += 'System cell and coordinates\n'
     else:
         text += self.description+'\n'
     #end if
     text += ' {0}\n'.format(self.scale)
     for a in self.axes:
         text += ' {0:20.14f} {1:20.14f} {2:20.14f}\n'.format(*a)
     #end for
     if self.elem is not None:
         for e in self.elem:
             iselem,symbol = is_element(e,symbol=True)
             if not iselem:
                 self.error('{0} is not an element'.format(e))
             #end if
             text += symbol+' '
         #end for
         text += '\n'
     #end if
     for ec in self.elem_count:
         text += ' {0}'.format(ec)
     #end for
     text += '\n'
     if self.dynamic!=None:
         text += 'selective dynamics\n'
     #end if
     text += self.coord+'\n'
     if self.dynamic is None:
         for p in self.pos:
             text += ' {0:20.14f} {1:20.14f} {2:20.14f}\n'.format(*p)
         #end for
     else:
         bm = self.bool_map
         for i in xrange(len(self.pos)):
             p = self.pos[i]
             d = self.dynamic[i]
             text += ' {0:20.14f} {1:20.14f} {2:20.14f}  {3}  {4}  {5}\n'.format(p[0],p[1],p[2],bm[d[0]],bm[d[1]],bm[d[2]])
         #end for
     #end if
     if self.vel!=None:
         text += self.vel_coord+'\n'
         for v in self.vel:
             text += ' {0:20.14f} {1:20.14f} {2:20.14f}\n'.format(*v)
         #end for
     #end if
     return text
예제 #6
0
 def validity_checks(self):
     msgs = []
     if self.description is None:
         msgs.append('description is missing')
     elif not isinstance(self.description,str):
         msgs.append('description must be text')
     #end if
     if self.scale is None:
         msgs.append('scale is missing')
     elif not isinstance(self.scale,(float,int)):
         msgs.append('scale must be a real number')
     elif self.scale<0:
         msgs.append('scale must be greater than zero')
     #end if
     if self.axes is None:
         msgs.append('axes is missing')
     elif not isinstance(self.axes,ndarray):
         msgs.append('axes must be an array')
     elif self.axes.shape!=(3,3):
         msgs.append('axes must be a 3x3 array, shape provided is {0}'.format(self.axes.shape))
     elif not isinstance(self.axes[0,0],float):
         msgs.append('axes must be an array of real numbers')
     #end if
     natoms = -1
     if self.elem_count is None:
         msgs.append('elem_count is missing')
     elif not isinstance(self.elem_count,ndarray):
         msgs.append('elem_count must be an array')
     elif len(self.elem_count)==0:
         msgs.append('elem_count array must contain at least one entry')
     elif not isinstance(self.elem_count[0],int):
         msgs.append('elem_count must be an array of integers')
     else:
         if (self.elem_count<1).sum()>0:
             msgs.append('all elem_count entries must be greater than zero')
         #end if
         natoms = self.elem_count.sum()
     #end if
     if self.elem is not None: # presence depends on vasp version
         if not isinstance(self.elem,ndarray):
             msgs.append('elem must be an array')
         elif isinstance(self.elem_count,ndarray) and len(self.elem)!=len(self.elem_count):
             msgs.append('elem and elem_count arrays must be the same length')
         elif not isinstance(self.elem[0],str):
             msgs.append('elem must be an array of text')
         else:
             for e in self.elem:
                 iselem,symbol = is_element(e,symbol=True)
                 if not iselem:
                     msgs.append('elem entry "{0}" is not an element'.format(e))
                 #end if
             #end for
         #end for
     #end if
     if self.coord is None:
         msgs.append('coord is missing')
     elif not isinstance(self.coord,str):
         msgs.append('coord must be text')
     #end if
     if self.pos is None:
         msgs.append('pos is missing')
     elif not isinstance(self.pos,ndarray):
         msgs.append('pos must be an array')
     elif natoms>0 and self.pos.shape!=(natoms,3):
         msgs.append('pos must be a {0}x3 array, shape provided is {1}'.format(natoms),self.pos.shape)
     elif natoms>0 and not isinstance(self.pos[0,0],float):
         msgs.append('pos must be an array of real numbers')
     #end if
     if self.dynamic is not None: # dynamic is optional
         if not isinstance(self.dynamic,ndarray):
             msgs.append('dynamic must be an array')
         elif natoms>0 and self.dynamic.shape!=(natoms,3):
             msgs.append('dynamic must be a {0}x3 array, shape provided is {1}'.format(natoms),self.dynamic.shape)
         elif natoms>0 and not isinstance(self.dynamic[0,0],bool):
             msgs.append('dynamic must be an array of booleans (true/false)')
         #end if
     #end if
     if self.vel_coord is not None: # velocities are optional
         if not isinstance(self.vel_coord,str):
             msgs.append('vel_coord must be text')
         #end if
     #end if
     if self.vel is not None: # velocities are optional
         if not isinstance(self.vel,ndarray):
             msgs.append('vel must be an array')
         elif natoms>0 and self.vel.shape!=(natoms,3):
             msgs.append('vel must be a {0}x3 array, shape provided is {1}'.format(natoms),self.vel.shape)
         elif natoms>0 and not isinstance(self.vel[0,0],float):
             msgs.append('vel must be an array of real numbers')
         #end if
     #end if
     return msgs
예제 #7
0
def generate_physical_system(**kwargs):
    for var, val in ps_defaults.items():
        if not var in kwargs:
            kwargs[var] = val
        #end if
    #end for
    type = kwargs['type']
    if type == 'atom' or type == 'dimer' or type == 'trimer':
        del kwargs['kshift']
        del kwargs['tiling']
        #if not 'units' in kwargs:
        #    kwargs['units'] = 'B'
        ##end if
        tiling = None
    else:
        tiling = kwargs['tiling']
    #end if

    if 'structure' in kwargs:
        s = kwargs['structure']
        is_str = isinstance(s, str)
        if is_str:
            if os.path.exists(s):
                if 'elem' in kwargs:
                    s = read_structure(s, elem=kwargs['elem'])
                else:
                    s = read_structure(s)
                #end if
                if 'axes' in kwargs:
                    s.reset_axes(kwargs['axes'])
                #end if
                kwargs['structure'] = s
            else:
                slow = s.lower()
                format = None
                if '.' in slow:
                    format = slow.rsplit('.')[1]
                elif 'poscar' in slow:
                    format = 'poscar'
                #end if
                is_path = '/' in s
                is_file = format in set('xyz xsf poscar cif fhi-aims'.split())
                if is_path or is_file:
                    PhysicalSystem.class_error(
                        'user provided structure file does not exist\nstructure file path: '
                        + s, 'generate_physical_system')
                #end if
            #end if
        #end if
    #end if

    generation_info = obj()
    generation_info.transfer_from(deepcopy(kwargs))

    net_charge = kwargs['net_charge']
    net_spin = kwargs['net_spin']
    tiled_spin = kwargs['tiled_spin']
    extensive = kwargs['extensive']
    del kwargs['net_spin']
    del kwargs['net_charge']
    del kwargs['tiled_spin']
    del kwargs['extensive']
    if 'particles' in kwargs:
        particles = kwargs['particles']
        del kwargs['particles']
    else:
        generation_info.particles = None
    #end if
    pretile = kwargs['pretile']
    del kwargs['pretile']
    valency = dict()
    remove = []
    for var in kwargs:
        #if var in Matter.elements:
        if is_element(var):
            valency[var] = kwargs[var]
            remove.append(var)
        #end if
    #end if
    generation_info.valency = deepcopy(valency)
    for var in remove:
        del kwargs[var]
    #end for

    if pretile is None:
        structure = generate_structure(**kwargs)
    else:
        for d in range(len(pretile)):
            if tiling[d] % pretile[d] != 0:
                PhysicalSystem.class_error(
                    'pretile does not divide evenly into tiling\n  tiling provided: {0}\n  pretile provided: {1}'
                    .format(tiling, pretile), 'generate_physical_system')
            #end if
        #end for
        tiling = tuple(array(tiling) // array(pretile))
        kwargs['tiling'] = pretile
        pre = generate_structure(**kwargs)
        pre.remove_folded_structure()
        structure = pre.tile(tiling)
    #end if

    if tiling != None and tiling != (1, 1, 1) and structure.has_folded():
        fps = PhysicalSystem(structure=structure.folded_structure,
                             net_charge=net_charge,
                             net_spin=net_spin,
                             **valency)
        structure.remove_folded()
        folded_structure = fps.structure
        if extensive:
            ncells = int(round(structure.volume() / folded_structure.volume()))
            net_charge = ncells * net_charge
            if not isinstance(net_spin, str):
                net_spin = ncells * net_spin
            #end if
        #end if
        if tiled_spin != None:
            net_spin = tiled_spin
        #end if
        ps = PhysicalSystem(structure=structure,
                            net_charge=net_charge,
                            net_spin=net_spin,
                            **valency)
        structure.set_folded(folded_structure)
        ps.folded_system = fps
    else:
        ps = PhysicalSystem(structure=structure,
                            net_charge=net_charge,
                            net_spin=net_spin,
                            **valency)
    #end if

    ps.generation_info = generation_info

    return ps
예제 #8
0
 def is_element(self, name, symbol=False):
     return is_element(name, symbol=symbol)
예제 #9
0
 def is_element(self,name,symbol=False):
     return is_element(name,symbol=symbol)
예제 #10
0
def generate_physical_system(**kwargs):
    for var,val in ps_defaults.iteritems():
        if not var in kwargs:
            kwargs[var] = val
        #end if
    #end for
    type = kwargs['type']
    if type=='atom' or type=='dimer' or type=='trimer':
        del kwargs['kshift']
        del kwargs['tiling']
        #if not 'units' in kwargs:
        #    kwargs['units'] = 'B'
        ##end if
        tiling = None
    else:
        tiling = kwargs['tiling']
    #end if

    if 'structure' in kwargs:
        s = kwargs['structure']
        is_str = isinstance(s,str)
        if is_str and os.path.exists(s):# and '.' in os.path.split(s)[1]:
            if 'elem' in kwargs:
                print 'system using elem'
                kwargs['structure'] = read_structure(s,elem=kwargs['elem'])
            else:
                kwargs['structure'] = read_structure(s)
            #end if
        elif is_str and '/' in s:
            PhysicalSystem.class_error('path provided for structure file does not exist: '+s,'generate_physical_system')
        #end if
    #end if

    generation_info = obj()
    generation_info.transfer_from(deepcopy(kwargs))

    net_charge = kwargs['net_charge']
    net_spin   = kwargs['net_spin']
    tiled_spin = kwargs['tiled_spin']
    extensive  = kwargs['extensive']
    del kwargs['net_spin']
    del kwargs['net_charge']
    del kwargs['tiled_spin']
    del kwargs['extensive']
    if 'particles' in kwargs:
        particles = kwargs['particles']
        del kwargs['particles']
    else:
        generation_info.particles = None
    #end if
    pretile = kwargs['pretile']
    del kwargs['pretile']
    valency = dict()
    remove = []
    for var in kwargs:
        #if var in Matter.elements:
        if is_element(var):     
            valency[var] = kwargs[var]
            remove.append(var)
        #end if
    #end if
    generation_info.valency = deepcopy(valency)
    for var in remove:
        del kwargs[var]
    #end for

    if pretile is None:
        structure = generate_structure(**kwargs)
    else:
        for d in range(len(pretile)):
            if tiling[d]%pretile[d]!=0:
                PhysicalSystem.class_error('pretile does not divide evenly into tiling\n  tiling provided: {0}\n  pretile provided: {1}'.format(tiling,pretile),'generate_physical_system')
            #end if
        #end for
        tiling = tuple(array(tiling)/array(pretile))
        kwargs['tiling'] = pretile
        pre = generate_structure(**kwargs)
        pre.remove_folded_structure()
        structure = pre.tile(tiling)
    #end if

    if tiling!=None and tiling!=(1,1,1):
        fps = PhysicalSystem(
            structure  = structure.folded_structure,
            net_charge = net_charge,
            net_spin   = net_spin,
            **valency
            )
        structure.remove_folded()
        folded_structure = fps.structure
        if extensive:
            ncells = int(round(structure.volume()/folded_structure.volume()))
            net_charge = ncells*net_charge
            net_spin   = ncells*net_spin
        #end if
        if tiled_spin!=None:
            net_spin = tiled_spin
        #end if
        ps = PhysicalSystem(
            structure  = structure,
            net_charge = net_charge,
            net_spin   = net_spin,
            **valency
            )
        structure.set_folded(folded_structure)
        ps.folded_system = fps
    else:
        ps = PhysicalSystem(
            structure  = structure,
            net_charge = net_charge,
            net_spin   = net_spin,
            **valency
            )
    #end if
    
    ps.generation_info = generation_info

    return ps