root / ase / io / turbomole.py @ 14
Historique | Voir | Annoter | Télécharger (2,73 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 | 5 | tkerber | #    c = FixAtoms(myconstraints)
 | 
| 53 | 5 | 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") |