root / ase / io / exciting.py @ 14
Historique | Voir | Annoter | Télécharger (3,9 ko)
| 1 | 1 | tkerber | """
|
|---|---|---|---|
| 2 | 1 | tkerber | This is the Implementation of the exciting I/O Functions
|
| 3 | 1 | tkerber | The functions are called with read write usunf the format "exi"
|
| 4 | 1 | tkerber |
|
| 5 | 1 | tkerber | The module depends on lxml http://codespeak.net/lxml/
|
| 6 | 1 | tkerber | """
|
| 7 | 1 | tkerber | from math import pi, cos, sin, sqrt, acos |
| 8 | 1 | tkerber | |
| 9 | 1 | tkerber | from ase.atoms import Atoms |
| 10 | 1 | tkerber | from ase.parallel import paropen |
| 11 | 1 | tkerber | from ase.units import Bohr |
| 12 | 1 | tkerber | |
| 13 | 1 | tkerber | def read_exciting(fileobj, index=-1): |
| 14 | 1 | tkerber | """Reads structure from exiting xml file.
|
| 15 | 1 | tkerber |
|
| 16 | 1 | tkerber | Parameters
|
| 17 | 1 | tkerber | ----------
|
| 18 | 1 | tkerber | fileobj: file object
|
| 19 | 1 | tkerber | Filehandle from which data should be read.
|
| 20 | 1 | tkerber |
|
| 21 | 1 | tkerber | Other parameters
|
| 22 | 1 | tkerber | ----------------
|
| 23 | 1 | tkerber | index: integer -1
|
| 24 | 1 | tkerber | Not used in this implementation.
|
| 25 | 1 | tkerber | """
|
| 26 | 1 | tkerber | from lxml import etree as ET |
| 27 | 1 | tkerber | #parse file into element tree
|
| 28 | 1 | tkerber | doc = ET.parse(fileobj) |
| 29 | 1 | tkerber | root = doc.getroot() |
| 30 | 1 | tkerber | speciesnodes = root.find('structure').getiterator('species') |
| 31 | 1 | tkerber | |
| 32 | 1 | tkerber | symbols = [] |
| 33 | 1 | tkerber | positions = [] |
| 34 | 1 | tkerber | basevects = [] |
| 35 | 1 | tkerber | atoms = None
|
| 36 | 1 | tkerber | #collect data from tree
|
| 37 | 1 | tkerber | for speciesnode in speciesnodes: |
| 38 | 1 | tkerber | symbol = speciesnode.get('speciesfile').split('.')[0] |
| 39 | 1 | tkerber | natoms = speciesnode.getiterator('atom')
|
| 40 | 1 | tkerber | for atom in natoms: |
| 41 | 1 | tkerber | x, y, z = atom.get('coord').split()
|
| 42 | 1 | tkerber | positions.append([float(x), float(y), float(z)]) |
| 43 | 1 | tkerber | symbols.append(symbol) |
| 44 | 1 | tkerber | basevectsn = doc.xpath('//basevect/text()')
|
| 45 | 1 | tkerber | |
| 46 | 1 | tkerber | for basevect in basevectsn: |
| 47 | 1 | tkerber | x, y, z = basevect.split() |
| 48 | 1 | tkerber | basevects.append([float(x) * Bohr, float(y) * Bohr, float(z) * Bohr]) |
| 49 | 1 | tkerber | atoms = Atoms(symbols=symbols, cell=basevects) |
| 50 | 1 | tkerber | atoms.set_scaled_positions(positions) |
| 51 | 1 | tkerber | if 'molecule' in root.find('structure').attrib.keys(): |
| 52 | 1 | tkerber | if root.find('structure').attrib['molecule']: |
| 53 | 1 | tkerber | atoms.set_pbc(False)
|
| 54 | 1 | tkerber | else:
|
| 55 | 1 | tkerber | atoms.set_pbc(True)
|
| 56 | 1 | tkerber | |
| 57 | 1 | tkerber | return atoms
|
| 58 | 1 | tkerber | |
| 59 | 1 | tkerber | def write_exciting(fileobj, images): |
| 60 | 1 | tkerber | """writes exciting input structure in XML
|
| 61 | 1 | tkerber |
|
| 62 | 1 | tkerber | Parameters
|
| 63 | 1 | tkerber | ----------
|
| 64 | 1 | tkerber | fileobj : File object
|
| 65 | 1 | tkerber | Filehandle to which data should be written
|
| 66 | 1 | tkerber | images : Atom Object or List of Atoms objects
|
| 67 | 1 | tkerber | This function will write the first Atoms object to file
|
| 68 | 1 | tkerber |
|
| 69 | 1 | tkerber | Returns
|
| 70 | 1 | tkerber | -------
|
| 71 | 1 | tkerber | """
|
| 72 | 1 | tkerber | from lxml import etree as ET |
| 73 | 1 | tkerber | if isinstance(fileobj, str): |
| 74 | 1 | tkerber | fileobj = paropen(fileobj, 'w')
|
| 75 | 1 | tkerber | root = atoms2etree(images) |
| 76 | 1 | tkerber | fileobj.write(ET.tostring(root, method='xml',
|
| 77 | 1 | tkerber | pretty_print=True,
|
| 78 | 1 | tkerber | xml_declaration=True,
|
| 79 | 1 | tkerber | encoding='UTF-8'))
|
| 80 | 1 | tkerber | |
| 81 | 1 | tkerber | def atoms2etree(images): |
| 82 | 1 | tkerber | """This function creates the xml DOM corresponding
|
| 83 | 1 | tkerber | to the structure for use in write and calculator
|
| 84 | 1 | tkerber |
|
| 85 | 1 | tkerber | Parameters
|
| 86 | 1 | tkerber | ----------
|
| 87 | 1 | tkerber |
|
| 88 | 1 | tkerber | images : Atom Object or List of Atoms objects
|
| 89 | 1 | tkerber | This function will create a
|
| 90 | 1 | tkerber |
|
| 91 | 1 | tkerber | Returns
|
| 92 | 1 | tkerber | -------
|
| 93 | 1 | tkerber | root : etree object
|
| 94 | 1 | tkerber | Element tree of exciting input file containing the structure
|
| 95 | 1 | tkerber | """
|
| 96 | 1 | tkerber | from lxml import etree as ET |
| 97 | 1 | tkerber | if not isinstance(images, (list, tuple)): |
| 98 | 1 | tkerber | images = [images] |
| 99 | 1 | tkerber | |
| 100 | 1 | tkerber | root = ET.Element('input')
|
| 101 | 1 | tkerber | title = ET.SubElement(root, 'title')
|
| 102 | 1 | tkerber | title.text = ''
|
| 103 | 1 | tkerber | structure = ET.SubElement(root, 'structure')
|
| 104 | 1 | tkerber | crystal= ET.SubElement(structure, 'crystal')
|
| 105 | 1 | tkerber | atoms = images[0]
|
| 106 | 1 | tkerber | for vec in atoms.cell: |
| 107 | 1 | tkerber | basevect = ET.SubElement(crystal, 'basevect')
|
| 108 | 1 | tkerber | basevect.text = '%.14f %.14f %.14f' % tuple(vec / Bohr) |
| 109 | 1 | tkerber | |
| 110 | 1 | tkerber | species = {}
|
| 111 | 1 | tkerber | symbols = [] |
| 112 | 1 | tkerber | for a, symbol in enumerate(atoms.get_chemical_symbols()): |
| 113 | 1 | tkerber | if symbol in species: |
| 114 | 1 | tkerber | species[symbol].append(a) |
| 115 | 1 | tkerber | else:
|
| 116 | 1 | tkerber | species[symbol] = [a] |
| 117 | 1 | tkerber | symbols.append(symbol) |
| 118 | 1 | tkerber | scaled = atoms.get_scaled_positions() |
| 119 | 1 | tkerber | for symbol in symbols: |
| 120 | 1 | tkerber | speciesnode = ET.SubElement(structure, 'species',
|
| 121 | 1 | tkerber | speciesfile='%s.xml' % symbol,
|
| 122 | 1 | tkerber | chemicalSymbol=symbol) |
| 123 | 1 | tkerber | for a in species[symbol]: |
| 124 | 1 | tkerber | atom = ET.SubElement(speciesnode, 'atom',
|
| 125 | 1 | tkerber | coord='%.14f %.14f %.14f' % tuple(scaled[a])) |
| 126 | 1 | tkerber | return root |