Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/molecule_geometry.cpp

    r52d777 rf429d7  
    1919#include "World.hpp"
    2020#include "Plane.hpp"
     21#include "Matrix.hpp"
     22#include "Box.hpp"
    2123#include <boost/foreach.hpp>
    2224
     
    3335  const Vector *Center = DetermineCenterOfAll();
    3436  const Vector *CenterBox = DetermineCenterOfBox();
    35   double * const cell_size = World::getInstance().getDomain();
    36   double *M = ReturnFullMatrixforSymmetric(cell_size);
    37   double *Minv = InverseMatrix(M);
     37  Box &domain = World::getInstance().getDomain();
    3838
    3939  // go through all atoms
    4040  ActOnAllVectors( &Vector::SubtractVector, *Center);
    4141  ActOnAllVectors( &Vector::SubtractVector, *CenterBox);
    42   ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
    43 
    44   delete[](M);
    45   delete[](Minv);
     42  BOOST_FOREACH(atom* iter, atoms){
     43    *iter->node = domain.WrapPeriodically(*iter->node);
     44  }
     45
    4646  delete(Center);
    47   delete(CenterBox);
    4847  return status;
    4948};
     
    5655{
    5756  bool status = true;
    58   double * const cell_size = World::getInstance().getDomain();
    59   double *M = ReturnFullMatrixforSymmetric(cell_size);
    60   double *Minv = InverseMatrix(M);
     57  Box &domain = World::getInstance().getDomain();
    6158
    6259  // go through all atoms
    63   ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
    64 
    65   delete[](M);
    66   delete[](Minv);
     60  BOOST_FOREACH(atom* iter, atoms){
     61    *iter->node = domain.WrapPeriodically(*iter->node);
     62  }
     63
    6764  return status;
    6865};
     
    153150{
    154151  Vector *a = new Vector(0.5,0.5,0.5);
    155 
    156   const double *cell_size = World::getInstance().getDomain();
    157   double *M = ReturnFullMatrixforSymmetric(cell_size);
    158   a->MatrixMultiplication(M);
    159   delete[](M);
    160 
     152  const Matrix &M = World::getInstance().getDomain().getM();
     153  (*a) *= M;
    161154  return a;
    162155};
     
    244237void molecule::TranslatePeriodically(const Vector *trans)
    245238{
    246   double * const cell_size = World::getInstance().getDomain();
    247   double *M = ReturnFullMatrixforSymmetric(cell_size);
    248   double *Minv = InverseMatrix(M);
     239  Box &domain = World::getInstance().getDomain();
    249240
    250241  // go through all atoms
    251242  ActOnAllVectors( &Vector::AddVector, *trans);
    252   ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
    253 
    254   delete[](M);
    255   delete[](Minv);
     243  BOOST_FOREACH(atom* iter, atoms){
     244    *iter->node = domain.WrapPeriodically(*iter->node);
     245  }
     246
    256247};
    257248
     
    264255  OBSERVE;
    265256  Plane p(*n,0);
    266   BOOST_FOREACH( atom* iter, atoms ){
     257  BOOST_FOREACH(atom* iter, atoms ){
    267258    (*iter->node) = p.mirrorVector(*iter->node);
    268259  }
     
    274265void molecule::DeterminePeriodicCenter(Vector &center)
    275266{
    276   double * const cell_size = World::getInstance().getDomain();
    277   double *matrix = ReturnFullMatrixforSymmetric(cell_size);
    278   double *inversematrix = InverseMatrix(matrix);
     267  const Matrix &matrix = World::getInstance().getDomain().getM();
     268  const Matrix &inversematrix = World::getInstance().getDomain().getM();
    279269  double tmp;
    280270  bool flag;
     
    288278      if ((*iter)->type->Z != 1) {
    289279#endif
    290         Testvector = (*iter)->x;
    291         Testvector.MatrixMultiplication(inversematrix);
     280        Testvector = inversematrix * (*iter)->x;
    292281        Translationvector.Zero();
    293282        for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) {
     
    306295        }
    307296        Testvector += Translationvector;
    308         Testvector.MatrixMultiplication(matrix);
     297        Testvector *= matrix;
    309298        Center += Testvector;
    310299        Log() << Verbose(1) << "vector is: " << Testvector << endl;
     
    313302        for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) {
    314303          if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) {
    315             Testvector = (*Runner)->GetOtherAtom((*iter))->x;
    316             Testvector.MatrixMultiplication(inversematrix);
     304            Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x;
    317305            Testvector += Translationvector;
    318             Testvector.MatrixMultiplication(matrix);
     306            Testvector *= matrix;
    319307            Center += Testvector;
    320308            Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl;
     
    325313    }
    326314  } while (!flag);
    327   delete[](matrix);
    328   delete[](inversematrix);
    329315
    330316  Center.Scale(1./static_cast<double>(getAtomCount()));
     
    388374    DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... ");
    389375    // the eigenvectors specify the transformation matrix
    390     ActOnAllVectors( &Vector::MatrixMultiplication, (const double *) evec->data );
     376    Matrix M = Matrix(evec->data);
     377    BOOST_FOREACH(atom* iter, atoms){
     378      (*iter->node) *= M;
     379    }
    391380    DoLog(0) && (Log() << Verbose(0) << "done." << endl);
    392381
Note: See TracChangeset for help on using the changeset viewer.