Пример #1
0
bool Cube::setLimits(const Molecule &mol, double spacing_, double padding)
{
  Index numAtoms = mol.atomCount();
  Vector3 min_, max_;
  if (numAtoms) {
    Vector3 curPos = min_ = max_ = mol.atomPositions3d()[0];
    for (Index i = 1; i < numAtoms; ++i) {
      curPos = mol.atomPositions3d()[i];
      if (curPos.x() < min_.x())
        min_.x() = curPos.x();
      if (curPos.x() > max_.x())
        max_.x() = curPos.x();
      if (curPos.y() < min_.y())
        min_.y() = curPos.y();
      if (curPos.y() > max_.y())
        max_.y() = curPos.y();
      if (curPos.z() < min_.z())
        min_.z() = curPos.z();
      if (curPos.z() > max_.z())
        max_.z() = curPos.z();
    }
  }
  else {
    min_ = max_ = Vector3::Zero();
  }

  // Now to take care of the padding term
  min_ += Vector3(-padding,-padding,-padding);
  max_ += Vector3( padding, padding, padding);

  return setLimits(min_, max_, spacing_);
}
TEST_F(MoleculeSerializationTest, roundTrip)
{
  MoleculeSerializer serializer(&this->ethane);

  size_t size = serializer.size();

  uint8 *data = new uint8[size];

  bool success = serializer.serialize(data, size);
  EXPECT_TRUE(success);

  Molecule after;

  MoleculeDeserializer deserializer(&after);
  success = deserializer.deserialize(data, size);
  EXPECT_TRUE(success);

  delete[] data;

  EXPECT_EQ(this->ethane.atomicNumbers(), after.atomicNumbers());

  std::vector<Avogadro::Vector2> expected2d = this->ethane.atomPositions2d();
  std::vector<Avogadro::Vector2> actual2d = after.atomPositions2d();

  EXPECT_EQ(expected2d.size(), actual2d.size());

  for (size_t i = 0; i < expected2d.size(); i++)
    EXPECT_TRUE(this->equal(expected2d[i], actual2d[i]));

  std::vector<Avogadro::Vector3> expected3d = this->ethane.atomPositions3d();
  std::vector<Avogadro::Vector3> actual3d = after.atomPositions3d();

  EXPECT_EQ(expected3d.size(), actual3d.size());

  for (size_t i = 0; i < expected3d.size(); i++)
    EXPECT_TRUE(this->equal(expected3d[i], actual3d[i]));

  const std::vector<std::pair<size_t, size_t> > expectedBondPairs
    = this->ethane.bondPairs();
  const std::vector<std::pair<size_t, size_t> > actualBondPairs
    = after.bondPairs();

  EXPECT_EQ(expectedBondPairs.size(), actualBondPairs.size());

  for (size_t i = 0; i < expectedBondPairs.size(); i++) {
    EXPECT_EQ(expectedBondPairs[i].first, actualBondPairs[i].first);
    EXPECT_EQ(expectedBondPairs[i].second, actualBondPairs[i].second);
  }

  const std::vector<unsigned char> expectedBondOrder
    = this->ethane.bondOrders();
  const std::vector<unsigned char> actualBondOrder = after.bondOrders();

  for (size_t i = 0; i < expectedBondOrder.size(); i++)
    EXPECT_EQ(expectedBondOrder[i], actualBondOrder[i]);
}
Пример #3
0
TEST(UnitCellTest, fractionalCoordinates)
{
  Molecule mol = createCrystal(static_cast<Real>(3.0),
                               static_cast<Real>(4.0),
                               static_cast<Real>(5.0),
                               static_cast<Real>(90.0),
                               static_cast<Real>(120.0),
                               static_cast<Real>(77.0));
  mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(0),
                                       static_cast<Real>(0),
                                       static_cast<Real>(0)));
  mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(0.7),
                                       static_cast<Real>(2.23733),
                                       static_cast<Real>(2.14574)));
  mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(2.07490),
                                       static_cast<Real>(2.09303),
                                       static_cast<Real>(1.07287)));
  mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(3),
                                       static_cast<Real>(0),
                                       static_cast<Real>(0)));
  mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(0.89980),
                                       static_cast<Real>(3.89748),
                                       static_cast<Real>(0)));
  mol.addAtom(1).setPosition3d(Vector3(static_cast<Real>(-2.5),
                                       static_cast<Real>(0.57717),
                                       static_cast<Real>(4.29149)));
  Array<Vector3> ccoords_ref = mol.atomPositions3d();

  Array<Vector3> fcoords;
  EXPECT_TRUE(CrystalTools::fractionalCoordinates(mol, fcoords));
  EXPECT_EQ(mol.atomCount(), fcoords.size());
  EXPECT_TRUE(std::fabs(fcoords[0][0] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[0][1] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[0][2] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[1][0] - static_cast<Real>(0.5)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[1][1] - static_cast<Real>(0.5)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[1][2] - static_cast<Real>(0.5)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[2][0] - static_cast<Real>(0.75)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[2][1] - static_cast<Real>(0.5)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[2][2] - static_cast<Real>(0.25)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[3][0] - static_cast<Real>(1)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[3][1] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[3][2] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[4][0] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[4][1] - static_cast<Real>(1)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[4][2] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[5][0] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[5][1] - static_cast<Real>(0)) < 1e-4);
  EXPECT_TRUE(std::fabs(fcoords[5][2] - static_cast<Real>(1)) < 1e-4);

  mol.atomPositions3d().clear();
  EXPECT_TRUE(CrystalTools::setFractionalCoordinates(mol, fcoords));
  Array<Vector3> ccoords = mol.atomPositions3d();
  for (int i = 0; i < 6; ++i) {
    for (int j = 0; j < 3; ++j) {
      EXPECT_FLOAT_EQ(static_cast<float>(ccoords_ref[i][j]),
                      static_cast<float>(ccoords[i][j]))
          << " (i=" << i << "j=" << j << ")";
    }
  }
}