"""
besmarts.mechanics.force_periodic
"""
import math
from besmarts.core import topology
from besmarts.core import assignments
from besmarts.core import trees
from besmarts.core import codecs
from besmarts.core import hierarchies
from besmarts.core import perception
from besmarts.mechanics import molecular_models as mm
# dihedrals
[docs]
def energy_function_periodic_cosine_2term(*, k, n, p, x) -> float:
return [[ki + ki*math.cos(ni * xi - pi) for ki, ni, pi in zip(k, n, p)] for x0 in x for xi in x0]
[docs]
def force_function_periodic_cosine_2term(*, k, n, p, x) -> float:
return [[ki*ni*math.sin(ni * xi - pi) for ki, ni, pi in zip(k, n, p)] for x0 in x for xi in x0]
[docs]
def force_gradient_function_periodic_cosine_2term(*, k, n, p, x) -> float:
return [[ki*ni*ni*math.cos(ni * xi - pi) for ki, ni, pi in zip(k, n, p)] for x0 in x for xi in x0]
[docs]
def force_system_periodic_cosine_2term(*, k, n, p, x) -> float:
return [[(ki, ni*math.sin(ni * xi - pi)) for ki, ni, pi in zip(k, n, p)] for x0 in x for xi in x0]
[docs]
def force_gradient_system_periodic_cosine_2term(*, k, n, p, x) -> float:
return [[(ki, ni*ni*math.cos(ni * xi - pi)) for ki, ni, pi in zip(k, n, p)] for x0 in x for xi in x0]
[docs]
def init_dihedral_common(cm):
cm.energy_function = energy_function_periodic_cosine_2term
cm.force_function = force_function_periodic_cosine_2term
cm.force_gradient_function = force_gradient_function_periodic_cosine_2term
# define the terms of this model
cm.topology_terms = {
"n": mm.topology_term("periodicity", "n", "int", "", {}, "", {}),
"k": mm.topology_term("height", "k", "float", "kcal/mol", {}, "", {}),
"p": mm.topology_term("phase", "p", "float", "deg", {}, "", {}),
}
return cm
# chemical models
[docs]
def chemical_model_torsion_periodic(pcp: perception.perception_model) -> mm.chemical_model:
"""
"""
cm = mm.chemical_model("T", "torsions", topology.torsion)
cm = init_dihedral_common(cm)
cm.internal_function = assignments.graph_assignment_geometry_torsion_matrix
cm.derivative_function = assignments.graph_assignment_jacobian_torsion_matrix
return cm
[docs]
def chemical_model_outofplane_periodic(pcp: perception.perception_model) -> mm.chemical_model:
"""
"""
cm = mm.chemical_model("I", "outofplane", topology.outofplane)
cm = init_dihedral_common(cm)
cm.internal_function = assignments.graph_assignment_geometry_outofplane_matrix
cm.derivative_function = assignments.graph_assignment_jacobian_outofplane_matrix
return cm