Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
    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()
Пример #4
0
    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
Пример #5
0
    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()
Пример #6
0
    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()
Пример #7
0
    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
Пример #8
0
    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()