Skip to content

Commit 62ef17c

Browse files
authored
Merge pull request #39 from nmdl-mizo/develop
Debug and add some information for automatic interface searching
2 parents 458ac23 + a112a55 commit 62ef17c

4 files changed

Lines changed: 161 additions & 69 deletions

File tree

interfacemaster/hetero_searching.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from pymatgen.core.surface import SlabGenerator
55
from interfacemaster.cellcalc import get_primitive_hkl, get_pri_vec_inplane, get_normal_index, get_normal_from_MI, rot
66
from interfacemaster.interface_generator import core, convert_vector_index, get_disorientation
7+
from interfacemaster.tool import get_indices_from_cart
78
from numpy import *
89
from numpy.linalg import *
910
import os
@@ -57,6 +58,9 @@ def float_to_rational(x, lim =50):
5758
else:
5859
raise RuntimeError('failed to found rational matrix')
5960

61+
def get_rational_mtx(M):
62+
return apply_function_to_array(M, float_to_rational)
63+
6064
def plane_set_transform(old_set, new_l, format = 'int'):
6165
hkl = get_primitive_hkl(old_set.hkl, old_set.lattice, new_l)
6266
v1 = dot(inv(new_l), old_set.cart_v1)
@@ -240,26 +244,44 @@ def generating(self, max_anum = 150, min_slab_length = 15):
240244
cstl_id_2_conv = apply_function_to_array(dot(inv(my_interface.conv_lattice_2), cart_id), float_to_rational)
241245

242246
results[count] = {}
243-
results[count]['film_prim_hkl'] = mtch_data.plane_set_film.hkl
244-
results[count]['film_prim_v1'] = mtch_data.plane_set_film.v1
245-
results[count]['film_prim_v2'] = mtch_data.plane_set_film.v2
246-
results[count]['film_conv_hkl'] = mtch_data.plane_set_film_conv.hkl
247+
results[count]['film_prim_hkl'] = array(mtch_data.plane_set_film.hkl, dtype = int)
248+
results[count]['film_prim_v1'] = array(mtch_data.plane_set_film.v1, dtype = int)
249+
results[count]['film_prim_v2'] = array(mtch_data.plane_set_film.v2, dtype = int)
250+
results[count]['film_conv_hkl'] = array(mtch_data.plane_set_film_conv.hkl, dtype = int)
247251
results[count]['film_conv_v1'] = mtch_data.plane_set_film_conv.v1
248252
results[count]['film_conv_v2'] = mtch_data.plane_set_film_conv.v2
249253

250-
results[count]['substrate_prim_hkl'] = mtch_data.plane_set_substrate.hkl
251-
results[count]['substrate_prim_v1'] = mtch_data.plane_set_substrate.v1
252-
results[count]['substrate_prim_v2'] = mtch_data.plane_set_substrate.v2
253-
results[count]['substrate_conv_hkl'] = mtch_data.plane_set_substrate_conv.hkl
254+
results[count]['substrate_prim_hkl'] = array(mtch_data.plane_set_substrate.hkl, dtype = int)
255+
results[count]['substrate_prim_v1'] = array(mtch_data.plane_set_substrate.v1, dtype = int)
256+
results[count]['substrate_prim_v2'] = array(mtch_data.plane_set_substrate.v2, dtype = int)
257+
results[count]['substrate_conv_hkl'] = array(mtch_data.plane_set_substrate_conv.hkl, dtype = int)
254258
results[count]['substrate_conv_v1'] = mtch_data.plane_set_substrate_conv.v1
255259
results[count]['substrate_conv_v2'] = mtch_data.plane_set_substrate_conv.v2
256-
results[count]['area'] = data[i][-1]
260+
results[count]['CSL area'] = data[i][-1]
257261
results[count]['strain'] = my_interface.D
262+
results[count]['atom_num'] = len(my_interface.atoms_bi)
263+
264+
cnid_indices_1_prim = get_rational_mtx(get_indices_from_cart(my_interface.lattice_1, my_interface.CNID))
265+
transL2 = dot(my_interface.a2_transform, my_interface.lattice_2)
266+
cnid_indices_2_prim = get_rational_mtx(get_indices_from_cart(transL2, my_interface.CNID))
267+
results[count]['substrate_prim_CNID_express'] = cnid_indices_1_prim
268+
results[count]['film_prim_CNID_express'] = cnid_indices_2_prim
269+
270+
cnid_indices_1_conv = get_rational_mtx(get_indices_from_cart(my_interface.conv_lattice_1, my_interface.CNID))
271+
transL2 = dot(my_interface.a2_transform, my_interface.conv_lattice_2)
272+
cnid_indices_2_conv = get_rational_mtx(get_indices_from_cart(transL2, my_interface.CNID))
273+
results[count]['substrate_conv_CNID_express'] = cnid_indices_1_conv
274+
results[count]['film_conv_CNID_express'] = cnid_indices_2_conv
275+
c1, c2 = my_interface.CNID.T
276+
results[count]['CNID area'] = norm(cross(c1, c2))
277+
258278
with open(f'{it_folder}/{count}/interface.info','w') as f:
259-
f.write(f"""film miller: {tuple(array(data[i][0:3], dtype = int))}
260-
film vecs: {list(array(data[i][3:6], dtype = int))} {list(array(data[i][6:9], dtype = int))}
261-
sub miller: {tuple(array(data[i][9:12], dtype = int))}
262-
sub vecs: {list(array(data[i][12:15],dtype = int))} {list(array(data[i][15:18], dtype = int))}
279+
f.write(f"""substrate primitive miller indices:{array(mtch_data.plane_set_substrate.hkl, dtype = int)}
280+
film primitive miller indices: {array(mtch_data.plane_set_film.hkl, dtype = int)}
281+
282+
substrate conventional miller indices:{array(mtch_data.plane_set_substrate_conv.hkl, dtype = int)}
283+
film conventional miller indices:{array(mtch_data.plane_set_film_conv.hkl, dtype = int)}
284+
263285
strain:
264286
{my_interface.D}\n
265287
atom number: {len(my_interface.atoms_bi)}\n

interfacemaster/interface_generator.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2231,9 +2231,7 @@ def compute_bicrystal_two_D(
22312231
# unit slabs
22322232
cell_1 = np.column_stack((v3_1, plane_1))
22332233
cell_2 = np.column_stack((v3_2, plane_2))
2234-
print(cell_1[:,0])
2235-
print(cell_2[:,0])
2236-
print(dot(cell_1[:,0],cell_1[:,1]))
2234+
22372235
# right_handed
22382236
cell_1 = get_right_hand(cell_1)
22392237

interfacemaster/tool.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,25 @@
11
from numpy import *
22
from numpy.linalg import *
33
from pymatgen.core.structure import Structure
4+
5+
def get_indices_from_cart(lattice, cart):
6+
return dot(inv(lattice), cart)
7+
8+
def get_indices_from_cart(lattice, cart):
9+
return dot(inv(lattice), cart)
10+
11+
def get_rational_mtx(M, lim=50):
12+
found = False
13+
for i in range(1, lim+1):
14+
here = M * i
15+
if int_mtx(here):
16+
found = True
17+
break
18+
if found:
19+
return array(around(here), dtype=int), i
20+
else:
21+
print('failed to found rational matrix')
22+
423
#generating KPOINTS
524
def generate_KPOINTS(poscar_file, dens):
625
pos_struc = Structure.from_file(poscar_file)
@@ -33,7 +52,7 @@ def get_bounds(xs, TR, fracture, Tlength):
3352
#fix atom
3453
def get_fix_atom_TFarray(original_pos_file, Llength, fraction, skipnum = 8):
3554
#get middle bound
36-
stct = Structure.from_file(original_pos_file)
55+
stct = Structure.from_file(original_pos_file, sort = 'False')
3756
Tlength = norm(stct.lattice.matrix[0])
3857
middle_bound = (Llength - 0.5)/Tlength
3958

@@ -78,9 +97,10 @@ def combine_poscar_TFarray(poscar_file, TFarray, filename):
7897
skiprows = where(array(lines) == 'cartesian\n')[0][0] + 1
7998
atoms = loadtxt(poscar_file, skiprows = skiprows, usecols=(0,1,2))
8099
atoms = char.mod("%.16f", atoms)
100+
81101
front_contents = array(lines)[arange(skiprows)]
82102
back_contents = column_stack((atoms, TFarray))
83103
with open(filename, 'w') as f:
84104
for i in front_contents:
85105
f.write(i)
86-
savetxt(filename, back_contents, fmt = '%s %s %s %s %s %s')
106+
savetxt(f, back_contents, fmt = '%s %s %s %s %s %s')

0 commit comments

Comments
 (0)