root / ase / io / dftb.py @ 13
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) |