Statistiques
| Révision :

root / ase / io / turbomole.py @ 1

Historique | Voir | Annoter | Télécharger (2,74 ko)

1 1 tkerber
from ase.atoms import Atoms
2 1 tkerber
from ase.units import Bohr
3 1 tkerber
4 1 tkerber
5 1 tkerber
def read_turbomole(filename='coord'):
6 1 tkerber
    """Method to read turbomole coord file
7 1 tkerber

8 1 tkerber
    coords in bohr, atom types in lowercase, format:
9 1 tkerber
    $coord
10 1 tkerber
    x y z atomtype
11 1 tkerber
    x y z atomtype f
12 1 tkerber
    $end
13 1 tkerber
    Above 'f' means a fixed atom.
14 1 tkerber
    """
15 1 tkerber
    from ase import Atoms, Atom
16 1 tkerber
    from ase.constraints import FixAtoms
17 1 tkerber
18 1 tkerber
    if isinstance(filename, str):
19 1 tkerber
        f = open(filename)
20 1 tkerber
21 1 tkerber
    lines = f.readlines()
22 1 tkerber
    atoms_pos = []
23 1 tkerber
    atom_symbols = []
24 1 tkerber
    dollar_count=0
25 1 tkerber
    myconstraints=[]
26 1 tkerber
    for line in lines:
27 1 tkerber
        if ('$' in line):
28 1 tkerber
            dollar_count = dollar_count + 1
29 1 tkerber
            if (dollar_count >= 2):
30 1 tkerber
                break
31 1 tkerber
        else:
32 1 tkerber
            x, y, z, symbolraw = line.split()[:4]
33 1 tkerber
            symbolshort=symbolraw.strip()
34 1 tkerber
            symbol=symbolshort[0].upper()+symbolshort[1:].lower()
35 1 tkerber
            #print symbol
36 1 tkerber
            atom_symbols.append(symbol)
37 1 tkerber
            atoms_pos.append([float(x)*Bohr, float(y)*Bohr, float(z)*Bohr])
38 1 tkerber
            cols = line.split()
39 1 tkerber
            if (len(cols) == 5):
40 1 tkerber
                fixedstr = line.split()[4].strip()
41 1 tkerber
                if (fixedstr == "f"):
42 1 tkerber
                    myconstraints.append(True)
43 1 tkerber
                else:
44 1 tkerber
                    myconstraints.append(False)
45 1 tkerber
            else:
46 1 tkerber
                myconstraints.append(False)
47 1 tkerber
48 1 tkerber
    if type(filename) == str:
49 1 tkerber
        f.close()
50 1 tkerber
51 1 tkerber
    atoms = Atoms(positions = atoms_pos, symbols = atom_symbols, pbc = False)
52 1 tkerber
    c = FixAtoms(myconstraints)
53 1 tkerber
    atoms.set_constraint(c)
54 1 tkerber
    #print c
55 1 tkerber
56 1 tkerber
57 1 tkerber
    return atoms
58 1 tkerber
59 1 tkerber
def write_turbomole(filename, atoms):
60 1 tkerber
    """Method to write turbomole coord file
61 1 tkerber
    """
62 1 tkerber
63 1 tkerber
    import numpy as np
64 1 tkerber
    from ase.constraints import FixAtoms
65 1 tkerber
66 1 tkerber
    if isinstance(filename, str):
67 1 tkerber
        f = open(filename, 'w')
68 1 tkerber
    else: # Assume it's a 'file-like object'
69 1 tkerber
        f = filename
70 1 tkerber
71 1 tkerber
    coord = atoms.get_positions()
72 1 tkerber
    symbols = atoms.get_chemical_symbols()
73 1 tkerber
    printfixed = False
74 1 tkerber
75 1 tkerber
    if atoms.constraints:
76 1 tkerber
        for constr in atoms.constraints:
77 1 tkerber
            if isinstance(constr, FixAtoms):
78 1 tkerber
                fix_index=constr.index
79 1 tkerber
                printfixed=True
80 1 tkerber
    #print sflags
81 1 tkerber
82 1 tkerber
    if (printfixed):
83 1 tkerber
        fix_str=[]
84 1 tkerber
        for i in fix_index:
85 1 tkerber
            if i == 1:
86 1 tkerber
                fix_str.append("f")
87 1 tkerber
            else:
88 1 tkerber
                fix_str.append(" ")
89 1 tkerber
90 1 tkerber
91 1 tkerber
    f.write("$coord\n")
92 1 tkerber
    if (printfixed):
93 1 tkerber
        for (x, y, z), s, fix in zip(coord,symbols,fix_str):
94 1 tkerber
            f.write('%20.14f  %20.14f  %20.14f      %2s  %2s \n'
95 1 tkerber
                    % (x/Bohr, y/Bohr, z/Bohr, s.lower(), fix))
96 1 tkerber
97 1 tkerber
    else:
98 1 tkerber
        for (x, y, z), s in zip(coord,symbols):
99 1 tkerber
            f.write('%20.14f  %20.14f  %20.14f      %2s \n'
100 1 tkerber
                    % (x/Bohr, y/Bohr, z/Bohr, s.lower()))
101 1 tkerber
    f.write("$end\n")