import unittest
import numpy as np
from polymers import physics
from ..test import Parameters
parameters = Parameters()
WLC = physics.single_chain.wlc.thermodynamics.isotensional.WLC
class Base(unittest.TestCase):
def test_init(self):
for _ in range(parameters.number_of_loops):
_ = WLC(
parameters.number_of_links_minimum,
parameters.link_length_reference,
parameters.hinge_mass_reference,
parameters.persistance_length_reference
)
def test_number_of_links(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
self.assertEqual(
number_of_links,
WLC(
number_of_links,
parameters.link_length_reference,
parameters.hinge_mass_reference,
parameters.persistance_length_reference
).number_of_links
)
def test_link_length(self):
for _ in range(parameters.number_of_loops):
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
self.assertEqual(
link_length,
WLC(
parameters.number_of_links_minimum,
link_length,
parameters.hinge_mass_reference,
parameters.persistance_length_reference
).link_length
)
def test_hinge_mass(self):
for _ in range(parameters.number_of_loops):
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
self.assertEqual(
hinge_mass,
WLC(
parameters.number_of_links_minimum,
parameters.link_length_reference,
hinge_mass,
parameters.persistance_length_reference
).hinge_mass
)
def test_persistance_length(self):
for _ in range(parameters.number_of_loops):
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
self.assertEqual(
persistance_length,
WLC(
parameters.number_of_links_minimum,
parameters.link_length_reference,
parameters.hinge_mass_reference,
persistance_length
).persistance_length
)
def test_all_parameters(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
self.assertEqual(
number_of_links,
model.number_of_links
)
self.assertEqual(
link_length,
model.link_length
)
self.assertEqual(
hinge_mass,
model.hinge_mass,
persistance_length
)
self.assertEqual(
persistance_length,
model.persistance_length
)
class Nondimensional(unittest.TestCase):
def test_end_to_end_length(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length = \
model.nondimensional_end_to_end_length(
np.array(nondimensional_force)
)
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length = \
model.end_to_end_length(
np.array(force),
temperature
)
residual_abs = \
end_to_end_length \
/ link_length \
- nondimensional_end_to_end_length
residual_rel = \
residual_abs / \
nondimensional_end_to_end_length
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_end_to_end_length_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length_per_link = \
model.nondimensional_end_to_end_length_per_link(
np.array(nondimensional_force)
)
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length_per_link = \
model.end_to_end_length_per_link(
np.array(force),
temperature
)
residual_abs = \
end_to_end_length_per_link \
/ link_length \
- nondimensional_end_to_end_length_per_link
residual_rel = \
residual_abs / \
nondimensional_end_to_end_length_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy = \
model.nondimensional_gibbs_free_energy(
np.array(nondimensional_force),
temperature
)
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy = \
model.gibbs_free_energy(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy / \
parameters.boltzmann_constant/temperature \
- nondimensional_gibbs_free_energy
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy = \
model.nondimensional_gibbs_free_energy_per_link(
np.array(nondimensional_force),
temperature
)
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy = \
model.gibbs_free_energy_per_link(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy / \
parameters.boltzmann_constant/temperature \
- nondimensional_gibbs_free_energy
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy = \
model.nondimensional_relative_gibbs_free_energy(
np.array(nondimensional_force)
)
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy = \
model.relative_gibbs_free_energy(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy / \
parameters.boltzmann_constant/temperature \
- nondimensional_gibbs_free_energy
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_relative_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy = \
model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(nondimensional_force)
)
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy = \
model.relative_gibbs_free_energy_per_link(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy / \
parameters.boltzmann_constant/temperature \
- nondimensional_gibbs_free_energy
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
class PerLink(unittest.TestCase):
def test_end_to_end_length(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length = \
model.end_to_end_length(
np.array(force),
temperature
)
end_to_end_length_per_link = \
model.end_to_end_length_per_link(
np.array(force),
temperature
)
residual_abs = \
end_to_end_length / \
number_of_links \
- end_to_end_length_per_link
residual_rel = \
residual_abs / \
end_to_end_length_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_end_to_end_length(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length = \
model.nondimensional_end_to_end_length(
np.array(nondimensional_force)
)
nondimensional_end_to_end_length_per_link = \
model.nondimensional_end_to_end_length_per_link(
np.array(nondimensional_force)
)
residual_abs = \
nondimensional_end_to_end_length / \
number_of_links \
- nondimensional_end_to_end_length_per_link
residual_rel = \
residual_abs / \
nondimensional_end_to_end_length_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy = \
model.gibbs_free_energy(
np.array(force),
temperature
)
gibbs_free_energy_per_link = \
model.gibbs_free_energy_per_link(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy / \
number_of_links \
- gibbs_free_energy_per_link
residual_rel = \
residual_abs / \
gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
relative_gibbs_free_energy = \
model.relative_gibbs_free_energy(
np.array(force),
temperature
)
relative_gibbs_free_energy_per_link = \
model.relative_gibbs_free_energy_per_link(
np.array(force),
temperature
)
residual_abs = \
relative_gibbs_free_energy / \
number_of_links \
- relative_gibbs_free_energy_per_link
residual_rel = \
residual_abs / \
relative_gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy = \
model.nondimensional_gibbs_free_energy(
np.array(nondimensional_force),
temperature
)
nondimensional_gibbs_free_energy_per_link = \
model.nondimensional_gibbs_free_energy_per_link(
np.array(nondimensional_force),
temperature
)
residual_abs = \
nondimensional_gibbs_free_energy / \
number_of_links \
- nondimensional_gibbs_free_energy_per_link
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
nondimensional_relative_gibbs_free_energy = \
model.nondimensional_relative_gibbs_free_energy(
np.array(nondimensional_force)
)
nondimensional_relative_gibbs_free_energy_per_link = \
model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(nondimensional_force)
)
residual_abs = \
nondimensional_relative_gibbs_free_energy / \
number_of_links \
- nondimensional_relative_gibbs_free_energy_per_link
residual_rel = \
residual_abs / \
nondimensional_relative_gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
class Relative(unittest.TestCase):
def test_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy = \
model.gibbs_free_energy(
np.array(force),
temperature
)
gibbs_free_energy_0 = \
model.gibbs_free_energy(
np.array(
parameters.zero *
parameters.boltzmann_constant*temperature/link_length
),
temperature
)
relative_gibbs_free_energy = \
model.relative_gibbs_free_energy(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy \
- gibbs_free_energy_0 \
- relative_gibbs_free_energy
residual_rel = \
residual_abs / \
gibbs_free_energy_0
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol *
parameters.boltzmann_constant*temperature/link_length
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
gibbs_free_energy_per_link = \
model.gibbs_free_energy_per_link(
np.array(force),
temperature
)
gibbs_free_energy_per_link_0 = \
model.gibbs_free_energy_per_link(
np.array(
parameters.zero *
parameters.boltzmann_constant*temperature/link_length
),
temperature
)
relative_gibbs_free_energy_per_link = \
model.relative_gibbs_free_energy_per_link(
np.array(force),
temperature
)
residual_abs = \
gibbs_free_energy_per_link \
- gibbs_free_energy_per_link_0 \
- relative_gibbs_free_energy_per_link
residual_rel = \
residual_abs / \
gibbs_free_energy_per_link_0
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol *
parameters.boltzmann_constant*temperature/link_length
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy = \
model.nondimensional_gibbs_free_energy(
np.array(nondimensional_force),
temperature
)
nondimensional_gibbs_free_energy_0 = \
model.nondimensional_gibbs_free_energy(
np.array(parameters.zero),
temperature
)
nondimensional_relative_gibbs_free_energy = \
model.nondimensional_relative_gibbs_free_energy(
np.array(nondimensional_force)
)
residual_abs = \
nondimensional_gibbs_free_energy \
- nondimensional_gibbs_free_energy_0 \
- nondimensional_relative_gibbs_free_energy
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy_0
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_gibbs_free_energy_per_link = \
model.nondimensional_gibbs_free_energy_per_link(
np.array(nondimensional_force),
temperature
)
nondimensional_gibbs_free_energy_per_link_0 = \
model.nondimensional_gibbs_free_energy_per_link(
np.array(parameters.zero),
temperature
)
nondimensional_relative_gibbs_free_energy_per_link = \
model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(nondimensional_force)
)
residual_abs = \
nondimensional_gibbs_free_energy_per_link \
- nondimensional_gibbs_free_energy_per_link_0 \
- nondimensional_relative_gibbs_free_energy_per_link
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy_per_link_0
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
class Zero(unittest.TestCase):
def test_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
relative_gibbs_free_energy_0 = \
model.relative_gibbs_free_energy(
np.array(
parameters.zero *
parameters.boltzmann_constant*temperature/link_length
),
temperature
)
self.assertLessEqual(
relative_gibbs_free_energy_0,
parameters.abs_tol *
parameters.boltzmann_constant*temperature
)
def test_relative_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
relative_gibbs_free_energy_per_link_0 = \
model.relative_gibbs_free_energy_per_link(
np.array(
parameters.zero *
parameters.boltzmann_constant*temperature/link_length
),
temperature
)
self.assertLessEqual(
relative_gibbs_free_energy_per_link_0,
parameters.abs_tol *
parameters.boltzmann_constant*temperature
)
def test_nondimensional_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_relative_gibbs_free_energy_0 = \
model.nondimensional_relative_gibbs_free_energy(
np.array(parameters.zero)
)
self.assertLessEqual(
nondimensional_relative_gibbs_free_energy_0,
parameters.abs_tol
)
def test_nondimensional_relative_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_relative_gibbs_free_energy_per_link_0 = \
model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(parameters.zero)
)
self.assertLessEqual(
nondimensional_relative_gibbs_free_energy_per_link_0,
parameters.abs_tol
)
class Connection(unittest.TestCase):
def test_end_to_end_length(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length = \
model.end_to_end_length(
np.array(force),
temperature
)
h_step = parameters.rel_tol * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length_from_derivative = -(
model.relative_gibbs_free_energy(
np.array(force + 0.5*h_step),
temperature
)
- model.relative_gibbs_free_energy(
np.array(force - 0.5*h_step),
temperature
))/h_step
residual_abs = \
end_to_end_length \
- end_to_end_length_from_derivative
self.assertLessEqual(
np.abs(residual_abs), h_step
)
def test_end_to_end_length_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length_per_link = \
model.end_to_end_length_per_link(
np.array(force),
temperature
)
h_step = parameters.rel_tol * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length_per_link_from_derivative = -(
model.relative_gibbs_free_energy_per_link(
np.array(force + 0.5*h_step),
temperature
)
- model.relative_gibbs_free_energy_per_link(
np.array(force - 0.5*h_step),
temperature
))/h_step
residual_abs = \
end_to_end_length_per_link \
- end_to_end_length_per_link_from_derivative
self.assertLessEqual(
np.abs(residual_abs), h_step
)
def test_nondimensional_end_to_end_length(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length = \
model.nondimensional_end_to_end_length(
np.array(nondimensional_force)
)
h_step = parameters.rel_tol
nondimensional_end_to_end_length_from_derivative = -(
model.nondimensional_relative_gibbs_free_energy(
np.array(nondimensional_force + 0.5*h_step)
)
- model.nondimensional_relative_gibbs_free_energy(
np.array(nondimensional_force - 0.5*h_step)
))/h_step
residual_abs = \
nondimensional_end_to_end_length \
- nondimensional_end_to_end_length_from_derivative
self.assertLessEqual(
np.abs(residual_abs), h_step
)
def test_nondimensional_end_to_end_length_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters.nondimensional_force_reference + \
parameters.nondimensional_force_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length_per_link = \
model.nondimensional_end_to_end_length_per_link(
np.array(nondimensional_force)
)
h_step = parameters.rel_tol
nondimensional_end_to_end_length_per_link_from_derivative = -(
model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(nondimensional_force + 0.5*h_step)
)
- model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(nondimensional_force - 0.5*h_step)
))/h_step
residual_abs = \
nondimensional_end_to_end_length_per_link \
- nondimensional_end_to_end_length_per_link_from_derivative
self.assertLessEqual(
np.abs(residual_abs), h_step
)
class Legendre(unittest.TestCase):
def test_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length = \
model.end_to_end_length(
np.array(force),
temperature
)
gibbs_free_energy = \
model.gibbs_free_energy(
np.array(force),
temperature
)
gibbs_free_energy_legendre = \
model.legendre.helmholtz_free_energy(
np.array(force),
temperature
) - force*end_to_end_length
residual_abs = \
gibbs_free_energy \
- gibbs_free_energy_legendre
residual_rel = \
residual_abs / \
gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length_per_link = \
model.end_to_end_length_per_link(
np.array(force),
temperature
)
gibbs_free_energy_per_link = \
model.gibbs_free_energy_per_link(
np.array(force),
temperature
)
gibbs_free_energy_per_link_legendre = \
model.legendre.helmholtz_free_energy_per_link(
np.array(force),
temperature
) - force*end_to_end_length_per_link
residual_abs = \
gibbs_free_energy_per_link \
- gibbs_free_energy_per_link_legendre
residual_rel = \
residual_abs / \
gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length = \
model.end_to_end_length(
np.array(force),
temperature
)
end_to_end_length_0 = \
model.end_to_end_length(
np.array(
parameters.boltzmann_constant*temperature/link_length
* parameters.zero
),
temperature
)
relative_gibbs_free_energy = \
model.relative_gibbs_free_energy(
np.array(force),
temperature
)
relative_gibbs_free_energy_legendre = \
model.legendre.relative_helmholtz_free_energy(
np.array(force),
temperature
) - force*end_to_end_length \
+ end_to_end_length_0 \
* parameters.boltzmann_constant*temperature/link_length \
* parameters.zero
residual_abs = \
relative_gibbs_free_energy \
- relative_gibbs_free_energy_legendre
residual_rel = \
residual_abs / \
relative_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_relative_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
end_to_end_length_per_link = \
model.end_to_end_length_per_link(
np.array(force),
temperature
)
end_to_end_length_per_link_0 = \
model.end_to_end_length_per_link(
np.array(
parameters.boltzmann_constant*temperature/link_length
* parameters.zero
),
temperature
)
relative_gibbs_free_energy_per_link = \
model.relative_gibbs_free_energy_per_link(
np.array(force),
temperature
)
relative_gibbs_free_energy_per_link_legendre = \
model.legendre.relative_helmholtz_free_energy_per_link(
np.array(force),
temperature
) - force*end_to_end_length_per_link \
+ end_to_end_length_per_link_0 \
* parameters.boltzmann_constant*temperature/link_length \
* parameters.zero
residual_abs = \
relative_gibbs_free_energy_per_link \
- relative_gibbs_free_energy_per_link_legendre
residual_rel = \
residual_abs / \
relative_gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length = \
model.nondimensional_end_to_end_length(
np.array(nondimensional_force)
)
nondimensional_gibbs_free_energy = \
model.nondimensional_gibbs_free_energy(
np.array(nondimensional_force),
temperature
)
nondimensional_gibbs_free_energy_legendre = \
model.legendre.nondimensional_helmholtz_free_energy(
np.array(nondimensional_force),
temperature
) - nondimensional_force*nondimensional_end_to_end_length
residual_abs = \
nondimensional_gibbs_free_energy \
- nondimensional_gibbs_free_energy_legendre
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
nondimensional_end_to_end_length_per_link = \
model.nondimensional_end_to_end_length_per_link(
np.array(nondimensional_force)
)
nondimensional_gibbs_free_energy_per_link = \
model.nondimensional_gibbs_free_energy_per_link(
np.array(nondimensional_force),
temperature
)
nondimensional_gibbs_free_energy_per_link_legendre = \
model.legendre.nondimensional_helmholtz_free_energy_per_link(
np.array(nondimensional_force),
temperature
) - nondimensional_force * \
nondimensional_end_to_end_length_per_link
residual_abs = \
nondimensional_gibbs_free_energy_per_link \
- nondimensional_gibbs_free_energy_per_link_legendre
residual_rel = \
residual_abs / \
nondimensional_gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_relative_gibbs_free_energy(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
nondimensional_end_to_end_length = \
model.nondimensional_end_to_end_length(
np.array(nondimensional_force)
)
nondimensional_end_to_end_length_0 = \
model.nondimensional_end_to_end_length(
np.array(parameters.zero)
)
nondimensional_relative_gibbs_free_energy = \
model.nondimensional_relative_gibbs_free_energy(
np.array(nondimensional_force)
)
nondimensional_relative_gibbs_free_energy_legendre = \
model.legendre.nondimensional_relative_helmholtz_free_energy(
np.array(nondimensional_force)
) - nondimensional_force*nondimensional_end_to_end_length \
+ parameters.zero*nondimensional_end_to_end_length_0
residual_abs = \
nondimensional_relative_gibbs_free_energy \
- nondimensional_relative_gibbs_free_energy_legendre
residual_rel = \
residual_abs / \
nondimensional_relative_gibbs_free_energy
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
def test_nondimensional_relative_gibbs_free_energy_per_link(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
nondimensional_end_to_end_length_per_link = \
model.nondimensional_end_to_end_length_per_link(
np.array(nondimensional_force)
)
nondimensional_end_to_end_length_per_link_0 = \
model.nondimensional_end_to_end_length_per_link(
np.array(parameters.zero)
)
nondimensional_relative_gibbs_free_energy_per_link = \
model.nondimensional_relative_gibbs_free_energy_per_link(
np.array(nondimensional_force)
)
nondimensional_relative_gibbs_free_energy_per_link_legendre = \
model.legendre.\
nondimensional_relative_helmholtz_free_energy_per_link(
np.array(nondimensional_force)
) - nondimensional_force * \
nondimensional_end_to_end_length_per_link \
+ parameters.zero*nondimensional_end_to_end_length_per_link_0
residual_abs = \
nondimensional_relative_gibbs_free_energy_per_link \
- nondimensional_relative_gibbs_free_energy_per_link_legendre
residual_rel = \
residual_abs / \
nondimensional_relative_gibbs_free_energy_per_link
self.assertLessEqual(
np.abs(residual_abs),
parameters.abs_tol
)
self.assertLessEqual(
np.abs(residual_rel),
parameters.rel_tol
)
class LegendreConnection(unittest.TestCase):
def test_force(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
temperature = \
parameters.temperature_reference + \
parameters.temperature_scale*(0.5 - np.random.rand())
force = nondimensional_force * \
parameters.boltzmann_constant*temperature/link_length
h_step = parameters.rel_tol * \
parameters.boltzmann_constant*temperature/link_length
force_from_derivative = (
model.legendre.relative_helmholtz_free_energy(
np.array(
force + 0.5*h_step
), temperature
)
- model.legendre.relative_helmholtz_free_energy(
np.array(
force - 0.5*h_step
), temperature
))/(
model.end_to_end_length(
np.array(
force + 0.5*h_step
), temperature
)
- model.end_to_end_length(
np.array(
force - 0.5*h_step
), temperature
))
residual_abs = \
force \
- force_from_derivative
residual_rel = residual_abs/force
self.assertLessEqual(
np.abs(residual_rel), h_step
)
def test_nondimensional_force(self):
for _ in range(parameters.number_of_loops):
number_of_links = \
np.random.randint(
parameters.number_of_links_minimum,
high=parameters.number_of_links_maximum
)
link_length = \
parameters.link_length_reference + \
parameters.link_length_scale*(0.5 - np.random.rand())
hinge_mass = \
parameters.hinge_mass_reference + \
parameters.hinge_mass_scale*(0.5 - np.random.rand())
persistance_length = \
parameters.persistance_length_reference + \
parameters.persistance_length_scale*(0.5 - np.random.rand())
model = WLC(
number_of_links,
link_length,
hinge_mass,
persistance_length
)
nondimensional_force = \
parameters. \
nondimensional_force_reference + \
parameters. \
nondimensional_force_scale * \
(0.5 - np.random.rand())
h_step = parameters.rel_tol
nondimensional_force_from_derivative = (
model.legendre.
nondimensional_relative_helmholtz_free_energy_per_link(
np.array(
nondimensional_force + 0.5*h_step
)
)
- model.legendre.
nondimensional_relative_helmholtz_free_energy_per_link(
np.array(
nondimensional_force - 0.5*h_step
)
))/(
model.nondimensional_end_to_end_length_per_link(
np.array(
nondimensional_force + 0.5*h_step
)
)
- model.nondimensional_end_to_end_length_per_link(
np.array(
nondimensional_force - 0.5*h_step
)
))
residual_abs = \
nondimensional_force \
- nondimensional_force_from_derivative
residual_rel = residual_abs/nondimensional_force
self.assertLessEqual(
np.abs(residual_rel), h_step
)