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
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')
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
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
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
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
def is_element(self, name, symbol=False): return is_element(name, symbol=symbol)
def is_element(self,name,symbol=False): return is_element(name,symbol=symbol)
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