Exemple #1
0
class System():
    def __init__(self, setting):
        self.setting = setting

        self.elsProps = []         # elements properties
        self.setting['nAt'] = []   # number of atoms per specie
        
        self.px = self.setting['period'][0]
        self.py = self.setting['period'][1]
        self.pz = self.setting['period'][2]
        self.a0 =  self.setting['a']

        self.box =[[0, self.px*self.a0],\
                [0,self.py*self.a0],\
                [0,self.pz*self.a0]]

        self.setElsProps()

        self.setCrystal()

        if self.setting['positions'] == 'rnd':
                self.setRandomStructure()

        self.setNumbers()
        self.bulk.set_atomic_numbers(self.numbers)


    def setNumbers(self):
        self.numbers = []
        for e in  self.t1_:
            self.numbers.append( self.elsProps[e - 1]['number'])

    def setElsProps(self):
        for e in self.setting['elements']:
            a = ase.Atom(e)
            mass = a.mass / _Nav
            number = a.number

            form = pt.formula(a.symbol)
            e_ = form.structure[0][1]
            crys = e_.crystal_structure['symmetry'] 
            a_ = e_.crystal_structure['a'] 
            self.elsProps.append({'ase':a, 'mass': mass, 'structure': crys,
                'a':a_ , 'number':number})

    def setCrystal(self):
        crys = self.setting['structure']
        if crys == 'rnd':
            print 'rnd implemented'
            self.genRandomPositions()
            d = 1.104  # N2 bondlength
            formula =  'Cu'+str(len(self.pos))
            cell =[(self.px*self.a0,0,0),(0,self.py*self.a0,0),(0,0,self.pz*self.a0)] 
            self.bulk = ase.Atoms(formula, self.pos, pbc=True, cell=cell)

        if crys == 'fcc':
            print 'fcc implemented'
            from ase.lattice.cubic import FaceCenteredCubic
            self.bulk = FaceCenteredCubic(directions=[[1,0,0], [0,1,0], [0,0,1]],
                                        size=(self.px,self.py,self.pz), symbol='Cu',
                    pbc=(1,1,1), latticeconstant=self.a0)

        if crys == 'bcc':
            print 'bcc implemented'
            from ase.lattice.cubic import BodyCenteredCubic
            self.bulk = BodyCenteredCubic(directions=[[1,0,0], [0,1,0], [0,0,1]],
                                        size=(self.px,self.py,self.pz), symbol='Cu',
                    pbc=(1,1,1), latticeconstant=self.a0)

        if self.setting['structure'] == 'hcp':
            print 'hcp no implemented'
            sys.exit(0)


        self.setting['nAtoms'] =  self.bulk.get_number_of_atoms()
        self.calcAtoms2()
        self.genStructure()
        self.pos = self.bulk.get_positions()

    def update (self):
        cell  = self.bulk.get_cell()
        self.box =[[0, cell[0][0]],[0, cell[1][1]],[0, cell[2][2]]]
        self.pos = self.bulk.get_positions()

    def genStructure(self):
        self.t1_ = []
        for i,e in enumerate(self.setting['nAt']):
            [self.t1_.append(i+1) for j in range(e)]

 
    def setRandomStructure(self):
        x = [int(random.random()*len(self.t1_)) for i in range(len(self.t1_))]

        for i in range(len(x) - 1):
            t1 = self.t1_[x[i]]
            t2 = self.t1_[x[i+1]]

            self.t1_[x[i]] = t2
            self.t1_[x[i+1]] = t1
            
        return self.pos, self.t1_, self.box

    def genRandomPositions(self):
        Lx = self.box[0][1]
        Ly = self.box[1][1]
        Lz = self.box[2][1]

        self.pos =[]
        for i in range(self.setting['nAtoms']):
            x = random.random() * Lx
            y = random.random() * Ly
            z = random.random() * Lz
            self.pos.append([x,y,z])


    def getAtoms(self):
        return self.elsProps

    def Interaction (self):
        if self.setting['pot'] == 'lj':
            ljp = ljParameters.LjParameters()
            str_ = ljp.lammpsInteraction(self.elsProps)
        if self.setting['pot'] == 'zhou':
            gz = zhou.calcPotentials(self.setting['elements'])
            gz.createPot()
            str_ = gz.lammpsZhouEam()

        return str_

    def calcAtoms2(self):
        nAt = []

        sum_ = 0
        sumpc = 0.0000001
        len_elements = len(self.setting['elements'])
        len_pca = len(self.setting['pca'])

        print 'calcAtom2', len_pca, len_elements

        if len_elements != len_pca + 1:
            print 'error len'
            sys.exit(0)

        for p in self.setting['pca']:
            sumpc +=p

        if sumpc >= 100 or sumpc <= 0:
            print 'error pc'
            sys.exit(0)

        sumpc = 0

        for i in range(len(self.setting['elements']) - 1):
            p = self.setting['pca'][i]
            sumpc +=p
            t = int(p * self.setting['nAtoms'] / 100.0)
            sum_ +=t
            nAt.append(t)

        nAt.append(self.setting['nAtoms'] - sum_)

        self.setting['nAtoms'] = 0
        for e in nAt: 
            self.setting['nAtoms'] +=e

        print 'pca', self.setting['pca']
        self.setting['nAt'] =  nAt 


    def getMasess(self):
        str_ =''
        i = 1
        for e in self.elsProps:
            str_ += 'mass ' + str(i) + ' ' +str(e['mass']) + '\n'
            i+=1
        return  str_