def write_input(self, atoms, properties=None, system_changes=None): FileIOCalculator.write_input(self, atoms, properties, system_changes) p = self.parameters p.initial_magmoms = atoms.get_initial_magnetic_moments().tolist() p.write(self.label + '.ase') del p['initial_magmoms'] f = open(self.label + '.nw', 'w') if p.charge is not None: f.write('charge %s\n' % p.charge) write_nwchem(f, atoms, p.geometry) f.write('start\n') if p.basispar is not None: basispar = 'basis ' + p.basispar else: basispar = 'basis' def format_basis_set(string, tag=basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string return formatted + '\nend\n' basis = format_basis_set(p.basis) if p.ecp is not None: basis += format_basis_set(p.ecp, 'ecp') if p.so is not None: basis += format_basis_set(p.so, 'so') f.write(basis) if p.xc == 'RHF': task = 'scf' elif p.xc == 'MP2': task = 'mp2' else: if p.spinorbit: task = 'sodft' elif p.tddft: task = 'tddft' else: task = 'dft' xc = {'LDA': 'slater pw91lda', 'PBE': 'xpbe96 cpbe96', 'revPBE': 'revpbe cpbe96', 'RPBE': 'rpbe cpbe96', 'CAM-B3LYP': 'xcamb88 1.00 lyp 0.81 vwn_5 0.19 hfexch 1.00'}.get(p.xc, p.xc) if p.tddft: f.write('\n' + 'dft' + '\n') else: f.write('\n' + task + '\n') f.write(' xc ' + xc + '\n') if p.xc == 'CAM-B3LYP': f.write(' cam 0.33 cam_alpha 0.19 cam_beta 0.46\n') f.write(' direct\n') for key in p.convergence: if p.convergence[key] is not None: if key == 'lshift': if p.convergence[key] <= 0.0: f.write(' convergence nolevelshifting\n') else: f.write(' convergence %s %s\n' % (key, p.convergence[key] / Hartree)) else: f.write(' convergence %s %s\n' % (key, p.convergence[key])) if p.smearing is not None: assert p.smearing[0].lower() == 'gaussian', p.smearing f.write(' smear %s\n' % (p.smearing[1] / Hartree)) if 'mult' not in p: # Obtain multiplicity from magnetic momenta: tot_magmom = atoms.get_initial_magnetic_moments().sum() if tot_magmom < 0: mult = tot_magmom - 1 # fill minority bands else: mult = tot_magmom + 1 else: mult = p.mult if mult != int(mult): raise RuntimeError('Noninteger multiplicity not possible. ' + 'Check initial magnetic moments.') f.write(' mult %d\n' % mult) if p.odft: f.write(' odft\n') # open shell aka spin polarized dft for key in sorted(p.keys()): if key in ['charge', 'geometry', 'basis', 'basispar', 'ecp', 'so', 'xc', 'spinorbit', 'convergence', 'smearing', 'raw', 'mult', 'task', 'odft', 'tddft']: continue f.write(u" {0} {1}\n".format(key, p[key])) f.write('end\n') if p.raw: f.write(p.raw + '\n') f.write('\ntask ' + task + ' ' + p.task + '\n') f.close()
def write_input(self, atoms, properties=None, system_changes=None): FileIOCalculator.write_input(self, atoms, properties, system_changes) p = self.parameters p.initial_magmoms = atoms.get_initial_magnetic_moments().tolist() p.write(self.label + '.ase') del p['initial_magmoms'] f = open(self.label + '.nw', 'w') if p.charge is not None: f.write('charge %s\n' % p.charge) write_nwchem(f, atoms, p.geometry) f.write('start\n') if p.scratch_dir is not None: f.write('scratch_dir %s\n' % p.scratch_dir) if p.permanent_dir is not None: f.write('permanent_dir %s\n' % p.permanent_dir) if p.mepgs is not None: mepgs = 'mepgs\n' if p.maxmep is not None: mepgs += ' maxmep %i\n'%p.maxmep if p.maxiter is not None: mepgs += ' maxiter %i\n'%p.maxiter if p.inhess is not None: mepgs += ' inhess %i\n'%p.inhess if p.xyz is not None: if p.xyz: mepgs += ' xyz\n' if p.evib is not None: mepgs += ' evib %f\n'%p.evib if p.stride is not None: mepgs += ' stride %f\n'%p.stride if p.direction is not None: mepgs += ' %s\n'%p.direction mepgs += 'end\n' f.write(mepgs) if p.driver is not None: driver = 'driver\n %s\n'%p.driver if p.maxiter is not None: driver += ' maxiter %i\n'%p.maxiter if p.clear is not None: if p.clear: driver += ' clear\n' if p.inhess is not None: driver += ' inhess %i\n'%p.inhess driver += 'end\n' f.write(driver) if p.basispar is not None: basispar = 'basis ' + p.basispar else: basispar = 'basis' if len(p.change) + len(p.fix) > 0: f.write('geometry adjust\nzcoord\n') for c in p.fix: #iterate the constraints if len(c) == 2: f.write(' bond {} constant\n'.format(' '.join(map(str,c)))) if len(c) == 3: f.write(' angle {} constant\n'.format(' '.join(map(str,c)))) if len(c) == 4: f.write(' torsion {} constant\n'.format(' '.join(map(str,c)))) for c in p.change: #iterate the constraints if len(c) == 3: f.write(' bond {} {} constant\n'.format(' '.join(map(str,c[:2])),c[2])) if len(c) == 4: f.write(' angle {} {} constant\n'.format(' '.join(map(str,c[:3])),c[3])) if len(c) == 5: f.write(' torsion {} {} constant\n'.format(' '.join(map(str,c[:4])),c[4])) f.write('end\nend\n') def format_basis_set(string, tag=basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string return formatted + '\nend\n' basis = format_basis_set(p.basis) if p.ecp is not None: basis += format_basis_set(p.ecp, 'ecp') if p.so is not None: basis += format_basis_set(p.so, 'so') f.write(basis) if p.xc == 'RHF': task = 'scf' elif p.xc == 'MP2': task = 'mp2' else: if p.spinorbit: task = 'sodft' else: task = 'dft' xc = {'LDA': 'slater pw91lda', 'PBE': 'xpbe96 cpbe96', 'revPBE': 'revpbe cpbe96', 'RPBE': 'rpbe cpbe96'}.get(p.xc, p.xc) f.write('\n' + task + '\n') f.write(' xc ' + xc + '\n') for key in p.convergence: if p.convergence[key] is not None: if key == 'lshift': if p.convergence[key] <= 0.0: f.write(' convergence nolevelshifting\n') else: f.write(' convergence %s %s\n' % (key, p.convergence[key] / Hartree)) else: f.write(' convergence %s %s\n' % (key, p.convergence[key])) if p.smearing is not None: assert p.smearing[0].lower() == 'gaussian', p.smearing f.write(' smear %s\n' % (p.smearing[1] / Hartree)) if 'mult' not in p: # Obtain multiplicity from magnetic momenta: tot_magmom = atoms.get_initial_magnetic_moments().sum() if tot_magmom < 0: mult = tot_magmom - 1 # fill minority bands else: mult = tot_magmom + 1 else: mult = p.mult if mult != int(mult): raise RuntimeError('Noninteger multiplicity not possible. ' + 'Check initial magnetic moments.') f.write(' mult %d\n' % mult) if p.odft: f.write(' odft\n') # open shell aka spin polarized dft for key in sorted(p.keys()): if key in ['charge', 'geometry', 'basis', 'basispar', 'ecp', 'so', 'xc', 'spinorbit', 'convergence', 'smearing', 'raw', 'mult', 'task', 'odft','scratch_dir', 'permanent_dir', 'change','fix','release', 'driver','maxiter', 'maxmep','clear','inhess', 'xyz','evib','stride', 'direction', 'mepgs']: continue f.write(u" {0} {1}\n".format(key, p[key])) f.write('end\n') if p.raw: f.write(p.raw + '\n') f.write('\ntask ' + task + ' ' + p.task + '\n') f.close()
def write_input(self, atoms, properties=None, system_changes=None): FileIOCalculator.write_input(self, atoms, properties, system_changes) p = self.parameters p.initial_magmoms = atoms.get_initial_magnetic_moments().tolist() p.write(self.label + '.ase') del p['initial_magmoms'] f = open(self.label + '.nw', 'w') if p.charge is not None: f.write('charge %s\n' % p.charge) write_nwchem(f, atoms, p.geometry) f.write('start\n') if p.basispar is not None: basispar = 'basis ' + p.basispar else: basispar = 'basis' def format_basis_set(string, tag=basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string return formatted + '\nend\n' basis = format_basis_set(p.basis) if p.ecp is not None: basis += format_basis_set(p.ecp, 'ecp') if p.so is not None: basis += format_basis_set(p.so, 'so') f.write(basis) if p.xc == 'RHF': task = 'scf' elif p.xc == 'MP2': task = 'mp2' else: if p.spinorbit: task = 'sodft' else: task = 'dft' xc = {'LDA': 'slater pw91lda', 'PBE': 'xpbe96 cpbe96', 'revPBE': 'revpbe cpbe96', 'RPBE': 'rpbe cpbe96'}.get(p.xc, p.xc) f.write('\n' + task + '\n') f.write(' xc ' + xc + '\n') for key in p.convergence: if p.convergence[key] is not None: if key == 'lshift': if p.convergence[key] <= 0.0: f.write(' convergence nolevelshifting\n') else: f.write(' convergence %s %s\n' % (key, p.convergence[key] / Hartree)) else: f.write(' convergence %s %s\n' % (key, p.convergence[key])) if p.smearing is not None: assert p.smearing[0].lower() == 'gaussian', p.smearing f.write(' smear %s\n' % (p.smearing[1] / Hartree)) if 'mult' not in p: # Obtain multiplicity from magnetic momenta: tot_magmom = atoms.get_initial_magnetic_moments().sum() if tot_magmom < 0: mult = tot_magmom - 1 # fill minority bands else: mult = tot_magmom + 1 else: mult = p.mult if mult != int(mult): raise RuntimeError('Noninteger multiplicity not possible. ' + 'Check initial magnetic moments.') f.write(' mult %d\n' % mult) if p.odft: f.write(' odft\n') # open shell aka spin polarized dft for key in sorted(p.keys()): if key in ['charge', 'geometry', 'basis', 'basispar', 'ecp', 'so', 'xc', 'spinorbit', 'convergence', 'smearing', 'raw', 'mult', 'task', 'odft']: continue f.write(u" {0} {1}\n".format(key, p[key])) f.write('end\n') if p.raw: f.write(p.raw + '\n') f.write('\ntask ' + task + ' ' + p.task + '\n') f.close()
def get_potential_energy(self, atoms): # update atoms self.set_atoms(atoms) # if update of energy is neccessary if self.energy is None or self.forces is None: # write input file f = open(self.label + '.nw', 'w') if self.charge is not None: f.write('charge ' + str(self.charge) + '\n') write_nwchem(f, atoms, self.geometry) def format_basis_set(string, tag=self.basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string + '\n' return formatted + 'end\n' basis = format_basis_set(self.basis) if self.ecp is not None: basis += format_basis_set(self.ecp, 'ecp') if self.so is not None: basis += format_basis_set(self.so, 'so') f.write(basis) if self.xc == 'RHF': task = 'scf' else: if self.spinorbit: task = 'sodft' else: task = 'dft' nwchem_xc_map = { 'LDA': 'slater pw91lda', 'PBE': 'xpbe96 cpbe96', } if self.xc in nwchem_xc_map: xc = nwchem_xc_map[self.xc] else: xc = self.xc f.write('\n' + task + '\n') f.write(' mult ' + str(self.multiplicity) + '\n') f.write(' xc ' + xc + '\n') f.write(' iterations ' + str(self.maxiter) + '\n') for key in self.convergence: if key == 'lshift': if self.convergence[key] is not None: if not (self.convergence[key] > 0.0): f.write(' convergence nolevelshifting\n') else: f.write(' convergence ' + key + ' ' + str(self.convergence[key] / Hartree) + '\n') else: if self.convergence[key] is not None: f.write(' convergence ' + key + ' ' + str(self.convergence[key]) + '\n') if self.smear is not None: f.write(' smear ' + str(self.smear) + '\n') if self.grid is not None: f.write(' grid ' + str(self.grid) + '\n') if self.tolerances is not None: f.write(' tolerances ' + str(self.tolerances) + '\n') if self.cgmin: f.write(' cgmin\n') if self.dftcontrol: f.write(self.dftcontrol + '\n') f.write('end\n') if self.control: f.write(self.control + '\n') # f.write('\ntask ' + task + ' gradient\n') f.write('\ntask ' + task + ' ' + self.task + '\n') f.close() # calculate energy self.output = self.label + '.out' self.run() # read output self.read_energy() if self.task.find('gradient') > -1: self.read_forces() self.niter = self.read_number_of_iterations() self.nelect = self.read_number_of_electrons() self.nvector = self.read_number_of_bands() self.magnetic_moment = self.read_magnetic_moment() self.electronic_temperature = self.read_smear() * Hartree self.dipole = self.read_dipole_moment() else: print 'taking old values (E)' return self.energy * Hartree
def write_input(self, atoms, properties=None, system_changes=None): FileIOCalculator.write_input(self, atoms, properties, system_changes) p = self.parameters p.magmoms = atoms.get_initial_magnetic_moments().tolist() p.write(self.label + '.ase') del p['magmoms'] f = open(self.label + '.nw', 'w') if p.charge is not None: f.write('charge %s\n' % p.charge) write_nwchem(f, atoms, p.geometry) f.write('start\n') if p.basispar is not None: basispar = 'basis ' + p.basispar else: basispar = 'basis' def format_basis_set(string, tag=basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string + '\n' return formatted + 'end\n' basis = format_basis_set(p.basis) if p.ecp is not None: basis += format_basis_set(p.ecp, 'ecp') if p.so is not None: basis += format_basis_set(p.so, 'so') f.write(basis) if p.xc == 'RHF': task = 'scf' elif p.xc == 'MP2': task = 'mp2' else: if p.spinorbit: task = 'sodft' else: task = 'dft' xc = { 'LDA': 'slater pw91lda', 'PBE': 'xpbe96 cpbe96' }.get(p.xc, p.xc) f.write('\n' + task + '\n') f.write(' xc ' + xc + '\n') for key in p.convergence: if p.convergence[key] is not None: if key == 'lshift': if p.convergence[key] <= 0.0: f.write(' convergence nolevelshifting\n') else: f.write(' convergence %s %s\n' % (key, p.convergence[key] / Hartree)) else: f.write(' convergence %s %s\n' % (key, p.convergence[key])) if p.smearing is not None: assert p.smearing[0].lower() == 'gaussian', p.smearing f.write(' smear %s\n' % (p.smearing[1] / Hartree)) if 'mult' not in p: # Obtain multiplicity from magnetic momenta: mult = 1 + atoms.get_initial_magnetic_moments().sum() else: mult = p.mult if mult != int(mult): raise RuntimeError('Noninteger multiplicity not possible. ' + 'Check initial magnetic moments.') f.write(' mult %d\n' % mult) for key in sorted(p.keys()): if key in [ 'charge', 'geometry', 'basis', 'basispar', 'ecp', 'so', 'xc', 'spinorbit', 'convergence', 'smearing', 'raw', 'mult', 'task' ]: continue value = p[key] f.write('%s %s\n' % (key, value)) f.write('end\n') if p.raw: f.write(p.raw + '\n') f.write('\ntask ' + task + ' ' + p.task + '\n') f.close()
def write_input(self, atoms, properties=None, system_changes=None): FileIOCalculator.write_input(self, atoms, properties, system_changes) p = self.parameters p.magmoms = atoms.get_initial_magnetic_moments().tolist() p.write(self.label + ".ase") del p["magmoms"] f = open(self.label + ".nw", "w") if p.charge is not None: f.write("charge %s\n" % p.charge) write_nwchem(f, atoms, p.geometry) f.write("start\n") if p.basispar is not None: basispar = "basis " + p.basispar else: basispar = "basis" def format_basis_set(string, tag=basispar): formatted = tag + "\n" lines = string.split("\n") if len(lines) > 1: formatted += string else: formatted += " * library " + string + "\n" return formatted + "end\n" basis = format_basis_set(p.basis) if p.ecp is not None: basis += format_basis_set(p.ecp, "ecp") if p.so is not None: basis += format_basis_set(p.so, "so") f.write(basis) if p.xc == "RHF": task = "scf" else: if p.spinorbit: task = "sodft" else: task = "dft" xc = {"LDA": "slater pw91lda", "PBE": "xpbe96 cpbe96"}.get(p.xc, p.xc) f.write("\n" + task + "\n") f.write(" xc " + xc + "\n") for key in p.convergence: if p.convergence[key] is not None: if key == "lshift": if p.convergence[key] <= 0.0: f.write(" convergence nolevelshifting\n") else: f.write(" convergence %s %s\n" % (key, p.convergence[key] / Hartree)) else: f.write(" convergence %s %s\n" % (key, p.convergence[key])) if p.smearing is not None: assert p.smearing[0].lower() == "gaussian" f.write(" smear %s\n" % (p.smearing[1] / Hartree)) if "mult" not in p: # Obtain multiplicity from magnetic momenta: mult = 1 + atoms.get_initial_magnetic_moments().sum() else: mult = p.mult if mult != int(mult): raise RuntimeError("Noninteger multiplicity not possible. " + "Check initial magnetic moments.") f.write(" mult %d\n" % mult) for key in sorted(p.keys()): if key in [ "charge", "geometry", "basis", "basispar", "ecp", "so", "xc", "spinorbit", "convergence", "smearing", "raw", "mult", "task", ]: continue value = p[key] f.write("%s %s\n" % (key, value)) f.write("end\n") if p.raw: f.write(p.raw + "\n") f.write("\ntask " + task + " " + p.task + "\n") f.close()
def get_potential_energy(self, atoms): # update atoms self.set_atoms(atoms) # if update of energy is neccessary if self.energy is None or self.forces is None: # write input file f = open(self.label + '.nw', 'w') if self.charge is not None: f.write('charge ' + str(self.charge) + '\n') write_nwchem(f, atoms, self.geometry) def format_basis_set(string, tag=self.basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string + '\n' return formatted + 'end\n' basis = format_basis_set(self.basis) if self.ecp is not None: basis += format_basis_set(self.ecp, 'ecp') if self.so is not None: basis += format_basis_set(self.so, 'so') f.write(basis) if self.xc == 'RHF': task = 'scf' else: if self.spinorbit: task = 'sodft' else: task = 'dft' nwchem_xc_map = { 'LDA' : 'slater pw91lda', 'PBE' : 'xpbe96 cpbe96', } if self.xc in nwchem_xc_map: xc = nwchem_xc_map[self.xc] else: xc = self.xc f.write('\n' + task + '\n') f.write(' mult ' + str(self.multiplicity) + '\n') f.write(' xc ' + xc + '\n') f.write(' iterations ' + str(self.maxiter) + '\n') for key in self.convergence: if key == 'lshift': if self.convergence[key] is not None: if not (self.convergence[key] > 0.0): f.write(' convergence nolevelshifting\n') else: f.write(' convergence ' + key + ' ' + str(self.convergence[key]/Hartree) + '\n') else: if self.convergence[key] is not None: f.write(' convergence ' + key + ' ' + str(self.convergence[key]) + '\n') if self.smear is not None: f.write(' smear ' + str(self.smear) + '\n') if self.grid is not None: f.write(' grid ' + str(self.grid) + '\n') if self.tolerances is not None: f.write(' tolerances ' + str(self.tolerances) + '\n') if self.cgmin: f.write(' cgmin\n') if self.dftcontrol: f.write(self.dftcontrol + '\n') f.write('end\n') if self.control: f.write(self.control + '\n') # f.write('\ntask ' + task + ' gradient\n') f.write('\ntask ' + task + ' ' + self.task + '\n') f.close() # calculate energy self.output = self.label + '.out' self.run() # read output self.atoms = read_nwchem(self.output) self.read_energy() if self.task.find('gradient') > -1: self.read_forces() self.niter = self.read_number_of_iterations() self.nelect = self.read_number_of_electrons() self.nvector = self.read_number_of_bands() self.magnetic_moment = self.read_magnetic_moment() self.electronic_temperature = self.read_smear() * Hartree self.dipole = self.read_dipole_moment() else: print 'taking old values (E)' return self.energy * Hartree
def write_input(self, atoms, properties=None, system_changes=None): FileIOCalculator.write_input(self, atoms, properties, system_changes) p = self.parameters p.initial_magmoms = atoms.get_initial_magnetic_moments().tolist() p.write(self.label + '.ase') del p['initial_magmoms'] f = open(self.label + '.nw', 'w') if p.charge is not None: f.write('charge %s\n' % p.charge) #check here, we could give here only the list of atoms that are not bq's #and write an additional file containing the bq's write_nwchem(f, atoms, p.geometry) f.write('start\n') if p.basispar is not None: basispar = 'basis ' + p.basispar else: if p.basis.find('cc-p') > -1: basispar = 'basis "ao basis" spherical ' else: basispar = 'basis' def format_basis_set(string, tag=basispar): formatted = tag + '\n' lines = string.split('\n') if len(lines) > 1: formatted += string else: formatted += ' * library ' + string return formatted + '\nend\n' basis = format_basis_set(p.basis) if p.ecp is not None: basis += format_basis_set(p.ecp, 'ecp') if p.so is not None: basis += format_basis_set(p.so, 'so') f.write(basis) if p.xc == 'HF': task = 'scf' f.write('\nscf\n') if 'mult' in p: if p.mult > 1: if p.wfn != 'ROHF' and p.wfn != 'UHF': print 'now setting your wavefunction to unrestricted as you did not specify anything else' self.parameters.wfn = 'UHF' p.wfn = 'UHF' f.write('\nnopen %i\n' %(p.mult-1)) f.write('\n%s\nend\n' %p.wfn) else: f.write('\nend\n') elif p.xc == 'MP2': task = 'mp2' #FUDO| the whole thing depends on the basis set, i think (Dunning depends, Pople I don't know) #FUDO| so we need to check that and also that it does not get set if parameters.corecol is True f.write('\nmp2\nfreeze atomic\nend\n') else: if p.spinorbit: task = 'sodft' else: task = 'dft' xc = {'LDA': 'slater pw91lda', 'PBE': 'xpbe96 cpbe96', 'revPBE': 'revpbe cpbe96', 'RPBE': 'rpbe cpbe96'}.get(p.xc, p.xc) f.write('\n' + task + '\n') f.write(' xc ' + xc + '\n') for key in p.convergence: if p.convergence[key] is not None: if key == 'lshift': if p.convergence[key] <= 0.0: f.write(' convergence nolevelshifting\n') else: f.write(' convergence %s %s\n' % (key, p.convergence[key] / Hartree)) else: f.write(' convergence %s %s\n' % (key, p.convergence[key])) if p.smearing is not None: assert p.smearing[0].lower() == 'gaussian', p.smearing f.write(' smear %s\n' % (p.smearing[1] / Hartree)) if 'mult' not in p: # Obtain multiplicity from magnetic momenta: #FUDO| how to handle if we have an open-shell system? Does not seem to work here... tot_magmom = atoms.get_initial_magnetic_moments().sum() if tot_magmom < 0: mult = tot_magmom - 1 # fill minority bands else: mult = tot_magmom + 1 else: mult = p.mult if mult != int(mult): raise RuntimeError('Noninteger multiplicity not possible. ' + 'Check initial magnetic moments.') if 'mult' in p: if p.mult > 1: if p.wfn != 'ROHF' and p.wfn != 'UHF': print 'now setting your wavefunction to unrestricted as you did not specify anything else' self.parameters.wfn = 'UHF' p.wfn = 'UHF' f.write(' mult %i\n' %(mult)) if p.wfn == 'ROHF': f.write(' rodft\n cgmin\n') if p.odft: f.write(' odft\n') # open shell aka spin polarized dft for key in sorted(p.keys()): if key in ['charge', 'geometry', 'basis', 'basispar', 'ecp', 'so', 'xc', 'spinorbit', 'convergence', 'smearing', #FU| needed to add a key exception for bq, and charges... 'raw', 'mult', 'task', 'odft', 'bq', 'charges', 'wfn']: #FU| continue f.write(u" {0} {1}\n".format(key, p[key])) f.write('end\n') #FU| with NWChem 6.3 both variants are equivalent, something was weird with a previous version if p.bq is not None: #f.write('\nbq\n load %s format 1 2 3 4\nend\n' %('.bq')) #FUDO| this label splitting kinda sucks, but it seems to work right now if the whole thing #FUDO| is run from (a) directory(ies) above f.write('\nbq\n load %s format 1 2 3 4\nend\n' %(self.label.split('/')[-1] + '.bq')) bqf = open(self.label + '.bq', 'w') for q in p.bq: bqf.write('%21.10f %21.10f %21.10f %21.10f\n' %(q[0], q[1], q[2], q[3])) bqf.close() #FU| careful in earlier NWChems this might be the wrong order: #f.write('\nbq\n') #for q in p.bq: # f.write('%21.10f %21.10f %21.10f %21.10f\n' %(q[0], q[1], q[2], q[3])) #f.write('\nend\n') #FU| maybe it's better to put this into the raw input if p.charges is not None: if p.charges.find('ESP') > -1: f.write('\nesp\n') if p.charges.find('RESP') > -1: f.write('restrain\n') f.write('end\n') if p.charges.find('Mulliken') > -1: f.write('\nProperty\nMulliken\nend\n') #FU| if p.raw: f.write(p.raw + '\n') f.write('\ntask ' + task + ' ' + p.task + '\n') if p.charges is not None: if p.charges.find('ESP') > -1: f.write('\ntask esp\n') if p.charges.find('Mulliken') > -1: f.write('\ntask ' + task + ' property\n') f.close()