Statistiques
| Révision :

root / ase / io / dftb.py @ 1

Historique | Voir | Annoter | Télécharger (3,05 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_dftb(filename='dftb_in.hsd'):
6 1 tkerber
    """Method to read coordinates form DFTB+ input file dftb_in.hsd
7 1 tkerber
    additionally read information about fixed atoms
8 1 tkerber
    and periodic boundary condition
9 1 tkerber
    """
10 1 tkerber
    from ase import Atoms, Atom
11 1 tkerber
    from ase.constraints import FixAtoms
12 1 tkerber
    import sys, string
13 1 tkerber
14 1 tkerber
    if isinstance(filename, str):
15 1 tkerber
        f = open(filename)
16 1 tkerber
17 1 tkerber
    lines = f.readlines()
18 1 tkerber
    atoms_pos = []
19 1 tkerber
    atom_symbols = []
20 1 tkerber
    type_names = []
21 1 tkerber
    my_pbc = False
22 1 tkerber
    myconstraints=[]
23 1 tkerber
    moved_atoms_found = False
24 1 tkerber
    range_found = False
25 1 tkerber
    moved_atoms = []
26 1 tkerber
27 1 tkerber
    for line in lines:
28 1 tkerber
        if (line.strip().startswith('#')):
29 1 tkerber
            pass
30 1 tkerber
        else:
31 1 tkerber
            if ('TypeNames' in line):
32 1 tkerber
                col=line.split()
33 1 tkerber
                for i in range(3,len(col)-1):
34 1 tkerber
                    type_names.append(col[i].strip("\""))
35 1 tkerber
            elif ('Periodic' in line):
36 1 tkerber
                if ('Yes' in line):
37 1 tkerber
                    my_pbc = True
38 1 tkerber
            else:
39 1 tkerber
                pass
40 1 tkerber
41 1 tkerber
    start_reading_coords=False
42 1 tkerber
    stop_reading_coords=False
43 1 tkerber
    for line in lines:
44 1 tkerber
        if (line.strip().startswith('#')):
45 1 tkerber
            pass
46 1 tkerber
        else:
47 1 tkerber
            if ('TypesAndCoordinates' in line):
48 1 tkerber
                start_reading_coords=True
49 1 tkerber
            if start_reading_coords:
50 1 tkerber
                if ('}' in line):
51 1 tkerber
                    stop_reading_coords=True
52 1 tkerber
            if (start_reading_coords and not(stop_reading_coords)
53 1 tkerber
            and not 'TypesAndCoordinates' in line):
54 1 tkerber
                typeindexstr, x, y, z = line.split()[:4]
55 1 tkerber
                typeindex=int(typeindexstr)
56 1 tkerber
                symbol=type_names[typeindex-1]
57 1 tkerber
                atom_symbols.append(symbol)
58 1 tkerber
                atoms_pos.append([float(x), float(y), float(z)])
59 1 tkerber
60 1 tkerber
61 1 tkerber
    if type(filename) == str:
62 1 tkerber
        f.close()
63 1 tkerber
64 1 tkerber
    atoms = Atoms(positions = atoms_pos, symbols = atom_symbols, pbc = my_pbc)
65 1 tkerber
66 1 tkerber
67 1 tkerber
    return atoms
68 1 tkerber
69 1 tkerber
70 1 tkerber
def write_dftb(filename,atoms):
71 1 tkerber
    """Method to write coordinates in DFTB+ format
72 1 tkerber
    """
73 1 tkerber
74 1 tkerber
    import numpy as np
75 1 tkerber
    from ase.constraints import FixAtoms
76 1 tkerber
77 1 tkerber
    if isinstance(filename, str):
78 1 tkerber
        f = open(filename)
79 1 tkerber
80 1 tkerber
    lines = f.readlines()
81 1 tkerber
82 1 tkerber
    if type(filename) == str:
83 1 tkerber
        f.close()
84 1 tkerber
85 1 tkerber
    if isinstance(filename, str):
86 1 tkerber
        f = open(filename, 'w')
87 1 tkerber
    else: # Assume it's a 'file-like object'
88 1 tkerber
        f = filename
89 1 tkerber
90 1 tkerber
    coord = atoms.get_positions()
91 1 tkerber
    symbols = atoms.get_chemical_symbols()
92 1 tkerber
93 1 tkerber
94 1 tkerber
    start_writing_coords = False
95 1 tkerber
    stop_writing_coords = False
96 1 tkerber
    i=0
97 1 tkerber
    for line in lines:
98 1 tkerber
        if ('TypesAndCoordinates' in line):
99 1 tkerber
            start_writing_coords=True
100 1 tkerber
        if (start_writing_coords and not(stop_writing_coords)):
101 1 tkerber
            if ('}' in line):
102 1 tkerber
                stop_writing_coords = True
103 1 tkerber
        if (start_writing_coords and not(stop_writing_coords)and
104 1 tkerber
            not ('TypesAndCoordinates' in line)):
105 1 tkerber
            atom_type_index = line.split()[0]
106 1 tkerber
            f.write('%6s  %20.14f  %20.14f  %20.14f\n'
107 1 tkerber
                    % (atom_type_index,coord[i][0],coord[i][1],coord[i][2]))
108 1 tkerber
            i=i+1
109 1 tkerber
        else:
110 1 tkerber
            f.write(line)