Пример #1
0
def write_siesta_struct(atoms, cell1, cell2, cell3, cellparameter):
    #---------------STRUCT.fdf----------------
    fileS = open('STRUCT.fdf', 'w')
    natm = len(atoms)
    fileS.write("NumberOfAtoms    %d           # Number of atoms\n" % natm)
    unique_symbs = get_unique_symbs(atoms)
    fileS.write("NumberOfSpecies  %d           # Number of species\n\n" % len(unique_symbs))
    fileS.write("%block ChemicalSpeciesLabel\n")

    for symb in unique_symbs:
        fileS.write(" %d %d %s\n" % (unique_symbs.index(symb)+1,atomic_number(symb),symb) )
    fileS.write("%endblock ChemicalSpeciesLabel\n")

    #Lattice
    fileS.write("\n#(3) Lattice, coordinates, k-sampling\n\n")
    fileS.write("LatticeConstant   %15.9f Ang\n" % cellparameter)
    fileS.write("%block LatticeVectors\n")
    #va,vb,vc = atoms.get_cell()
    va, vb, vc = cell1, cell2, cell3
    fileS.write("%15.9f %15.9f %15.9f\n" % tuple(va))
    fileS.write("%15.9f %15.9f %15.9f\n" % tuple(vb))
    fileS.write("%15.9f %15.9f %15.9f\n" % tuple(vc))
    fileS.write("%endblock LatticeVectors\n\n")

    #Coordinates
    fileS.write("AtomicCoordinatesFormat Ang\n")
    fileS.write("%block AtomicCoordinatesAndAtomicSpecies\n")

    for atom in atoms:
        x,y,z = atom.get_position(); symb = atom.get_symbol()
        fileS.write(" %15.9f %15.9f %15.9f %4d %4d\n" %\
                   (x,y,z,unique_symbs.index(symb)+1, atom.get_serial()))
        
    fileS.write("%endblock AtomicCoordinatesAndAtomicSpecies\n")
    fileS.close()
Пример #2
0
def write_siesta_basis(atoms, param_scf='LDA'):
    #--------------BASIS.fdf---------------
    fileB = open('BASIS.fdf', 'w')
    unique_symbs = get_unique_symbs(atoms)
    print unique_symbs
    fileB.write("\n#(1) Basis definition\n\n")
    fileB.write("%block PAO.Basis\n")
    fileB.write("\n")

    for symb in unique_symbs:
        if param_scf == 'GGA':
            f = open('%s.txt_GGA' % symb)
            basis_info = f.readlines()
            print basis_info
            for info in basis_info:
                fileB.write(info)
            fileB.write("\n")

        elif param_scf =='LDA':
            f = open('%s.txt_LDA' % symb)
            basis_info = f.readlines()
            print basis_info
            for info in basis_info:
                fileB.write(info)
            fileB.write("\n")

        else: print "Unknown parameter : %s\n" % param_scf

    fileB.write("%endblock PAO.Basis\n\n")
    fileB.close()    
Пример #3
0
def make_seqquest_positions(atoms):
    # positions
    atoms1 = []
    atoms1.append("atom types\n")
    unique_symbs = get_unique_symbs(atoms)
    atoms1.append(" %d \n" % len(unique_symbs))
    for symb in unique_symbs:
        atoms1.append("atom file\n")
        atoms1.append(" %s.atm\n" % symb)
    atoms1.append("number of atoms in unit cell\n")
    atoms1.append(" %d\n" % len(atoms))
    atoms1.append("atom, type, position vector\n")
    n = 1
    for atom in atoms:
        symb = atom.get_symbol(); x,y,z = atom.get_position()
        atoms1.append(" %4d %3d %15.9f %15.9f %15.9f\n" % \
                     (n,unique_symbs.index(symb)+1,
                      x*ang2bohr,y*ang2bohr,z*ang2bohr))
        n = n + 1
    return atoms1
Пример #4
0
def make_seqquest_positions(atoms):
    # positions
    atoms1 = []
    atoms1.append("atom types\n")
    unique_symbs = get_unique_symbs(atoms)
    atoms1.append(" %d \n" % len(unique_symbs))
    for symb in unique_symbs:
        atoms1.append("atom file\n")
        atoms1.append(" %s.atm\n" % symb)
    atoms1.append("number of atoms in unit cell\n")
    atoms1.append(" %d\n" % len(atoms))
    atoms1.append("atom, type, position vector\n")
    n = 1
    for atom in atoms:
        symb = atom.get_symbol()
        x, y, z = atom.get_position()
        atoms1.append(" %4d %3d %15.9f %15.9f %15.9f\n" % \
                     (n,unique_symbs.index(symb)+1,
                      x*ang2bohr,y*ang2bohr,z*ang2bohr))
        n = n + 1
    return atoms1
Пример #5
0
def write_siesta(atoms, params_opt, params_scf, params_post):
    print 'Writing SIESTA input ...'
    #--------------STRUCT.fdf--------------
    write_siesta_struct(atoms, params_scf['CellVector1'], params_scf['CellVector2'], params_scf['CellVector3'],
			params_scf['CellParameter'])
    
    #--------------BASIS.fdf---------------
    #write_siesta_basis(atoms, params_scf['XCfunc'])
    fileB = open('BASIS.fdf', 'w')
    unique_symbs = get_unique_symbs(atoms)
    fileB.write("\n#(1) Basis definition\n\n")
    fileB.write("PAO.BasisSize %s\n" % params_scf['Basis'])
    fileB.close()
    
    
    #--------------KPT.fdf-----------------
    fileK = open('KPT.fdf','w')   
    fileK.write("%block kgrid_Monkhorst_Pack\n")
    fileK.write("   %i   0   0   0.5\n" %params_scf['kgrid'][0])
    fileK.write("   0   %i   0   0.5\n" %params_scf['kgrid'][1])
    fileK.write("   0   0   %i   0.5\n" %params_scf['kgrid'][2])
    fileK.write("%endblock kgrid_Monkhorst_Pack\n")
    fileK.close()
    
    #--------------RUN.fdf-----------------
    file = open('RUN.fdf', 'w')
    file.write("#(1) General system descriptors\n\n")
    file.write("SystemName       %s           # Descriptive name of the system\n" % params_opt['Name'])
    file.write("SystemLabel      %s           # Short name for naming files\n" % params_opt['Label'])    
    file.write("%include STRUCT.fdf\n")
    file.write("%include KPT.fdf\n")
    file.write("%include BASIS.fdf\n")
    #if params_scf['Solution'][0] == 't' or params_scf['Solution'][0] == 'T':
    #    file.write("%include TS.fdf\n")
    #if params_post['Denchar']==1:
    #    file.write("%include DENC.fdf\n")

    ## XC OPTIONS ##
    file.write("\n#(4) DFT, Grid, SCF\n\n")
    file.write("XC.functional         %s            # LDA or GGA (default = LDA)\n" % params_scf['XCfunc'])
    file.write("XC.authors            %s            # CA (Ceperley-Aldr) = PZ\n" % params_scf['XCauthor'])
    #file.write("                                    #    (Perdew-Zunger) - LDA - Default\n")
    #file.write("                                    # PW92 (Perdew-Wang-92) - LDA\n")
    #file.write("                                    # PBE (Perdew-Burke-Ernzerhof) - GGA\n")
    file.write("MeshCutoff            %f    Ry      # Default: 50.0 Ry ~ 0.444 Bohr\n" % params_scf['MeshCutoff'])

    ## SCF OPTIONS ##   
    file.write("                                    #         100.0 Ry ~ 0.314 Bohr\n")
    file.write("MaxSCFIterations      %d           # Default: 50\n" % params_scf['MaxIt'])
    file.write("DM.MixingWeight       %3.2f          # Default: 0.25\n" % params_scf['MixingWt'])
    file.write("DM.NumberPulay        %d             # Default: 0\n" % params_scf['Npulay'])
    file.write("DM.PulayOnFile        F             # SystemLabel.P1, SystemLabel.P2\n")
    file.write("DM.Tolerance          1.d-4         # Default: 1.d-4\n")
    file.write("DM.UseSaveDM          .true.        # because of the bug\n")
    file.write("SCFMustConverge       .true.        \n")
    file.write("NeglNonOverlapInt     F             # Default: F\n")
    file.write("\n#(5) Eigenvalue problem: order-N or diagonalization\n\n")
    file.write("SolutionMethod        %s \n"  %params_scf['Solution'])
    file.write("ElectronicTemperature %4.1f K       # Default: 300.0 K\n" %params_scf['Temp'])
    file.write("Diag.ParallelOverK    true\n\n")
    ## Calculation OPTIONS ##
    # Now available : CG / MD / LDOS
  
    if params_opt['Optimization'] == 1:
        file.write("\n#(6) Molecular dynamics and relaxations\n\n")
        file.write("MD.TypeOfRun          %s             # Type of dynamics:\n" %params_opt['Run'])
        #file.write("                                    #   - CG\n")
        #file.write("                                    #   - Verlet\n")
        #file.write("                                    #   - Nose\n")
        #file.write("                                    #   - ParrinelloRahman\n")
        #file.write("                                    #   - NoseParrinelloRahman\n")
        #file.write("                                    #   - Anneal\n")
        #file.write("                                    #   - FC\n")
        #file.write("                                    #   - Phonon\n")
        #file.write("MD.VariableCell       %s\n" %params_opt['cell_opt'])
        file.write("MD.NumCGsteps         %d            # Default: 0\n" % params_opt['CGsteps'])
        #file.write("MD.MaxCGDispl         0.1 Ang       # Default: 0.2 Bohr\n")
        file.write("MD.MaxForceTol        %f eV/Ang  # Default: 0.04 eV/Ang\n" % params_opt['ForceTol'])
        #file.write("MD.MaxStressTol       1.0 GPa       # Default: 1.0 GPa\n")

    if params_opt['MD'] == 1:
        file.write("\n#(6) Molecular dynamics and relaxations\n\n")
        file.write("MD.TypeOfRun          %s            # Type of dynamics:\n" % params_opt['Run'])
        #file.write("MD.VariableCell       %s\n" %params_opt['cell_opt'])
        file.write("MD.NumCGsteps         %d            # Default: 0\n" % params_opt['CGsteps'])
        #file.write("MD.MaxCGDispl         0.1 Ang       # Default: 0.2 Bohr\n")
        file.write("MD.MaxForceTol        %f eV/Ang  # Default: 0.04 eV/Ang\n" % params_opt['ForceTol'])
        #file.write("MD.MaxStressTol       1.0 GPa       # Default: 1.0 GPa\n")
        file.write("MD.InitialTimeStep    1\n")
        file.write("MD.FinalTimeStep      %i\n" % params_opt['MDsteps'])
	file.write("MD.LengthTimeStep     %f fs      # Default : 1.0 fs\n" % params_opt['MDTimeStep'])
        file.write("MD.InitialTemperature %f K       # Default : 0.0 K\n"  % params_opt['MDInitTemp'])
        file.write("MD.TargetTemperature  %f K       # Default : 0.0 K\n"  % params_opt['MDTargTemp'])
        file.write("WriteCoorStep         %s         # default : .false.\n"% params_opt['WriteCoorStep'])
        
    if params_post['LDOS'] == 1:
        file.write("# LDOS \n\n")
        file.write("%block LocalDensityOfStates\n")
        file.write(" %f %f eV\n" %(params_post['LDOSE'][0],params_post['LDOSE'][1]))
        file.write("%endblock LocalDensityOfStates\n")
    if params_post['PDOS'] == 1:
	file.write("%block ProjectedDensityOfStates\n")
	file.write(" %f %f %f %i eV\n" % tuple(params_post['PDOSE'])) #-20.00 10.00 0.200 500 eV Emin Emax broad Ngrid
	file.write("%endblock ProjectedDensityOfStates\n")
    #file.write("%block GeometryConstraints\n")
    #file.write("#position from 1 to %d\n" % natm)
    #file.write("stress 4 5 6\n")
    #file.write("%endblock GeometryConstraints\n")
    #file.write("kgrid_cutoff 15.0 Ang\n")
    #file.write("ProjectedDensityOfStates\n")
                   
    ## OUT OPTIONS ##
    #file.write("\n#(9) Output options\n\n")
    #file.write("WriteCoorInitial      F      # SystemLabel.out\n")
    #file.write("WriteKpoints          F      # SystemLabel.out\n")
    #file.write("WriteEigenvalues      F      # SystemLabel.out [otherwise ~.EIG]\n")
    #file.write("WriteKbands           T      # SystemLabel.out, band structure\n")
    #file.write("WriteBands            T      # SystemLabel.bands, band structure\n")
    #file.write("WriteMDXmol           F      # SystemLabel.ANI\n")
    #file.write("WriteCoorXmol        .true.  \n")
    #file.write("WriteDM.NetCDF        F      \n")
    #file.write("WriteDMHS.NetCDF      F      \n")
    #file.write("AllocReportLevel      0      # SystemLabel.alloc, Default: 0\n")
    #file.write("%include banddata\n")
    #file.write("""%block BandLines
# 1  1.000  1.000  1.000  L        # Begin at L
#20  0.000  0.000  0.000  \Gamma   # 20 points from L to gamma
#25  2.000  0.000  0.000  X        # 25 points from gamma to X
#30  2.000  2.000  2.000  \Gamma   # 30 points from X to gamma
#%endblock BandLines""")
  
    #file.write("\n#(10) Options for saving/reading information\n\n")
    #file.write("SaveHS                F      # SystemLabel.HS\n")
    #file.write("SaveRho               F      # SystemLabel.RHO\n")
    #file.write("SaveDeltaRho          F      # SystemLabel.DRHO\n")
    #file.write("SaveNeutralAtomPotential F   # SystemLabel.VNA\n")
    #file.write("SaveIonicCharge       F      # SystemLabel.IOCH\n")
    #file.write("SaveElectrostaticPotential F # SystemLabel.VH\n")
    #file.write("SaveTotalPotential    F      # SystemLabel.VT\n")
    #file.write("SaveTotalCharge       F      # SystemLabel.TOCH\n")
    #file.write("SaveInitialChargeDenaisty F  # SystemLabel.RHOINIT\n")
    file.close()

    #---------------TS.fdf-------------------#
    ## TRANSIESTA OPTIONS ##

    if (params_scf['Solution'][0] == 't') or (params_scf['Solution'][0] == 'T'):
        fileT = open('TS.fdf', 'w')
        fileT.write("TS.WriteHS  .true.\n")
        fileT.write("TS.SaveHS   .true.\n")
        fileT.write("TS.NumUsedAtomsLeft  %d\n" %Nleft)
        fileT.write("TS.NumUsedAtomsRight %d\n" %Nright)

        cur_dir = os.getcwd()
        os.chdir(L_loc)
        L_file = glob.glob('*.TSHS')[0]
        os.chdir(R_loc)
        R_file = glob.glob('*.TSHS')[0]
        os.chdir(cur_dir)
        
        fileT.write("TS.HSFileLeft  './%s'\n"%L_file)
        fileT.write("TS.HSFileRight  './%s'\n"%R_file)
        #fileT.write("TS.HSFileLeft  '%s'\n" %L_loc)
        #fileT.write("TS.HSFileRight '%s'\n" %R_loc)
        fileT.write("TS.TBT.HSFile   './%s.TSHS'\n" %params_opt['Label'])
        fileT.write("TS.TBT.Emin    -2.0 eV\n")
        fileT.write("TS.TBT.Emax     2.0 eV\n")
        fileT.write("TS.TBT.NPoints   201\n")
        fileT.close()

    #---------------DENC.fdf-------------------#
    ## DENCHAR OPTIONS ##
    if params_post['Denchar']==1:
        fileD = open('DENC.fdf', 'w')
        fileD.write("COOP.Write             T # to get WFS\n")
        #fileD.write("WFS.EnergyMin -0.1 eV #Control! \n")
        #fileD.write("WFS.EnergyMax 0.1 eV #Control! \n")
        fileD.write("WriteDenchar T #SystemLabel.PLD --> .DM & .WFS : run wfsx2wfs (WFSX --> WFS)\n")
        fileD.write("Denchar.TypeOfRun  3D\n")
        fileD.write("Denchar.PlotCharge T  #.DM should exist\n")
        fileD.write("Denchar.PlotWaveFunctions  T #.WFS should exist\n")
        fileD.write("Denchar.CoorUnits  Ang #Ang or Bohr\n")
        fileD.write("Denchar.DensityUnits Ele/Ang**3  #Ele/Bohr**3, Ele/Ang**3, or Ele/UnitCell\n")
        fileD.write("Denchar.NumberPointsX   100  #grid X\n")
        fileD.write("Denchar.NumberPointsY   100  #grid Y\n")        
        fileD.write("Denchar.NumberPointsZ   100  #grid Z, only when Denchar.TypeOfRun=3D\n")
        ### GRID : Not sure ... Test needed. ###
        fileD.write("Denchar.MinX            0.0 bohr\n")
        fileD.write("Denchar.MinY            0.0 bohr\n")
        fileD.write("Denchar.MinZ            0.0 bohr\n")
        fileD.write("Denchar.MaxX            %f bohr\n" %(tuple(vc)[2]*ang2bohr))
        fileD.write("Denchar.MinY            %f bohr\n" %(tuple(vb)[1]*ang2bohr))
        fileD.write("Denchar.MinZ            %f bohr\n" %(tuple(va)[0]*ang2bohr))
        fileD.write("Denchar.PlaneGeneration NormalVector #NormalVector, TwoLines, ThreePoints, or ThreeAtomicIndices \n")
        fileD.write("""%block WaveFuncKPoints
0.0 0.0 0.0 from X to Y  #at Gamma point, Eigenvalue from X to Y #<-- put the X and Y
%endblock WaveFuncKpoints """)
        fileD.write("""%block Denchar.CompNormalVector
0.0 0.00 1.00
%endblock Denchar.CompNormalVector
#only when PlaneGeneration = NormalVector\n""")
        fileD.write("""%block Denchar.PlaneOrigin
0.00 0.00 0.00
%endblock Denchar.PlaneOrigin\n""")
        #fileD.write("Denchar.X-Axis          T\n")
        fileD.write("""%block Denchar.AtomsInPlane
 1
 2
 3
%endblock Denchar.AtomsInPlane\n""")
        fileD.write("""%block Denchar.X_Axis
1.0000 0.0000 0.0000
%endblock Denchar.X_Axis""")
        fileD.close()
    return