def expand(self,n1,n2,n3): #...expand unit vectors self.a1= self.a1*n1 self.a2= self.a2*n2 self.a3= self.a3*n3 n123= n1*n2*n3 nsid= 0 for ai in self.atoms: nsid= max(nsid,ai.sid) natm_per_spcs= np.zeros((nsid,),dtype=int) for ai in self.atoms: sid= ai.sid -1 natm_per_spcs[sid] += 1 natm0= self.num_atoms() atoms0= copy.copy(self.atoms) self.atoms= [] aid= 0 for ai0 in atoms0: ai0.pos[0] /= n1 ai0.pos[1] /= n2 ai0.pos[2] /= n3 for i1 in range(n1): for i2 in range(n2): for i3 in range(n3): aid += 1 ai= Atom() ai.sid= ai0.sid x= ai0.pos[0]+1.0/n1*i1 y= ai0.pos[1]+1.0/n2*i2 z= ai0.pos[2]+1.0/n3*i3 ai.set_pos(x,y,z) ai.set_auxd(ai0.auxd) ai.set_id(aid) self.atoms.append(ai)
def read_pmd(self,fname='pmd0000'): f=open(fname,'r') # 1st: lattice constant self.alc= float(f.readline().split()[0]) # 2nd-4th: cell vectors self.a1= np.array([float(x) for x in f.readline().split()]) self.a2= np.array([float(x) for x in f.readline().split()]) self.a3= np.array([float(x) for x in f.readline().split()]) # 5th-7th: velocity of cell vectors tmp= f.readline().split() tmp= f.readline().split() tmp= f.readline().split() # 8st: num of atoms buff= f.readline().split() natm= int(buff[0]) nauxd= 9 # 9th-: atom positions self.atoms= [] for i in range(natm): data= [float(x) for x in f.readline().split()] ai= Atom() ai.decode_tag(data[0]) ai.set_pos(data[1],data[2],data[3]) ai.set_auxd(data[4:4+nauxd]) self.atoms.append(ai) f.close()
def read_POSCAR(self,fname='POSCAR'): f=open(fname,'r') # 1st: comment self.c1= f.readline() # 2nd: multiplying factor self.alc= float(f.readline().split()[0]) # 3-5: lattice vectors self.a1= np.array([float(x) for x in f.readline().split()]) self.a2= np.array([float(x) for x in f.readline().split()]) self.a3= np.array([float(x) for x in f.readline().split()]) # 6th: num of atoms par species data= f.readline().split() if( data[0].isdigit() ): natm_per_spcs= np.array([int(d) for d in data]) else: # skip one line and read next line data= f.readline().split() natm_per_spcs= np.array([int(d) for d in data]) # 7th: comment (in some cases, 8th line too) self.c7= f.readline() if self.c7[0] in ('s','S'): self.c8= f.readline() # hereafter: atom positions sid= 0 self.atoms=[] for ni in natm_per_spcs: sid += 1 for j in range(ni): line= f.readline().split() data= [ float(line[i]) for i in range(3)] ai= Atom() ai.set_sid(sid) ai.set_pos(data[0],data[1],data[2]) ai.set_auxd(line[3:]) ai.pbc() self.atoms.append(ai) f.close()