Exemple #1
0
 def setUpSystemLengthTwo(self) -> None:
     hypercubic_setting.HypercubicSetting(beta=1.0,
                                          dimension=3,
                                          system_length=2.0)
     setting.set_number_of_root_nodes(2)
     setting.set_number_of_nodes_per_root_node(2)
     setting.set_number_of_node_levels(1)
     self._potential = MergedImageCoulombPotential(alpha=3.45,
                                                   fourier_cutoff=6,
                                                   position_cutoff=2,
                                                   prefactor=1.0)
     self._variant_potential = MergedImageCoulombPotential(
         alpha=5.0, fourier_cutoff=9, position_cutoff=2)
Exemple #2
0
 def test_ewald_position_cutoff_zero_raises_no_error(self):
     self.setUpSystemLengthOne()
     MergedImageCoulombPotential(alpha=3.45,
                                 fourier_cutoff=6,
                                 position_cutoff=0,
                                 prefactor=1.0)
     self.assertTrue(True)
Exemple #3
0
 def test_ewald_position_cutoff_negative_raises_error(self):
     self.setUpSystemLengthOne()
     with self.assertRaises(ConfigurationError):
         MergedImageCoulombPotential(alpha=3.45,
                                     fourier_cutoff=6,
                                     position_cutoff=-2,
                                     prefactor=1.0)
Exemple #4
0
 def test_ewald_converge_factor_zero_raises_error(self):
     self.setUpSystemLengthOne()
     with self.assertRaises(ConfigurationError):
         MergedImageCoulombPotential(alpha=0,
                                     fourier_cutoff=6,
                                     position_cutoff=2,
                                     prefactor=1.0)
Exemple #5
0
 def test_dimension_unequal_three_raises_error(self):
     hypercubic_setting.HypercubicSetting(beta=1.0,
                                          dimension=2,
                                          system_length=1.0)
     setting.set_number_of_root_nodes(2)
     setting.set_number_of_nodes_per_root_node(2)
     setting.set_number_of_node_levels(1)
     with self.assertRaises(ConfigurationError):
         MergedImageCoulombPotential(alpha=3.45,
                                     fourier_cutoff=6,
                                     position_cutoff=2,
                                     prefactor=1.0)
     setting.reset()
     hypercubic_setting.HypercubicSetting(beta=1.0,
                                          dimension=1,
                                          system_length=1.0)
     setting.set_number_of_root_nodes(2)
     setting.set_number_of_nodes_per_root_node(2)
     setting.set_number_of_node_levels(1)
     with self.assertRaises(ConfigurationError):
         MergedImageCoulombPotential(alpha=3.45,
                                     fourier_cutoff=6,
                                     position_cutoff=2,
                                     prefactor=1.0)
Exemple #6
0
 def test_setting_not_initialized_raises_error(self):
     with self.assertRaises(ConfigurationError):
         MergedImageCoulombPotential(alpha=3.45,
                                     fourier_cutoff=6,
                                     position_cutoff=2,
                                     prefactor=1.0)
Exemple #7
0
class TestMergedImageCoulombPotential(TestCase):
    def setUpSystemLengthOne(self) -> None:
        hypercubic_setting.HypercubicSetting(beta=1.0,
                                             dimension=3,
                                             system_length=1.0)
        # Set these so the settings are initialized
        setting.set_number_of_root_nodes(2)
        setting.set_number_of_nodes_per_root_node(2)
        setting.set_number_of_node_levels(1)
        self._potential = MergedImageCoulombPotential(alpha=3.45,
                                                      fourier_cutoff=6,
                                                      position_cutoff=2,
                                                      prefactor=1.0)
        self._variant_potential = MergedImageCoulombPotential(
            alpha=5.0, fourier_cutoff=9, position_cutoff=2)

    def setUpSystemLengthTwo(self) -> None:
        hypercubic_setting.HypercubicSetting(beta=1.0,
                                             dimension=3,
                                             system_length=2.0)
        setting.set_number_of_root_nodes(2)
        setting.set_number_of_nodes_per_root_node(2)
        setting.set_number_of_node_levels(1)
        self._potential = MergedImageCoulombPotential(alpha=3.45,
                                                      fourier_cutoff=6,
                                                      position_cutoff=2,
                                                      prefactor=1.0)
        self._variant_potential = MergedImageCoulombPotential(
            alpha=5.0, fourier_cutoff=9, position_cutoff=2)

    def tearDown(self) -> None:
        setting.reset()

    def test_direction_zero_positive_charge_product_system_length_one(self):
        self.setUpSystemLengthOne()
        # Value calculated with Mathematica to very high precision
        self.assertAlmostEqual(self._potential.derivative(
            [1.0, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.322464150019139,
                               places=12)
        # The derivative does not depend on the absolute value of the velocity but only on the non-vanishing component.
        self.assertAlmostEqual(self._potential.derivative(
            [3.1, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.322464150019139 * 3.1,
                               places=12)

    def test_direction_zero_negative_charge_product_system_length_one(self):
        self.setUpSystemLengthOne()
        self.assertAlmostEqual(self._potential.derivative(
            [1.0, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.322464150019139,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [3.1, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.322464150019139 * 3.1,
                               places=12)

    def test_direction_one_positive_charge_product_system_length_one(self):
        self.setUpSystemLengthOne()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 1.0, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, 1.0),
                               6.322464150019139,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 3.1, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, 1.0),
                               6.322464150019139 * 3.1,
                               places=12)

    def test_direction_one_negative_charge_product_system_length_one(self):
        self.setUpSystemLengthOne()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 1.0, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.322464150019139,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 3.1, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.322464150019139 * 3.1,
                               places=12)

    def test_direction_two_positive_charge_product_system_length_one(self):
        self.setUpSystemLengthOne()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 1.0], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, 1.0),
                               6.322464150019139,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 3.1], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, 1.0),
                               6.322464150019139 * 3.1,
                               places=12)

    def test_direction_two_negative_charge_product_system_length_one(self):
        self.setUpSystemLengthOne()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 1.0], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, -1.0),
                               -6.322464150019139,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 3.1], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, -1.0),
                               -6.322464150019139 * 3.1,
                               places=12)

    def test_variant_potential_system_length_one(self):
        self.setUpSystemLengthOne()
        self.assertAlmostEqual(self._variant_potential.derivative(
            [1.0, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.322464150019139,
                               places=12)
        self.assertAlmostEqual(self._variant_potential.derivative(
            [3.1, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.322464150019139 * 3.1,
                               places=12)

    def test_direction_zero_positive_charge_product_system_length_two(self):
        self.setUpSystemLengthTwo()
        # Value calculated with Mathematica to very high precision
        self.assertAlmostEqual(self._potential.derivative(
            [1.0, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [3.1, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.742588479793721 * 3.1,
                               places=12)

    def test_direction_zero_negative_charge_product_system_length_two(self):
        self.setUpSystemLengthTwo()
        self.assertAlmostEqual(self._potential.derivative(
            [1.0, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [3.1, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.742588479793721 * 3.1,
                               places=12)

    def test_direction_one_positive_charge_product_system_length_two(self):
        self.setUpSystemLengthTwo()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 1.0, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, 1.0),
                               6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 3.1, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, 1.0),
                               6.742588479793721 * 3.1,
                               places=12)

    def test_direction_one_negative_charge_product_system_length_two(self):
        self.setUpSystemLengthTwo()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 1.0, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 3.1, 0.0], [1.0 / 8.0, 1.0 / 7.0, 1.0 / 5.0], 1.0, -1.0),
                               -6.742588479793721 * 3.1,
                               places=12)

    def test_direction_two_positive_charge_product_system_length_two(self):
        self.setUpSystemLengthTwo()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 1.0], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, 1.0),
                               6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 3.1], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, 1.0),
                               6.742588479793721 * 3.1,
                               places=12)

    def test_direction_two_negative_charge_product_system_length_two(self):
        self.setUpSystemLengthTwo()
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 1.0], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, -1.0),
                               -6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._potential.derivative(
            [0.0, 0.0, 3.1], [1.0 / 5.0, 1.0 / 8.0, 1.0 / 7.0], 1.0, -1.0),
                               -6.742588479793721 * 3.1,
                               places=12)

    def test_variant_potential_system_length_two(self):
        self.setUpSystemLengthTwo()
        self.assertAlmostEqual(self._variant_potential.derivative(
            [1.0, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.742588479793721,
                               places=12)
        self.assertAlmostEqual(self._variant_potential.derivative(
            [3.1, 0.0, 0.0], [1.0 / 7.0, 1.0 / 8.0, 1.0 / 5.0], 1.0, 1.0),
                               6.742588479793721 * 3.1,
                               places=12)

    def test_number_separation_arguments_is_one(self):
        self.setUpSystemLengthOne()
        self.assertEqual(self._potential.number_separation_arguments, 1)
        self.assertEqual(self._variant_potential.number_separation_arguments,
                         1)

    def test_number_charge_arguments_is_two(self):
        self.setUpSystemLengthOne()
        self.assertEqual(self._potential.number_charge_arguments, 2)
        self.assertEqual(self._variant_potential.number_charge_arguments, 2)

    def test_velocity_zero_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(AssertionError):
            self._potential.derivative([0.0, 0.0, 0.0], [0.7, 0.6, -0.1], 1.0,
                                       1.0)
        with self.assertRaises(AssertionError):
            self._variant_potential.derivative([0.0, 0.0, 0.0],
                                               [0.7, 0.6, -0.1], 1.0, 1.0)

    def test_negative_velocity_along_axis_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(AssertionError):
            self._potential.derivative([-1.0, 0.0, 0.0], [0.7, 0.6, -0.1], 1.0,
                                       1.0)
        with self.assertRaises(AssertionError):
            self._potential.derivative([0.0, -1.0, 0.0], [0.7, 0.6, -0.1], 1.0,
                                       1.0)
        with self.assertRaises(AssertionError):
            self._potential.derivative([0.0, 0.0, -1.0], [0.7, 0.6, -0.1], 1.0,
                                       1.0)
        with self.assertRaises(AssertionError):
            self._variant_potential.derivative([-1.0, 0.0, 0.0],
                                               [0.7, 0.6, -0.1], 1.0, 1.0)
        with self.assertRaises(AssertionError):
            self._variant_potential.derivative([0.0, -1.0, 0.0],
                                               [0.7, 0.6, -0.1], 1.0, 1.0)
        with self.assertRaises(AssertionError):
            self._variant_potential.derivative([0.0, 0.0, -1.0],
                                               [0.7, 0.6, -0.1], 1.0, 1.0)

    def test_velocity_not_parallel_to_axis_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(AssertionError):
            self._potential.derivative([1.0, 3.1, 0.0], [0.7, 0.6, -0.1], 1.0,
                                       1.0)
        with self.assertRaises(AssertionError):
            self._variant_potential.derivative([0.0, 1.0, 3.1],
                                               [0.7, 0.6, -0.1], 1.0, 1.0)

    def test_prefactor_zero_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=3.45,
                                        fourier_cutoff=6,
                                        position_cutoff=2,
                                        prefactor=0.0)

    def test_ewald_converge_factor_negative_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=-3.45,
                                        fourier_cutoff=6,
                                        position_cutoff=2,
                                        prefactor=1.0)

    def test_ewald_converge_factor_zero_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=0,
                                        fourier_cutoff=6,
                                        position_cutoff=2,
                                        prefactor=1.0)

    def test_ewald_fourier_cutoff_negative_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=3.45,
                                        fourier_cutoff=-1,
                                        position_cutoff=2,
                                        prefactor=1.0)

    def test_ewald_fourier_cutoff_zero_raises_no_error(self):
        self.setUpSystemLengthOne()
        MergedImageCoulombPotential(alpha=3.45,
                                    fourier_cutoff=0,
                                    position_cutoff=2,
                                    prefactor=1.0)
        self.assertTrue(True)

    def test_ewald_position_cutoff_negative_raises_error(self):
        self.setUpSystemLengthOne()
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=3.45,
                                        fourier_cutoff=6,
                                        position_cutoff=-2,
                                        prefactor=1.0)

    def test_ewald_position_cutoff_zero_raises_no_error(self):
        self.setUpSystemLengthOne()
        MergedImageCoulombPotential(alpha=3.45,
                                    fourier_cutoff=6,
                                    position_cutoff=0,
                                    prefactor=1.0)
        self.assertTrue(True)

    def test_dimension_unequal_three_raises_error(self):
        hypercubic_setting.HypercubicSetting(beta=1.0,
                                             dimension=2,
                                             system_length=1.0)
        setting.set_number_of_root_nodes(2)
        setting.set_number_of_nodes_per_root_node(2)
        setting.set_number_of_node_levels(1)
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=3.45,
                                        fourier_cutoff=6,
                                        position_cutoff=2,
                                        prefactor=1.0)
        setting.reset()
        hypercubic_setting.HypercubicSetting(beta=1.0,
                                             dimension=1,
                                             system_length=1.0)
        setting.set_number_of_root_nodes(2)
        setting.set_number_of_nodes_per_root_node(2)
        setting.set_number_of_node_levels(1)
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=3.45,
                                        fourier_cutoff=6,
                                        position_cutoff=2,
                                        prefactor=1.0)

    def test_setting_not_initialized_raises_error(self):
        with self.assertRaises(ConfigurationError):
            MergedImageCoulombPotential(alpha=3.45,
                                        fourier_cutoff=6,
                                        position_cutoff=2,
                                        prefactor=1.0)