Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/molecule_geometry.cpp

    rf429d7 r52d777  
    1919#include "World.hpp"
    2020#include "Plane.hpp"
    21 #include "Matrix.hpp"
    22 #include "Box.hpp"
    2321#include <boost/foreach.hpp>
    2422
     
    3533  const Vector *Center = DetermineCenterOfAll();
    3634  const Vector *CenterBox = DetermineCenterOfBox();
    37   Box &domain = World::getInstance().getDomain();
     35  double * const cell_size = World::getInstance().getDomain();
     36  double *M = ReturnFullMatrixforSymmetric(cell_size);
     37  double *Minv = InverseMatrix(M);
    3838
    3939  // go through all atoms
    4040  ActOnAllVectors( &Vector::SubtractVector, *Center);
    4141  ActOnAllVectors( &Vector::SubtractVector, *CenterBox);
    42   BOOST_FOREACH(atom* iter, atoms){
    43     *iter->node = domain.WrapPeriodically(*iter->node);
    44   }
    45 
     42  ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
     43
     44  delete[](M);
     45  delete[](Minv);
    4646  delete(Center);
     47  delete(CenterBox);
    4748  return status;
    4849};
     
    5556{
    5657  bool status = true;
    57   Box &domain = World::getInstance().getDomain();
     58  double * const cell_size = World::getInstance().getDomain();
     59  double *M = ReturnFullMatrixforSymmetric(cell_size);
     60  double *Minv = InverseMatrix(M);
    5861
    5962  // go through all atoms
    60   BOOST_FOREACH(atom* iter, atoms){
    61     *iter->node = domain.WrapPeriodically(*iter->node);
    62   }
    63 
     63  ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
     64
     65  delete[](M);
     66  delete[](Minv);
    6467  return status;
    6568};
     
    150153{
    151154  Vector *a = new Vector(0.5,0.5,0.5);
    152   const Matrix &M = World::getInstance().getDomain().getM();
    153   (*a) *= M;
     155
     156  const double *cell_size = World::getInstance().getDomain();
     157  double *M = ReturnFullMatrixforSymmetric(cell_size);
     158  a->MatrixMultiplication(M);
     159  delete[](M);
     160
    154161  return a;
    155162};
     
    237244void molecule::TranslatePeriodically(const Vector *trans)
    238245{
    239   Box &domain = World::getInstance().getDomain();
     246  double * const cell_size = World::getInstance().getDomain();
     247  double *M = ReturnFullMatrixforSymmetric(cell_size);
     248  double *Minv = InverseMatrix(M);
    240249
    241250  // go through all atoms
    242251  ActOnAllVectors( &Vector::AddVector, *trans);
    243   BOOST_FOREACH(atom* iter, atoms){
    244     *iter->node = domain.WrapPeriodically(*iter->node);
    245   }
    246 
     252  ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
     253
     254  delete[](M);
     255  delete[](Minv);
    247256};
    248257
     
    255264  OBSERVE;
    256265  Plane p(*n,0);
    257   BOOST_FOREACH(atom* iter, atoms ){
     266  BOOST_FOREACH( atom* iter, atoms ){
    258267    (*iter->node) = p.mirrorVector(*iter->node);
    259268  }
     
    265274void molecule::DeterminePeriodicCenter(Vector &center)
    266275{
    267   const Matrix &matrix = World::getInstance().getDomain().getM();
    268   const Matrix &inversematrix = World::getInstance().getDomain().getM();
     276  double * const cell_size = World::getInstance().getDomain();
     277  double *matrix = ReturnFullMatrixforSymmetric(cell_size);
     278  double *inversematrix = InverseMatrix(matrix);
    269279  double tmp;
    270280  bool flag;
     
    278288      if ((*iter)->type->Z != 1) {
    279289#endif
    280         Testvector = inversematrix * (*iter)->x;
     290        Testvector = (*iter)->x;
     291        Testvector.MatrixMultiplication(inversematrix);
    281292        Translationvector.Zero();
    282293        for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) {
     
    295306        }
    296307        Testvector += Translationvector;
    297         Testvector *= matrix;
     308        Testvector.MatrixMultiplication(matrix);
    298309        Center += Testvector;
    299310        Log() << Verbose(1) << "vector is: " << Testvector << endl;
     
    302313        for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) {
    303314          if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) {
    304             Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x;
     315            Testvector = (*Runner)->GetOtherAtom((*iter))->x;
     316            Testvector.MatrixMultiplication(inversematrix);
    305317            Testvector += Translationvector;
    306             Testvector *= matrix;
     318            Testvector.MatrixMultiplication(matrix);
    307319            Center += Testvector;
    308320            Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl;
     
    313325    }
    314326  } while (!flag);
     327  delete[](matrix);
     328  delete[](inversematrix);
    315329
    316330  Center.Scale(1./static_cast<double>(getAtomCount()));
     
    374388    DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... ");
    375389    // the eigenvectors specify the transformation matrix
    376     Matrix M = Matrix(evec->data);
    377     BOOST_FOREACH(atom* iter, atoms){
    378       (*iter->node) *= M;
    379     }
     390    ActOnAllVectors( &Vector::MatrixMultiplication, (const double *) evec->data );
    380391    DoLog(0) && (Log() << Verbose(0) << "done." << endl);
    381392
Note: See TracChangeset for help on using the changeset viewer.