Changeset bc3953 for molecuilder/src


Ignore:
Timestamp:
Aug 20, 2009, 3:40:49 PM (16 years ago)
Author:
Saskia Metzler <metzler@…>
Children:
2aea0b, 390a2b
Parents:
6c6d84
Message:

Ticket 17: Write new function molecule::CopyMoleculeFromSubRegion()

Location:
molecuilder/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • molecuilder/src/atom.cpp

    r6c6d84 rbc3953  
    3838  previous = NULL;
    3939  next = NULL;
    40   father = this;  // generally, father is itself
     40  father = pointer;  // generally, father is itself
    4141  Ancestor = NULL;
    4242  GraphNr = -1;
     
    5353  nr = -1;
    5454  sort = &nr;
     55  node = &x;
    5556}
    5657
  • molecuilder/src/molecules.cpp

    r6c6d84 rbc3953  
    176176 * Increases molecule::last_atom and gives last number to added atom.
    177177 * \param *pointer allocated and set atom
    178  * \return true - succeeded, false - atom not found in list
     178 * \return pointer to the newly added atom
    179179 */
    180180atom * molecule::AddCopyAtom(atom *pointer)
     
    612612  return copy;
    613613};
     614
     615
     616/**
     617 * Copies all atoms of a molecule which are within the defined parallelepiped.
     618 *
     619 * @param offest for the origin of the parallelepiped
     620 * @param three vectors forming the matrix that defines the shape of the parallelpiped
     621 */
     622molecule* molecule::CopyMoleculeFromSubRegion(Vector offset, double *parallelepiped) {
     623  molecule *copy = new molecule(elemente);
     624  atom *Walker = start;
     625
     626  while(Walker->next != end) {
     627    Walker = Walker->next;
     628    if (Walker->x.IsInParallelepiped(offset, parallelepiped)) {
     629      cout << "Adding atom " << *Walker << endl;
     630      copy->AddCopyAtom(Walker);
     631    }
     632  }
     633
     634  //TODO: copy->BuildInducedSubgraph((ofstream *)&cout, this);
     635
     636  return copy;
     637}
    614638
    615639/** Adds a bond to a the molecule specified by two atoms, \a *first and \a *second.
  • molecuilder/src/molecules.hpp

    r6c6d84 rbc3953  
    207207
    208208  molecule *CopyMolecule();
     209  molecule* CopyMoleculeFromSubRegion(Vector offset, double *parallelepiped);
    209210
    210211  /// Fragment molecule by two different approaches:
  • molecuilder/src/vector.cpp

    r6c6d84 rbc3953  
    12211221  return true;
    12221222};
     1223
     1224/**
     1225 * Checks whether this vector is within the parallelepiped defined by the given three vectors and
     1226 * their offset.
     1227 *
     1228 * @param offest for the origin of the parallelepiped
     1229 * @param three vectors forming the matrix that defines the shape of the parallelpiped
     1230 */
     1231bool Vector::IsInParallelepiped(Vector offset, double *parallelepiped)
     1232{
     1233  Vector a;
     1234  a.CopyVector(this);
     1235  a.SubtractVector(&offset);
     1236  a.InverseMatrixMultiplication(parallelepiped);
     1237  bool isInside = true;
     1238
     1239  for (int i=NDIM;i--;)
     1240    isInside = isInside && ((a.x[i] <= 1) && (a.x[i] >= 0));
     1241
     1242  return isInside;
     1243}
  • molecuilder/src/vector.hpp

    r6c6d84 rbc3953  
    6868  void AskPosition(double *cell_size, bool check);
    6969  bool Output(ofstream *out) const;
     70  bool IsInParallelepiped(Vector offset, double *parallelepiped);
    7071};
    7172
  • molecuilder/src/vectorunittest.cpp

    r6c6d84 rbc3953  
    258258}
    259259
     260/**
     261 * UnitTest for Vector::IsInParallelepiped().
     262 */
     263void VectorTest::IsInParallelepipedTest()
     264{
     265  double parallelepiped[NDIM*NDIM];
     266  parallelepiped[0] = 1;
     267  parallelepiped[1] = 0;
     268  parallelepiped[2] = 0;
     269  parallelepiped[3] = 0;
     270  parallelepiped[4] = 1;
     271  parallelepiped[5] = 0;
     272  parallelepiped[6] = 0;
     273  parallelepiped[7] = 0;
     274  parallelepiped[8] = 1;
     275
     276  fixture.CopyVector(zero);
     277  CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     278  fixture.Init(2.5,2.5,2.5);
     279  CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     280  fixture.Init(1.,1.,1.);
     281  CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     282  fixture.Init(3.5,3.5,3.5);
     283  CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     284  fixture.Init(2.,2.,2.);
     285  CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     286  fixture.Init(2.,3.,2.);
     287  CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     288  fixture.Init(-2.,2.,-1.);
     289  CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
     290}
     291
    260292
    261293/********************************************** Main routine **************************************/
  • molecuilder/src/vectorunittest.hpp

    r6c6d84 rbc3953  
    2828    CPPUNIT_TEST ( LineIntersectionTest );
    2929    CPPUNIT_TEST ( VectorRotationTest );
     30    CPPUNIT_TEST ( IsInParallelepipedTest );
    3031    CPPUNIT_TEST_SUITE_END();
    3132
     
    4445    void LineIntersectionTest();
    4546    void VectorRotationTest();
     47    void IsInParallelepipedTest();
    4648
    4749private:
Note: See TracChangeset for help on using the changeset viewer.