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()
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()
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
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
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