class TestParticlesSlimSource(TestParticlesSource):
    tested_class = SlimCUDSSource

    def setUp(self):
        self.points = [
            [0.0, 0.0, 0.0], [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
        self.bonds = [[0, 1], [0, 3], [1, 3, 2]]
        self.point_temperature = [10., 20., 30., 40.]
        self.point_radius = [1., 2., 3., 4.]
        self.point_mass = [4., 8., 16., 32.]
        self.bond_temperature = [60., 80., 190., 5.]

        self.container = Particles('test')

        # add particles
        def particle_iter():
            for temp, radius, mass, point in zip(
                    self.point_temperature,
                    self.point_radius,
                    self.point_mass,
                    self.points):
                yield Particle(coordinates=point,
                               data=DataContainer(
                                   TEMPERATURE=temp,
                                   RADIUS=radius,
                                   MASS=mass))

        self.point_uids = self.container.add(particle_iter())

        # add bonds
        def bond_iter():
            for temp, indices in zip(self.bond_temperature, self.bonds):
                yield Bond(particles=[self.point_uids[index]
                                      for index in indices],
                           data=DataContainer(
                               TEMPERATURE=temp,
                               ))

        self.bond_uids = self.container.add(bond_iter())

        # for testing save/load visualization
        self.temp_dir = tempfile.mkdtemp()

    def test_particles(self):
        cuds = self.container

        source = SlimCUDSSource(cuds=cuds)

        self.assertEqual(len(source._point_scalars_list), 4)
        for entry in ['', 'MASS', 'RADIUS', 'TEMPERATURE']:
            self.assertIn(entry, source._point_scalars_list)

        dataset = source.data
        self.assertEqual(dataset.point_data.number_of_arrays, 1)
        self.assertEqual(source.point_scalars_name, 'MASS')

        source.point_scalars_name = "TEMPERATURE"
        dataset = source.data
        points = dataset.points.to_array()
        vtk_cuds = source._vtk_cuds

        self.assertEqual(dataset.point_data.number_of_arrays, 1)
        temperature = dataset.point_data.get_array('TEMPERATURE')
        for key, index in vtk_cuds.particle2index.iteritems():
            point = self.container.get(key)
            assert_array_equal(points[index], point.coordinates)
            self.assertEqual(temperature[index], point.data[CUBA.TEMPERATURE])

        source.point_scalars_name = "MASS"
        self.assertEqual(dataset.point_data.number_of_arrays, 1)
        dataset = source.data
        mass = dataset.point_data.get_array('MASS')
        for key, index in vtk_cuds.particle2index.iteritems():
            point = self.container.get(key)
            assert_array_equal(points[index], point.coordinates)
            self.assertEqual(mass[index], point.data[CUBA.MASS])

        source.point_scalars_name = ""
        dataset = source.data
        self.assertEqual(dataset.point_data.number_of_arrays, 0)

    def test_available_keys(self):
        available_keys = _available_keys(self.container)

        self.assertEqual(available_keys["point_scalars"],
                         {CUBA.TEMPERATURE,
                          CUBA.RADIUS,
                          CUBA.MASS})

        self.assertEqual(available_keys["point_vectors"], set())
        self.assertEqual(available_keys["cell_scalars"], {CUBA.TEMPERATURE})
        self.assertEqual(available_keys["cell_vectors"], set())

    def test_bonds(self):
        source = SlimCUDSSource(cuds=self.container)

        # We should have two entries in the available cuba data, one for
        # temperature and one for blank
        self.assertEqual(len(source._cell_scalars_list), 2)
        for entry in ['', 'TEMPERATURE']:
            self.assertIn(entry, source._cell_scalars_list)

        dataset = source.data
        # The actual array set in the cell data should be empty if selection
        # is blank
        self.assertEqual(dataset.cell_data.number_of_arrays, 1)
        self.assertEqual(source.cell_scalars_name, 'TEMPERATURE')

        # Clearing should empty the data again
        source.cell_scalars_name = ""
        dataset = source.data
        self.assertEqual(dataset.cell_data.number_of_arrays, 0)

        # Selecting temperature triggers the transfer from cuds to vtk cuds
        # of only the selected array
        source.cell_scalars_name = "TEMPERATURE"
        dataset = source.data
        vtk_cuds = source._vtk_cuds
        bonds = [
            bond for bond in cell_array_slicer(dataset.lines.to_array())]
        number_of_bonds = len(self.bonds)
        self.assertEqual(len(bonds), number_of_bonds)
        self.assertEqual(len(vtk_cuds.bond2index), number_of_bonds)
        self.assertEqual(dataset.cell_data.number_of_arrays, 1)

        temperature = dataset.cell_data.get_array('TEMPERATURE')
        for key, index in vtk_cuds.bond2index.iteritems():
            bond = self.container.get(key)
            particles = [
                vtk_cuds.particle2index[uid] for uid in bond.particles]
            self.assertEqual(bonds[index], particles)
            self.assertEqual(temperature[index], bond.data[CUBA.TEMPERATURE])

    @unittest.skip("Cannot perform save/load with SlimCUDSSource")
    def test_save_load_visualization_with_mlab(self):
        pass

    @unittest.skip("Cannot perform save/load with SlimCUDSSource")
    def test_save_load_visualization_with_null_engine(self):
        pass

    def test_start_setup(self):
        source = SlimCUDSSource(cuds=self.container)

        self.assertEqual(source.point_scalars_name, "MASS")
        self.assertEqual(source.point_vectors_name, "")
        self.assertEqual(source.cell_scalars_name, "TEMPERATURE")
        self.assertEqual(source.cell_vectors_name, "")

        self.assertEqual(len(source._point_scalars_list), 4)
        self.assertEqual(len(source._point_vectors_list), 1)
        self.assertEqual(len(source._cell_scalars_list), 2)
        self.assertEqual(len(source._cell_vectors_list), 1)

        source = SlimCUDSSource(cuds=self.container,
                                point_scalars="TEMPERATURE")

        self.assertEqual(source.point_scalars_name, "TEMPERATURE")
        self.assertEqual(source.point_vectors_name, "")
        self.assertEqual(source.cell_scalars_name, "TEMPERATURE")
        self.assertEqual(source.cell_vectors_name, "")

        self.assertEqual(len(source._point_scalars_list), 4)
        self.assertEqual(len(source._point_vectors_list), 1)
        self.assertEqual(len(source._cell_scalars_list), 2)
        self.assertEqual(len(source._cell_vectors_list), 1)

    def test_changing_names(self):
        source = SlimCUDSSource(cuds=self.container,
                                point_scalars="TEMPERATURE")

        point_attrs, cell_attrs = get_all_attributes(source.data)
        self.assertEqual(len(point_attrs["scalars"]), 1)
        self.assertEqual(point_attrs["scalars"][0], "TEMPERATURE")

        source.point_scalars_name = ""
        point_attrs, cell_attrs = get_all_attributes(source.data)
        self.assertEqual(len(point_attrs["scalars"]), 0)

    def test_unexistent_choice(self):
        # This should work and trigger no error
        source = SlimCUDSSource(point_scalars="TEMPERATURE")
        self.assertEqual(source.point_scalars_name, '')

    def test_changing_cuds(self):
        source = SlimCUDSSource()

        source.cuds = self.container
        source.point_scalars_name = "TEMPERATURE"
        point_attrs, cell_attrs = get_all_attributes(source.data)
        self.assertEqual(len(point_attrs["scalars"]), 1)
        self.assertEqual(point_attrs["scalars"][0], "TEMPERATURE")

        source.point_scalars_name = ""
        point_attrs, cell_attrs = get_all_attributes(source.data)
        self.assertEqual(len(point_attrs["scalars"]), 0)

    def test_combo_selection_preserved(self):
        dummy_engine = DummyEngine()
        source = SlimCUDSSource(cuds=dummy_engine.get_dataset("particles"),
                                point_scalars="MASS", point_vectors="")

        self.assertEqual(source.point_scalars_name, "MASS")
        self.assertEqual(source.point_vectors_name, "")

        source.start()

        self.assertEqual(source.point_scalars_name, "MASS")
        self.assertEqual(source.point_vectors_name, "")
예제 #2
0
# define the interatomic force as material relation
lj = api.LennardJones_6_12([mat, mat], name='LennardJones')
lj.cutoff_distance = 2.5
lj.energy_well_depth = 1.0
lj.van_der_waals_radius = 1.0
# lj.material = [cuds.get('mat'), cuds.get('mat')]

cuds.add([lj])

# initialization of the simulation
sim = Simulation(cuds, "LAMMPS", engine_interface=EngineInterface.Internal)
sim.run()

thermo = api.NoseHoover(name='thermo')
thermo.temperature = [1.0, 1.2]
thermo.coupling_time = 0.00000025
thermo.material = [cuds.get(mat.uid)]
cuds.add([thermo])
pc = cuds.get_by_name('Test')
# pc is now a proxy to the pc in the "wrapper" managed by the sim.
particle = pc.get(input_particles[0].uid)

particle.data[CUBA.VELOCITY] = [
    numpy.random.uniform(-0.5, 0.5),
    numpy.random.uniform(-0.5, 0.5),
    numpy.random.uniform(-0.5, 0.5)
]
pc.update([particle])
sim.run()