# Source code for susmost.make_interaction

import numpy as np

[docs]def nearest_int(cc1, cc2,int_en = 0.0, int_r = 0.5, h = 0.5, INF_E = 1e6, dop_int=0.0, empty_name = "Empty"):
"""
Calculates the energy of interaction between nearest neighbors. If name of the molecule is 'Empty', then there is no any interactions with it.

Parameters:
:cc1,cc2:	Coordinates of first and second molecules.
:int_en:		Simple interaction energy between elements of the molecule. Default is 0.0.
:int_r:		The radius of the interaction. If the distance R between the molecules is h <= R <= int_r, then there is interaction. Default is 0.5.
:h:			Radius of a solid sphere. If the distance between the elements of the molecules is smaller or equal, then an infinitely strong repulsion arises. Default is 0.5.
:INF_E:		The value of an infinitely strong repulsion. Default is 1e6.
:dop_int:	Complex interaction energy between elements of the molecule. Has the form dop_int = {('mol_1_name','mol_2_name'):energy1,...} Default is 0.0.
:empty_name: Name of the element with properties of empty element. Default is "Empty".
Returns:
Energy of interaction between molecules.
"""
if cc1.lctype == empty_name or cc2.lctype == empty_name:
return None

interactions = 0.0
for c1 in cc1.coords:					# coordinates of each atom in cc1
for c2 in cc2.coords:				# coordinates of each atom in cc2
r = np.linalg.norm(c1 - c2)		# distance

if r < h*1.9999:
interactions += INF_E				# forbidden_distance

if (h*1.9999 < r < int_r*2.0001):
if not type(dop_int) is dict:
interactions += int_en			#interaction_energy
else:
molecules = sorted([cc1.lctype, cc2.lctype])
interactions += dop_int.get((molecules[0],molecules[1]),0.0)
return interactions