Beispiel #1
0
    def test_fene(self):
        # system parameters
        box_l = 10.0
        system.box_l = [box_l, box_l, box_l]
        skin = 0.4
        time_step = 0.01
        system.time_step = time_step

        # thermostat and cell system
        system.cell_system.skin = skin
        system.periodicity = [1, 1, 1]

        # particles and bond
        system.part.add(
            id=0, pos=[9.9, 9.75, 9.9], type=0, mol_id=0, fix=[1, 1, 1])
        system.part.add(
            id=1, pos=[9.9, 10.25, 9.9], type=0, mol_id=0, fix=[1, 1, 1])

        k = 1e4
        d_r_max = 1.5
        r_0 = 0.1

        fene = FeneBond(k=k, d_r_max=d_r_max, r_0=r_0)
        system.bonded_inter.add(fene)
        system.part[0].add_bond((fene, 1))
        system.integrator.run(steps=0)

        sim_stress_bonded = system.analysis.stress_tensor()['bonded']
        sim_stress_fene = system.analysis.stress_tensor()[
            'bonded', len(system.bonded_inter) - 1]

        total_bonded_stresses = np.zeros([3, 3])
        for i in range(len(system.bonded_inter)):
            total_bonded_stresses = np.add(
                total_bonded_stresses, system.analysis.stress_tensor()['bonded', i])

        anal_stress_fene = self.get_anal_stress_fene(
            system.part[0].pos, system.part[1].pos, k, d_r_max, r_0)
        self.assertTrue(np.max(np.abs(sim_stress_bonded - anal_stress_fene))
                        < tol, 'bonded stress does not match analytical result')
        self.assertTrue(np.max(np.abs(sim_stress_fene - anal_stress_fene))
                        < tol, 'bonded stress for fene  does not match analytical result')
        self.assertTrue(np.max(np.abs(sim_stress_bonded - total_bonded_stresses))
                        < tol, 'bonded stresses do not sum up to the total value')

        sim_pressure_fene = system.analysis.pressure()[
            'bonded', len(system.bonded_inter) - 1]
        anal_pressure_fene = np.einsum("ii", anal_stress_fene) / 3.0
        self.assertTrue(np.max(np.abs(sim_pressure_fene - anal_pressure_fene))
                        < tol, 'bonded pressure for fene does not match analytical result')

        # Compare stress tensor observable to stress tensor from analysis
        np.testing.assert_allclose(
            StressTensor().calculate(),
            system.analysis.stress_tensor()["total"].reshape(9),
            atol=1E-10)

        system.part.clear()
Beispiel #2
0
    def test(self):
        # system parameters
        system.box_l = 3 * [10.0]
        skin = 0.4
        time_step = 0.01
        system.time_step = time_step

        # thermostat and cell system
        system.thermostat.set_langevin(kT=0.0, gamma=1.0, seed=41)
        system.cell_system.skin = skin
        system.periodicity = [1, 1, 1]

        # particles and bond
        system.part.add(id=0, pos=[9.9, 9.75, 9.9], type=0, mol_id=0)
        system.part.add(id=1, pos=[9.9, 10.25, 9.9], type=0, mol_id=0)
        system.part.add(id=2, pos=[0.1, 9.7, 0.1], type=1, mol_id=1)
        system.part.add(id=3, pos=[0.1, 10.3, 0.1], type=2, mol_id=2)

        harmonic = HarmonicBond(k=1e4, r_0=0)
        system.bonded_inter.add(harmonic)
        system.part[0].add_bond((harmonic, 1))
        system.part[2].add_bond((harmonic, 3))

        system.non_bonded_inter[0, 0].lennard_jones.set_params(epsilon=1.0,
                                                               sigma=1.0,
                                                               cutoff=2.0,
                                                               shift=0)
        system.non_bonded_inter[1, 2].lennard_jones.set_params(epsilon=1.0,
                                                               sigma=1.0,
                                                               cutoff=2.0,
                                                               shift=0)

        system.integrator.run(steps=0)

        system.part[0].v = [10.0, 20.0, 30.0]
        system.part[1].v = [-15, -25, -35]
        system.part[2].v = [27.0, 23.0, 17.0]
        system.part[3].v = [13.0, 11.0, 19.0]

        pos = system.part[:].pos
        vel = system.part[:].v

        sim_stress_kinetic = system.analysis.stress_tensor()['kinetic']
        sim_stress_bonded = system.analysis.stress_tensor()['bonded']
        sim_stress_bonded_harmonic = system.analysis.stress_tensor()[
            'bonded', len(system.bonded_inter) - 1]
        sim_stress_nonbonded = system.analysis.stress_tensor()['non_bonded']
        sim_stress_nonbonded_inter = system.analysis.stress_tensor(
        )['non_bonded_inter']
        sim_stress_nonbonded_inter12 = system.analysis.stress_tensor()[
            'non_bonded_inter', 1, 2]
        sim_stress_nonbonded_intra = system.analysis.stress_tensor(
        )['non_bonded_intra']
        sim_stress_nonbonded_intra00 = system.analysis.stress_tensor()[
            'non_bonded_intra', 0, 0]
        sim_stress_total = system.analysis.stress_tensor()['total']
        sim_pressure_kinetic = system.analysis.pressure()['kinetic']
        sim_pressure_bonded = system.analysis.pressure()['bonded']
        sim_pressure_bonded_harmonic = system.analysis.pressure()[
            'bonded', len(system.bonded_inter) - 1]
        sim_pressure_nonbonded = system.analysis.pressure()['non_bonded']
        sim_pressure_nonbonded_inter = system.analysis.pressure(
        )['non_bonded_inter']
        sim_pressure_nonbonded_inter12 = system.analysis.pressure()[
            'non_bonded_inter', 1, 2]
        sim_pressure_nonbonded_intra = system.analysis.pressure(
        )['non_bonded_intra']
        sim_pressure_nonbonded_intra00 = system.analysis.pressure()[
            'non_bonded_intra', 0, 0]
        sim_pressure_total = system.analysis.pressure()['total']

        anal_stress_kinetic = stress_kinetic(vel)
        anal_stress_bonded = stress_bonded(pos)
        anal_stress_nonbonded = stress_nonbonded(system.part.pairs())
        anal_stress_nonbonded_inter = stress_nonbonded_inter(
            system.part.pairs())
        anal_stress_nonbonded_intra = stress_nonbonded_intra(
            system.part.pairs())
        anal_stress_total = anal_stress_kinetic + \
            anal_stress_bonded + anal_stress_nonbonded
        anal_pressure_kinetic = np.einsum('ii', anal_stress_kinetic) / 3.0
        anal_pressure_bonded = np.einsum('ii', anal_stress_bonded) / 3.0
        anal_pressure_nonbonded = np.einsum('ii', anal_stress_nonbonded) / 3.0
        anal_pressure_nonbonded_inter = np.einsum(
            'ii', anal_stress_nonbonded_inter) / 3.0
        anal_pressure_nonbonded_intra = np.einsum(
            'ii', anal_stress_nonbonded_intra) / 3.0
        anal_pressure_total = anal_pressure_kinetic + \
            anal_pressure_bonded + anal_pressure_nonbonded

        system.part.clear()

        self.assertTrue(
            np.max(np.abs(sim_stress_kinetic - anal_stress_kinetic)) < tol,
            'kinetic stress does not match analytical result')
        self.assertTrue(
            np.max(np.abs(sim_stress_bonded - anal_stress_bonded)) < tol,
            'bonded stress does not match analytical result')
        self.assertTrue(
            np.max(
                np.abs(sim_stress_bonded_harmonic - anal_stress_bonded)) < tol,
            'bonded stress harmonic bond does not match analytical result')
        self.assertTrue(
            np.max(np.abs(sim_stress_nonbonded - anal_stress_nonbonded)) < tol,
            'non-bonded stress does not match analytical result')
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_inter -
                       anal_stress_nonbonded_inter)) < tol,
            'non-bonded intermolecular stress does not match analytical result'
        )
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_inter12 -
                       anal_stress_nonbonded_inter)) < tol,
            'non-bonded intermolecular stress molecules 1 and 2 does not match analytical result'
        )
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_intra -
                       anal_stress_nonbonded_intra)) < tol,
            'non-bonded intramolecular stress does not match analytical result'
        )
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_intra00 -
                       anal_stress_nonbonded_intra)) < tol,
            'non-bonded intramolecular stress molecule 0 does not match analytical result'
        )
        self.assertTrue(
            np.max(np.abs(sim_stress_total - anal_stress_total)) < tol,
            'total stress does not match analytical result')
        self.assertTrue(
            np.max(
                np.abs(sim_stress_total - sim_stress_kinetic -
                       sim_stress_bonded - sim_stress_nonbonded)) < tol,
            'total stress is not given as the sum of all major stress components'
        )
        self.assertTrue(
            np.abs(sim_pressure_kinetic - anal_pressure_kinetic) < tol,
            'kinetic pressure does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_bonded - anal_pressure_bonded) < tol,
            'bonded pressure does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_bonded_harmonic - anal_pressure_bonded) < tol,
            'bonded pressure harmonic bond does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_nonbonded - anal_pressure_nonbonded) < tol,
            'non-bonded pressure does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_inter -
                   anal_pressure_nonbonded_inter) < tol,
            'non-bonded intermolecular pressure does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_inter12 -
                   anal_pressure_nonbonded_inter) < tol,
            'non-bonded intermolecular pressure molecule 1 and 2 does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_intra -
                   anal_pressure_nonbonded_intra) < tol,
            'non-bonded intramolecular pressure does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_intra00 -
                   anal_pressure_nonbonded_intra) < tol,
            'non-bonded intramolecular pressure molecule 0 does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_total - anal_pressure_total) < tol,
            'total pressure does not match analytical result')
        self.assertTrue(
            np.max(
                np.abs(sim_pressure_total - sim_pressure_kinetic -
                       sim_pressure_bonded - sim_pressure_nonbonded)) < tol,
            'total pressure is not given as the sum of all major pressure components'
        )

        # Compare stress tensor observable to stress tensor from analysis
        np.testing.assert_allclose(
            StressTensor().calculate(),
            system.analysis.stress_tensor()["total"].reshape(9),
            atol=1E-10)
Beispiel #3
0
    def test(self):
        # system parameters
        box_l = 10.0
        system.box_l = [box_l, box_l, box_l]
        skin = 0.4
        time_step = 0.01
        system.time_step = time_step

        # thermostat and cell system
        system.thermostat.set_langevin(kT=0.0, gamma=1.0)
        system.cell_system.skin = skin
        system.periodicity = [1, 1, 1]

        # particles and bond
        system.part.add(id=0, pos=[9.9, 9.75, 9.9], type=0, mol_id=0)
        system.part.add(id=1, pos=[9.9, 10.25, 9.9], type=0, mol_id=0)
        system.part.add(id=2, pos=[0.1, 9.7, 0.1], type=1, mol_id=1)
        system.part.add(id=3, pos=[0.1, 10.3, 0.1], type=2, mol_id=2)

        harmonic = HarmonicBond(k=1e4, r_0=0)
        system.bonded_inter.add(harmonic)
        system.part[0].add_bond((harmonic, 1))
        system.part[2].add_bond((harmonic, 3))

        system.non_bonded_inter[0, 0].lennard_jones.set_params(epsilon=1.0,
                                                               sigma=1.0,
                                                               cutoff=2.0,
                                                               shift=0)
        system.non_bonded_inter[1, 2].lennard_jones.set_params(epsilon=1.0,
                                                               sigma=1.0,
                                                               cutoff=2.0,
                                                               shift=0)

        # calculate forces and stress with Lees-Edwards offset
        le_offset = 0.3
        system.lees_edwards_offset = le_offset
        system.integrator.run(steps=0)

        system.part[0].v = [10.0, 20.0, 30.0]
        system.part[1].v = [-15, -25, -35]
        system.part[2].v = [27.0, 23.0, 17.0]
        system.part[3].v = [13.0, 11.0, 19.0]

        pos = system.part[:].pos
        vel = system.part[:].v

        sim_stress_kinetic = system.analysis.stress_tensor()['kinetic']
        sim_stress_bonded = system.analysis.stress_tensor()['bonded']
        sim_stress_bonded_harmonic = system.analysis.stress_tensor()[
            'bonded', len(system.bonded_inter) - 1]
        sim_stress_nonbonded = system.analysis.stress_tensor()['non_bonded']
        sim_stress_nonbonded_inter = system.analysis.stress_tensor(
        )['non_bonded_inter']
        sim_stress_nonbonded_inter12 = system.analysis.stress_tensor()[
            'non_bonded_inter', 1, 2]
        sim_stress_nonbonded_intra = system.analysis.stress_tensor(
        )['non_bonded_intra']
        sim_stress_nonbonded_intra00 = system.analysis.stress_tensor()[
            'non_bonded_intra', 0, 0]
        sim_stress_total = system.analysis.stress_tensor()['total']
        sim_pressure_kinetic = system.analysis.pressure()['kinetic']
        sim_pressure_bonded = system.analysis.pressure()['bonded']
        sim_pressure_bonded_harmonic = system.analysis.pressure()[
            'bonded', len(system.bonded_inter) - 1]
        sim_pressure_nonbonded = system.analysis.pressure()['non_bonded']
        sim_pressure_nonbonded_inter = system.analysis.pressure(
        )['non_bonded_inter']
        sim_pressure_nonbonded_inter12 = system.analysis.pressure()[
            'non_bonded_inter', 1, 2]
        sim_pressure_nonbonded_intra = system.analysis.pressure(
        )['non_bonded_intra']
        sim_pressure_nonbonded_intra00 = system.analysis.pressure()[
            'non_bonded_intra', 0, 0]
        sim_pressure_total = system.analysis.pressure()['total']

        anal_stress_kinetic = stress_kinetic(vel, box_l)
        anal_stress_bonded = stress_bonded(pos, box_l)
        anal_stress_nonbonded = stress_nonbonded(system.part.pairs(), box_l)
        anal_stress_nonbonded_inter = stress_nonbonded_inter(
            system.part.pairs(), box_l)
        anal_stress_nonbonded_intra = stress_nonbonded_intra(
            system.part.pairs(), box_l)
        anal_stress_total = anal_stress_kinetic + anal_stress_bonded + anal_stress_nonbonded
        anal_pressure_kinetic = np.einsum('ii', anal_stress_kinetic) / 3.0
        anal_pressure_bonded = np.einsum('ii', anal_stress_bonded) / 3.0
        anal_pressure_nonbonded = np.einsum('ii', anal_stress_nonbonded) / 3.0
        anal_pressure_nonbonded_inter = np.einsum(
            'ii', anal_stress_nonbonded_inter) / 3.0
        anal_pressure_nonbonded_intra = np.einsum(
            'ii', anal_stress_nonbonded_intra) / 3.0
        anal_pressure_total = anal_pressure_kinetic + anal_pressure_bonded + anal_pressure_nonbonded

        print('le_offset = {}'.format(system.lees_edwards_offset))

        print('particle positions')
        print(pos)
        print('particle velocities')
        print(vel)

        print('\nsimulated kinetic pressure=')
        print(sim_pressure_kinetic)
        print('analytical kinetic pressure=')
        print(anal_pressure_kinetic)

        print('\nsimulated bonded pressure=')
        print(sim_pressure_bonded)
        print('analytical bonded pressure=')
        print(anal_pressure_bonded)

        print('\nsimulated bonded pressure harmonic bond=')
        print(sim_pressure_bonded_harmonic)
        print('analytical bonded pressure harmonic bond=')
        print(anal_pressure_bonded)

        print('\nsimulated non-bonded pressure=')
        print(sim_pressure_nonbonded)
        print('analytic non-bonded pressure=')
        print(anal_pressure_nonbonded)

        print('\nsimulated non-bonded intermolecular pressure=')
        print(sim_pressure_nonbonded_inter)
        print('analytic non-bonded intermolecular pressure=')
        print(anal_pressure_nonbonded_inter)

        print(
            '\nsimulated non-bonded intermolecular pressure molecule 1 and 2=')
        print(sim_pressure_nonbonded_inter12)
        print('analytic non-bonded intermolecular pressure molecule 1 and 2=')
        print(anal_pressure_nonbonded_inter)

        print('\nsimulated non-bonded intramolecular pressure=')
        print(sim_pressure_nonbonded_intra)
        print('analytic non-bonded intramolecular pressure=')
        print(anal_pressure_nonbonded_intra)

        print('\nsimulated non-bonded intramolecular pressure molecule 0=')
        print(sim_pressure_nonbonded_intra00)
        print('analytic non-bonded intramolecular pressure molecule 0=')
        print(anal_pressure_nonbonded_intra)

        print('\nsimulated total pressure=')
        print(sim_pressure_total)
        print('analytic total pressure=')
        print(anal_pressure_total)

        print('\nsimulated kinetic stress=')
        print(sim_stress_kinetic)
        print('analytic kinetic stress=')
        print(anal_stress_kinetic)

        print('\nsimulated bonded stress=')
        print(sim_stress_bonded)
        print('analytic bonded stress=')
        print(anal_stress_bonded)

        print('\nsimulated bonded stress harmonic bond=')
        print(sim_stress_bonded_harmonic)
        print('analytic bonded stress harmonic bond=')
        print(anal_stress_bonded)

        print('\nsimulated non-bonded stress=')
        print(sim_stress_nonbonded)
        print('analytic non-bonded stress=')
        print(anal_stress_nonbonded)

        print('\nsimulated non-bonded intermolecular stress=')
        print(sim_stress_nonbonded_inter)
        print('analytic non-bonded intermolecular stress=')
        print(anal_stress_nonbonded_inter)

        print(
            '\nsimulated non-bonded intermolecular stress between molecule 1 and 2='
        )
        print(sim_stress_nonbonded_inter12)
        print(
            'analytic non-bonded intermolecular stress between molecule 1 and 2='
        )
        print(anal_stress_nonbonded_inter)

        print('\nsimulated total non-bonded intramolecular stress=')
        print(sim_stress_nonbonded_intra)
        print('analytic total non-bonded intramolecular stress=')
        print(anal_stress_nonbonded_intra)

        print('\nsimulated non-bonded intramolecular stress molecule 0=')
        print(sim_stress_nonbonded_intra00)
        print('analytic non-bonded intramolecular stress molecule 0=')
        print(anal_stress_nonbonded_intra)

        print('\nsimulated total stress=')
        print(sim_stress_total)
        print('analytic total stress=')
        print(anal_stress_total)

        system.part.clear()

        self.assertTrue(
            np.max(np.abs(sim_stress_kinetic - anal_stress_kinetic)) < tol,
            'kinetic stress does not match analytical result')
        self.assertTrue(
            np.max(np.abs(sim_stress_bonded - anal_stress_bonded)) < tol,
            'bonded stress does not match analytical result')
        self.assertTrue(
            np.max(
                np.abs(sim_stress_bonded_harmonic - anal_stress_bonded)) < tol,
            'bonded stress harmonic bond does not match analytical result')
        self.assertTrue(
            np.max(np.abs(sim_stress_nonbonded - anal_stress_nonbonded)) < tol,
            'non-bonded stress does not match analytical result')
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_inter -
                       anal_stress_nonbonded_inter)) < tol,
            'non-bonded intermolecular stress does not match analytical result'
        )
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_inter12 -
                       anal_stress_nonbonded_inter)) < tol,
            'non-bonded intermolecular stress molecules 1 and 2 does not match analytical result'
        )
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_intra -
                       anal_stress_nonbonded_intra)) < tol,
            'non-bonded intramolecular stress does not match analytical result'
        )
        self.assertTrue(
            np.max(
                np.abs(sim_stress_nonbonded_intra00 -
                       anal_stress_nonbonded_intra)) < tol,
            'non-bonded intramolecular stress molecule 0 does not match analytical result'
        )
        self.assertTrue(
            np.max(np.abs(sim_stress_total - anal_stress_total)) < tol,
            'total stress does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_kinetic - anal_pressure_kinetic) < tol,
            'kinetic pressure does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_bonded - anal_pressure_bonded) < tol,
            'bonded pressure does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_bonded_harmonic - anal_pressure_bonded) < tol,
            'bonded pressure harmonic bond does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_nonbonded - anal_pressure_nonbonded) < tol,
            'non-bonded pressure does not match analytical result')
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_inter -
                   anal_pressure_nonbonded_inter) < tol,
            'non-bonded intermolecular pressure does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_inter12 -
                   anal_pressure_nonbonded_inter) < tol,
            'non-bonded intermolecular pressure molecule 1 and 2 does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_intra -
                   anal_pressure_nonbonded_intra) < tol,
            'non-bonded intramolecular pressure does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_nonbonded_intra00 -
                   anal_pressure_nonbonded_intra) < tol,
            'non-bonded intramolecular pressure molecule 0 does not match analytical result'
        )
        self.assertTrue(
            np.abs(sim_pressure_total - anal_pressure_total) < tol,
            'total pressure does not match analytical result')
        # Compare stress tensor observable to stress tensor from analysis
        np.testing.assert_allclose(
            StressTensor().calculate(),
            system.analysis.stress_tensor()["total"].reshape(9),
            atol=1E-10)