Changes in / [192f6e:4e10f5]


Ignore:
Files:
22 added
4 deleted
108 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/ActionRegistry.hpp

    r192f6e r4e10f5  
    99#define ACTIONREGISTRY_HPP_
    1010
    11 #include <iostream>
     11#include <iosfwd>
    1212#include <string>
    1313#include <map>
  • src/Actions/AnalysisAction/PairCorrelationAction.cpp

    r192f6e r4e10f5  
    1212#include "boundary.hpp"
    1313#include "linkedcell.hpp"
     14#include "verbose.hpp"
    1415#include "log.hpp"
    1516#include "element.hpp"
     
    6768  dialog = UIFactory::getInstance().makeDialog();
    6869  if (type == "P")
    69     dialog->queryVector("position", &Point, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription("position"));
     70    dialog->queryVector("position", &Point, false, MapOfActions::getInstance().getDescription("position"));
    7071  if (type == "S")
    7172    dialog->queryMolecule("molecule-by-id", &Boundary, MapOfActions::getInstance().getDescription("molecule-by-id"));
  • src/Actions/AtomAction/AddAction.cpp

    r192f6e r4e10f5  
    4141
    4242  dialog->queryElement(NAME, &elements, MapOfActions::getInstance().getDescription(NAME));
    43   dialog->queryVector("position", &position, World::getInstance().getDomain(), true, MapOfActions::getInstance().getDescription("position"));
     43  dialog->queryVector("position", &position, true, MapOfActions::getInstance().getDescription("position"));
    4444  cout << "pre-dialog" << endl;
    4545
  • src/Actions/AtomsCalculation_impl.hpp

    r192f6e r4e10f5  
    1111#include "Actions/AtomsCalculation.hpp"
    1212#include "Actions/Calculation_impl.hpp"
    13 
    14 #include <iostream>
    1513
    1614using namespace std;
  • src/Actions/MapOfActions.cpp

    r192f6e r4e10f5  
    1717#include <boost/optional.hpp>
    1818#include <boost/program_options.hpp>
     19
     20#include <iostream>
    1921
    2022#include "CommandLineParser.hpp"
  • src/Actions/MoleculeAction/BondFileAction.cpp

    r192f6e r4e10f5  
    2424#include "config.hpp"
    2525#include "defs.hpp"
     26#include "verbose.hpp"
    2627#include "log.hpp"
    2728#include "molecule.hpp"
  • src/Actions/MoleculeAction/FillWithMoleculeAction.cpp

    r192f6e r4e10f5  
    6262
    6363  dialog->queryString(NAME, &filename, MapOfActions::getInstance().getDescription(NAME));
    64   dialog->queryVector("distances", &distances, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription("distances"));
    65   dialog->queryVector("lengths", &lengths, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription("lengths"));
     64  dialog->queryVector("distances", &distances, false, MapOfActions::getInstance().getDescription("distances"));
     65  dialog->queryVector("lengths", &lengths, false, MapOfActions::getInstance().getDescription("lengths"));
    6666  dialog->queryBoolean("DoRotate", &DoRotate, MapOfActions::getInstance().getDescription("DoRotate"));
    6767  dialog->queryDouble("MaxDistance", &MaxDistance, MapOfActions::getInstance().getDescription("MaxDistance"));
  • src/Actions/MoleculeAction/SuspendInWaterAction.cpp

    r192f6e r4e10f5  
    2222#include "boundary.hpp"
    2323#include "config.hpp"
     24#include "verbose.hpp"
    2425#include "log.hpp"
    2526#include "config.hpp"
  • src/Actions/MoleculeAction/TranslateAction.cpp

    r192f6e r4e10f5  
    5555  bool periodic = false;
    5656
    57   dialog->queryVector(NAME, &x, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription(NAME));
     57  dialog->queryVector(NAME, &x, false, MapOfActions::getInstance().getDescription(NAME));
    5858  dialog->queryMolecule("molecule-by-id", &mol, MapOfActions::getInstance().getDescription("molecule-by-id"));
    5959  dialog->queryBoolean("periodic", &periodic, MapOfActions::getInstance().getDescription("periodic"));
  • src/Actions/WorldAction/AddEmptyBoundaryAction.cpp

    r192f6e r4e10f5  
    4141  int j=0;
    4242
    43   dialog->queryVector(NAME, &boundary, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription(NAME));
     43  dialog->queryVector(NAME, &boundary, false, MapOfActions::getInstance().getDescription(NAME));
    4444
    4545  if(dialog->display()) {
     
    5959    }
    6060    // set new box size
    61     double * const cell_size = World::getInstance().getDomain();
     61    double * const cell_size = new double[6];
    6262    for (j=0;j<6;j++)
    6363      cell_size[j] = 0.;
     
    6767      cell_size[j] = (Max[i]-Min[i]+2.*boundary[i]);
    6868    }
     69    World::getInstance().setDomain(cell_size);
     70    delete[] cell_size;
    6971    // translate all atoms, such that Min is aty (0,0,0)
    7072    AtomRunner = AllAtoms.begin();
  • src/Actions/WorldAction/CenterInBoxAction.cpp

    r192f6e r4e10f5  
    3434  Dialog *dialog = UIFactory::getInstance().makeDialog();
    3535
    36   double * cell_size = World::getInstance().getDomain();
     36  Box& cell_size = World::getInstance().getDomain();
    3737  dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME));
    3838
    3939  if(dialog->display()) {
    40     World::getInstance().setDomain(cell_size);
    4140    // center
    4241    vector<molecule *> AllMolecules = World::getInstance().getAllMolecules();
  • src/Actions/WorldAction/CenterOnEdgeAction.cpp

    r192f6e r4e10f5  
    1313#include "vector.hpp"
    1414#include "World.hpp"
     15#include "Matrix.hpp"
    1516
    1617#include <iostream>
     
    3738  Vector Min;
    3839  Vector Max;
    39   int j=0;
    4040
    4141  dialog->queryEmpty(NAME, MapOfActions::getInstance().getDescription(NAME));
     
    5757    }
    5858    // set new box size
    59     double * const cell_size = World::getInstance().getDomain();
    60     for (j=0;j<6;j++)
    61       cell_size[j] = 0.;
    62     j=-1;
     59    Matrix domain;
    6360    for (int i=0;i<NDIM;i++) {
    64       j += i+1;
    65       cell_size[j] = (Max[i]-Min[i]);
     61      double tmp = Max[i]-Min[i];
     62      tmp = fabs(tmp)>=1. ? tmp : 1.0;
     63      domain.at(i,i) = tmp;
    6664    }
    67     World::getInstance().setDomain(cell_size);
     65    World::getInstance().setDomain(domain);
    6866    // translate all atoms, such that Min is aty (0,0,0)
    6967    for (vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner)
  • src/Actions/WorldAction/ChangeBoxAction.cpp

    r192f6e r4e10f5  
    1212#include "verbose.hpp"
    1313#include "World.hpp"
     14#include "Box.hpp"
     15#include "Matrix.hpp"
    1416
    1517#include <iostream>
     
    3436  Dialog *dialog = UIFactory::getInstance().makeDialog();
    3537
    36   double * cell_size = World::getInstance().getDomain();
     38  Box& cell_size = World::getInstance().getDomain();
    3739  dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME));
    3840
    3941  if(dialog->display()) {
    40     DoLog(0) && (Log() << Verbose(0) << "Setting box domain to " << cell_size[0] << "," << cell_size[1] << "," << cell_size[2] << "," << cell_size[3] << "," << cell_size[4] << "," << cell_size[5] << "," << endl);
    41     World::getInstance().setDomain(cell_size);
     42    DoLog(0) && (Log() << Verbose(0) << "Setting box domain to " << cell_size.getM() << endl);
    4243    delete dialog;
    4344    return Action::success;
  • src/Actions/WorldAction/RemoveSphereOfAtomsAction.cpp

    r192f6e r4e10f5  
    4141
    4242  dialog->queryDouble(NAME, &radius, MapOfActions::getInstance().getDescription(NAME));
    43   dialog->queryVector("position", &point, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription("position"));
     43  dialog->queryVector("position", &point, false, MapOfActions::getInstance().getDescription("position"));
    4444
    4545  if(dialog->display()) {
  • src/Actions/WorldAction/RepeatBoxAction.cpp

    r192f6e r4e10f5  
    1313#include "molecule.hpp"
    1414#include "vector.hpp"
     15#include "Matrix.hpp"
    1516#include "verbose.hpp"
    1617#include "World.hpp"
     18#include "Box.hpp"
    1719
    1820#include <iostream>
     
    4648  MoleculeListClass *molecules = World::getInstance().getMolecules();
    4749
    48   dialog->queryVector(NAME, &Repeater, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription(NAME));
     50  dialog->queryVector(NAME, &Repeater, false, MapOfActions::getInstance().getDescription(NAME));
    4951  //dialog->queryMolecule("molecule-by-id", &mol,MapOfActions::getInstance().getDescription("molecule-by-id"));
    5052  vector<molecule *> AllMolecules;
     
    5961  if(dialog->display()) {
    6062    (cout << "Repeating box " << Repeater << " times for (x,y,z) axis." << endl);
    61     double * const cell_size = World::getInstance().getDomain();
    62     double *M = ReturnFullMatrixforSymmetric(cell_size);
     63    Matrix M = World::getInstance().getDomain().getM();
     64    Matrix newM = M;
    6365    Vector x,y;
    6466    int n[NDIM];
     67    Matrix repMat;
    6568    for (int axis = 0; axis < NDIM; axis++) {
    6669      Repeater[axis] = floor(Repeater[axis]);
     
    6972        Repeater[axis] = 1;
    7073      }
    71       cell_size[ ((axis == 1) ? 2 : (axis == 2) ? 5 : 0) ] *= Repeater[axis];
     74      repMat.at(axis,axis) = Repeater[axis];
    7275    }
     76    newM *= repMat;
     77    World::getInstance().setDomain(newM);
    7378
    74     World::getInstance().setDomain(cell_size);
    7579    molecule *newmol = NULL;
    7680    Vector ** vectors = NULL;
     
    99103                DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl);
    100104              x = y;
    101               x.MatrixMultiplication(M);
     105              x *= M;
    102106              newmol = World::getInstance().createMolecule();
    103107              molecules->insert(newmol);
     
    119123      }
    120124    }
    121     delete(M);
    122125    delete dialog;
    123126    return Action::success;
  • src/Actions/WorldAction/ScaleBoxAction.cpp

    r192f6e r4e10f5  
    1414#include "verbose.hpp"
    1515#include "World.hpp"
     16#include "Box.hpp"
     17#include "Matrix.hpp"
    1618
    1719#include <iostream>
     
    3739  Vector Scaler;
    3840  double x[NDIM];
    39   int j=0;
    4041
    41   dialog->queryVector(NAME, &Scaler, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription(NAME));
     42  dialog->queryVector(NAME, &Scaler, false, MapOfActions::getInstance().getDescription(NAME));
    4243
    4344  if(dialog->display()) {
     
    4950      (*AtomRunner)->x.ScaleAll(x);
    5051    }
    51     j = -1;
    52     double * const cell_size = World::getInstance().getDomain();
     52
     53    Matrix M = World::getInstance().getDomain().getM();
     54    Matrix scale;
     55
    5356    for (int i=0;i<NDIM;i++) {
    54       j += i+1;
    55       cell_size[j]*=x[i];
     57      scale.at(i,i) = x[i];
    5658    }
    57     World::getInstance().setDomain(cell_size);
     59    M *= scale;
     60    World::getInstance().setDomain(M);
    5861
    5962    delete dialog;
  • src/ConfigFileBuffer.cpp

    r192f6e r4e10f5  
    99#include "helpers.hpp"
    1010#include "lists.hpp"
     11#include "verbose.hpp"
    1112#include "log.hpp"
    1213#include "World.hpp"
  • src/ConfigFileBuffer.hpp

    r192f6e r4e10f5  
    1717#endif
    1818
    19 #include <iostream>
     19#include <iosfwd>
    2020
    2121/****************************************** forward declarations *****************************/
  • src/Exceptions/CustomException.cpp

    r192f6e r4e10f5  
    99
    1010#include "CustomException.hpp"
     11#include <iostream>
    1112
    1213using namespace std;
  • src/Exceptions/CustomException.hpp

    r192f6e r4e10f5  
    1010
    1111#include <exception>
    12 #include <iostream>
     12#include <iosfwd>
     13#include <string>
    1314
    1415/**
  • src/Helpers/Assert.hpp

    r192f6e r4e10f5  
    1111#include<sstream>
    1212#include<string>
    13 #include<iostream>
     13#include<iosfwd>
    1414#include<vector>
    1515#include<map>
  • src/Helpers/MemDebug.cpp

    r192f6e r4e10f5  
    66 */
    77
    8 #ifndef NDEBUG
    9 #ifndef NO_MEMDEBUG
     8// NDEBUG implies NO_MEMDEBUG
     9#ifdef NDEBUG
     10# ifndef NO_MEMDEBUG
     11#   define NO_MEMDEBUG
     12# endif
     13#endif
     14
     15// NO_MEMDEBUG and MEMDEBUG are mutually exclusive, but at least one must be set
     16#ifdef NO_MEMDEBUG
     17# ifdef MEMDEBUG
     18#   undef MEMDEBUG
     19# endif
     20#else
     21# ifndef MEMDEBUG
     22#   define MEMDEBUG
     23# endif
     24#endif
     25
     26#ifdef MEMDEBUG
    1027
    1128#include <iostream>
     
    489506}
    490507#endif
    491 #endif
  • src/Helpers/MemDebug.hpp

    r192f6e r4e10f5  
    2121 * your sourcefiles.
    2222 */
    23 #ifndef NDEBUG
    24 #ifndef NO_MEMDEBUG
    2523
    26 #ifndef MEMDEBUG
    27 #define MEMDEBUG
     24// Set all flags in a way that makes sense
     25
     26// NDEBUG implies NO_MEMDEBUG
     27#ifdef NDEBUG
     28# ifndef NO_MEMDEBUG
     29#   define NO_MEMDEBUG
     30# endif
    2831#endif
     32
     33// NO_MEMDEBUG and MEMDEBUG are mutually exclusive, but at least one must be set
     34#ifdef NO_MEMDEBUG
     35# ifdef MEMDEBUG
     36#   undef MEMDEBUG
     37# endif
     38#else
     39# ifndef MEMDEBUG
     40#   define MEMDEBUG
     41# endif
     42#endif
     43
     44#ifdef MEMDEBUG
    2945
    3046#include <new>
     
    8399#endif
    84100
    85 #endif
    86 #endif
    87 
    88 
    89 #ifdef NDEBUG
    90 #undef MEMDEBUG
    91 #endif
    92 
    93 #ifndef MEMDEBUG
     101#else
    94102// memory debugging was disabled
    95103
     
    104112
    105113#endif
     114
     115
    106116#endif /* MEMDEBUG_HPP_ */
  • src/Line.cpp

    r192f6e r4e10f5  
    215215}
    216216
     217std::vector<Vector> Line::getSphereIntersections() const{
     218  std::vector<Vector> res;
     219
     220  // line is kept in normalized form, so we can skip a lot of calculations
     221  double discriminant = 1-origin->NormSquared();
     222  // we might have 2, 1 or 0 solutions, depending on discriminant
     223  if(discriminant>=0){
     224    if(discriminant==0){
     225      res.push_back(*origin);
     226    }
     227    else{
     228      Vector helper = sqrt(discriminant)*(*direction);
     229      res.push_back(*origin+helper);
     230      res.push_back(*origin-helper);
     231    }
     232  }
     233  return res;
     234}
     235
    217236Line makeLineThrough(const Vector &x1, const Vector &x2){
    218237  if(x1==x2){
  • src/Line.hpp

    r192f6e r4e10f5  
    3838  Plane getOrthogonalPlane(const Vector &origin) const;
    3939
     40  std::vector<Vector> getSphereIntersections() const;
     41
    4042private:
    4143  std::auto_ptr<Vector> origin;
  • src/Makefile.am

    r192f6e r4e10f5  
    3838  vector.cpp
    3939                           
    40 LINALGHEADER = gslmatrix.hpp \
     40LINALGHEADER = \
     41  gslmatrix.hpp \
    4142  gslvector.hpp \
    4243  linearsystemofequations.hpp \
     
    7576  Actions/MethodAction.hpp \
    7677  Actions/Process.hpp
    77  
     78
     79EXCEPTIONSOURCE = Exceptions/CustomException.cpp \
     80                                  Exceptions/LinearDependenceException.cpp \
     81                                  Exceptions/MathException.cpp \
     82                                  Exceptions/NotInvertibleException.cpp \
     83                                  Exceptions/SkewException.cpp \
     84                                  Exceptions/ZeroVectorException.cpp
     85                                 
     86EXCEPTIONHEADER = Exceptions/CustomException.hpp \
     87                                  Exceptions/LinearDependenceException.hpp \
     88                                  Exceptions/MathException.hpp \
     89                                  Exceptions/NotInvertibleException.hpp \
     90                                  Exceptions/SkewException.hpp \
     91                                  Exceptions/ZeroVectorException.hpp
    7892
    7993PARSERSOURCE = \
     
    101115  Patterns/Observer.hpp \
    102116  Patterns/Singleton.hpp
     117 
     118SHAPESOURCE = \
     119  Shapes/BaseShapes.cpp \
     120  Shapes/Shape.cpp \
     121  Shapes/ShapeOps.cpp
     122SHAPEHEADER = \
     123  Shapes/BaseShapes.hpp \
     124  Shapes/Shape.hpp \
     125  Shapes/ShapeOps.hpp
     126 
    103127
    104128QTUIMOC_HEADER = UIElements/QT4/QTDialog.hpp \
     
    134158  Descriptors/MoleculeNameDescriptor.hpp \
    135159  Descriptors/MoleculePtrDescriptor.hpp
    136                                    
    137 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \
    138                                   Exceptions/LinearDependenceException.cpp \
    139                                   Exceptions/MathException.cpp \
    140                                   Exceptions/SkewException.cpp \
    141                                   Exceptions/ZeroVectorException.cpp
    142                                  
    143 EXCEPTIONHEADER = Exceptions/CustomException.hpp \
    144                                   Exceptions/LinearDependenceException.hpp \
    145                                   Exceptions/MathException.hpp \
    146                                   Exceptions/SkewException.hpp \
    147                                   Exceptions/ZeroVectorException.hpp
    148160                                 
    149161QTUISOURCE = ${QTUIMOC_TARGETS} \
     
    165177  ${ACTIONSSOURCE} \
    166178  ${ATOMSOURCE} \
     179  ${EXCEPTIONSOURCE} \
    167180  ${PATTERNSOURCE} \
    168181  ${PARSERSOURCE} \
     182  ${SHAPESOURCE} \
    169183  ${DESCRIPTORSOURCE} \
    170184  ${HELPERSOURCE} \
    171   ${EXCEPTIONSOURCE} \
    172185  bond.cpp \
    173186  bondgraph.cpp \
    174187  boundary.cpp \
     188  Box.cpp \
    175189  CommandLineParser.cpp \
    176190  config.cpp \
     
    188202  log.cpp \
    189203  logger.cpp \
     204  Matrix.cpp \
    190205  moleculelist.cpp \
    191206  molecule.cpp \
     
    212227  ${ACTIONSHEADER} \
    213228  ${ATOMHEADER} \
     229  ${EXCEPTIONHEADER} \
    214230  ${PARSERHEADER} \
    215231  ${PATTERNHEADER} \
     232  ${SHAPEHEADER} \
    216233  ${DESCRIPTORHEADER} \
    217   ${EXCEPTIONHEADER} \
    218234  bond.hpp \
    219235  bondgraph.hpp \
    220236  boundary.hpp \
     237  Box.hpp \
    221238  CommandLineParser.hpp \
    222239  config.hpp \
     
    236253  log.hpp \
    237254  logger.hpp \
     255  Matrix.hpp \
    238256  molecule.hpp \
    239257  molecule_template.hpp \
  • src/Parser/MpqcParser.hpp

    r192f6e r4e10f5  
    1111#include "FormatParser.hpp"
    1212
    13 #include <iostream>
     13#include <iosfwd>
    1414
    1515/**
  • src/Parser/PcpParser.cpp

    r192f6e r4e10f5  
    77
    88#include <iostream>
     9#include <iomanip>
    910
    1011#include "atom.hpp"
     
    2021#include "verbose.hpp"
    2122#include "World.hpp"
     23#include "Matrix.hpp"
     24#include "Box.hpp"
    2225
    2326/** Constructor of PcpParser.
     
    210213  // Unit cell and magnetic field
    211214  ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
    212   double * const cell_size = World::getInstance().getDomain();
     215  double *cell_size = new double[6];
    213216  cell_size[0] = BoxLength[0];
    214217  cell_size[1] = BoxLength[3];
     
    217220  cell_size[4] = BoxLength[7];
    218221  cell_size[5] = BoxLength[8];
     222  World::getInstance().setDomain(cell_size);
     223  delete[] cell_size;
    219224  //if (1) fprintf(stderr,"\n");
    220225
     
    327332void PcpParser::save(std::ostream* file)
    328333{
    329   const double * const cell_size = World::getInstance().getDomain();
     334  const Matrix &domain = World::getInstance().getDomain().getM();
    330335  class ThermoStatContainer *Thermostats = World::getInstance().getThermostats();
    331336  if (!file->fail()) {
     
    412417    *file << endl;
    413418    *file << "BoxLength\t\t\t# (Length of a unit cell)" << endl;
    414     *file << cell_size[0] << "\t" << endl;
    415     *file << cell_size[1] << "\t" << cell_size[2] << "\t" << endl;
    416     *file << cell_size[3] << "\t" << cell_size[4] << "\t" << cell_size[5] << "\t" << endl;
     419    *file << domain.at(0,0) << "\t" << endl;
     420    *file << domain.at(1,0) << "\t" << domain.at(1,1) << "\t" << endl;
     421    *file << domain.at(2,0) << "\t" << domain.at(2,1) << "\t" << domain.at(2,2) << "\t" << endl;
    417422    // FIXME
    418423    *file << endl;
  • src/Parser/PcpParser.hpp

    r192f6e r4e10f5  
    99#define PCPPARSER_HPP_
    1010
    11 #include <iostream>
     11#include <iosfwd>
    1212#include "Parser/FormatParser.hpp"
    1313
  • src/Patterns/Cacheable.hpp

    r192f6e r4e10f5  
    1212#include <boost/function.hpp>
    1313#include <boost/shared_ptr.hpp>
    14 #include <iostream>
    1514
    1615#include "Helpers/Assert.hpp"
  • src/Plane.hpp

    r192f6e r4e10f5  
    1111#include <memory>
    1212#include <vector>
    13 #include <iostream>
     13#include <iosfwd>
    1414#include "Space.hpp"
    1515#include "Exceptions/LinearDependenceException.hpp"
  • src/UIElements/CommandLineUI/CommandLineDialog.cpp

    r192f6e r4e10f5  
    2727#include "verbose.hpp"
    2828#include "World.hpp"
     29#include "Box.hpp"
    2930
    3031#include "atom.hpp"
     
    7778}
    7879
    79 void CommandLineDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check, string _description) {
    80   registerQuery(new VectorCommandLineQuery(title,target,cellSize,check, _description));
    81 }
    82 
    83 void CommandLineDialog::queryBox(const char* title, double ** const cellSize, string _description) {
     80void CommandLineDialog::queryVector(const char* title, Vector *target, bool check, string _description) {
     81  registerQuery(new VectorCommandLineQuery(title,target,check, _description));
     82}
     83
     84void CommandLineDialog::queryBox(const char* title, Box* cellSize, string _description) {
    8485  registerQuery(new BoxCommandLineQuery(title,cellSize,_description));
    8586}
     
    222223}
    223224
    224 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, const double *const _cellSize, bool _check, string _description) :
    225     Dialog::VectorQuery(title,_target,_cellSize,_check, _description)
     225CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, bool _check, string _description) :
     226    Dialog::VectorQuery(title,_target,_check, _description)
    226227{}
    227228
     
    244245
    245246
    246 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, double ** const _cellSize, string _description) :
     247CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, Box* _cellSize, string _description) :
    247248    Dialog::BoxQuery(title,_cellSize, _description)
    248249{}
  • src/UIElements/CommandLineUI/CommandLineDialog.hpp

    r192f6e r4e10f5  
    3535  virtual void queryAtom(const char*,atom**, std::string = "");
    3636  virtual void queryMolecule(const char*,molecule**,std::string = "");
    37   virtual void queryVector(const char*,Vector *,const double * const,bool, std::string = "");
    38   virtual void queryBox(const char*,double ** const, std::string = "");
     37  virtual void queryVector(const char*,Vector *,bool, std::string = "");
     38  virtual void queryBox(const char*,Box *, std::string = "");
    3939  virtual void queryElement(const char*, std::vector<element *> *, std::string = "");
    4040
     
    9999  class VectorCommandLineQuery : public Dialog::VectorQuery {
    100100  public:
    101     VectorCommandLineQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check, std::string _description = "");
     101    VectorCommandLineQuery(std::string title,Vector *_target,bool _check, std::string _description = "");
    102102    virtual ~VectorCommandLineQuery();
    103103    virtual bool handle();
     
    106106  class BoxCommandLineQuery : public Dialog::BoxQuery {
    107107  public:
    108     BoxCommandLineQuery(std::string title,double ** const _cellSize, std::string _description = "");
     108    BoxCommandLineQuery(std::string title,Box* _cellSize, std::string _description = "");
    109109    virtual ~BoxCommandLineQuery();
    110110    virtual bool handle();
  • src/UIElements/Dialog.cpp

    r192f6e r4e10f5  
    1010#include "Dialog.hpp"
    1111
     12#include "verbose.hpp"
    1213#include "atom.hpp"
    1314#include "element.hpp"
    1415#include "molecule.hpp"
    1516#include "vector.hpp"
     17#include "Matrix.hpp"
     18#include "Box.hpp"
    1619
    1720using namespace std;
     
    185188// Vector Queries
    186189
    187 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check, std::string _description) :
     190Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,bool _check, std::string _description) :
    188191  Query(title, _description),
    189   cellSize(_cellSize),
    190192  check(_check),
    191193  target(_target)
     
    205207// Box Queries
    206208
    207 Dialog::BoxQuery::BoxQuery(std::string title, double ** const _cellSize, std::string _description) :
     209Dialog::BoxQuery::BoxQuery(std::string title, Box* _cellSize, std::string _description) :
    208210  Query(title, _description),
    209211  target(_cellSize)
     
    218220
    219221void Dialog::BoxQuery::setResult() {
    220   for (int i=0;i<6;i++) {
    221     (*target)[i] = tmp[i];
    222   }
     222  (*target)= ReturnFullMatrixforSymmetric(tmp);
    223223}
    224224
  • src/UIElements/Dialog.hpp

    r192f6e r4e10f5  
    1414
    1515class atom;
     16class Box;
    1617class element;
    1718class molecule;
     
    4344  virtual void queryAtom(const char*,atom**,std::string = "")=0;
    4445  virtual void queryMolecule(const char*,molecule**, std::string = "")=0;
    45   virtual void queryVector(const char*,Vector *,const double *const,bool, std::string = "")=0;
    46   virtual void queryBox(const char*,double ** const, std::string = "")=0;
     46  virtual void queryVector(const char*,Vector *,bool, std::string = "")=0;
     47  virtual void queryBox(const char*,Box*, std::string = "")=0;
    4748  virtual void queryElement(const char*, std::vector<element *> *, std::string = "")=0;
    4849
     
    176177  class VectorQuery : public Query {
    177178  public:
    178       VectorQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check, std::string _description = "");
     179      VectorQuery(std::string title,Vector *_target,bool _check, std::string _description = "");
    179180      virtual ~VectorQuery();
    180181      virtual bool handle()=0;
     
    182183    protected:
    183184      Vector *tmp;
    184       const double *const cellSize;
    185185      bool check;
    186186    private:
     
    190190  class BoxQuery : public Query {
    191191  public:
    192       BoxQuery(std::string title,double ** const _cellSize, std::string _description = "");
     192      BoxQuery(std::string title,Box *_cellSize, std::string _description = "");
    193193      virtual ~BoxQuery();
    194194      virtual bool handle()=0;
    195195      virtual void setResult();
    196196    protected:
    197       double *tmp;
     197      double* tmp;
    198198    private:
    199       double **target;
     199      Box* target;
    200200  };
    201201
  • src/UIElements/QT4/QTDialog.cpp

    r192f6e r4e10f5  
    2929#include "molecule.hpp"
    3030#include "Descriptors/MoleculeIdDescriptor.hpp"
     31#include "Matrix.hpp"
     32#include "Box.hpp"
    3133
    3234
     
    9395}
    9496
    95 void QTDialog::queryBox(char const*, double**, string){
     97void QTDialog::queryBox(char const*, Box*, string){
    9698  // TODO
    9799  ASSERT(false, "Not implemented yet");
     
    123125}
    124126
    125 void QTDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check,string) {
    126   registerQuery(new VectorQTQuery(title,target,cellSize,check,inputLayout,this));
     127void QTDialog::queryVector(const char* title, Vector *target, bool check,string) {
     128  registerQuery(new VectorQTQuery(title,target,check,inputLayout,this));
    127129}
    128130
     
    291293}
    292294
    293 QTDialog::VectorQTQuery::VectorQTQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check,QBoxLayout *_parent,QTDialog *_dialog) :
    294     Dialog::VectorQuery(title,_target,_cellSize,_check),
    295     parent(_parent)
    296 {
    297   // About the j: I don't know why it was done this way, but it was used this way in Vector::AskPosition, so I reused it
    298   int j = -1;
     295QTDialog::VectorQTQuery::VectorQTQuery(std::string title, Vector *_target, bool _check,QBoxLayout *_parent,QTDialog *_dialog) :
     296    Dialog::VectorQuery(title,_target,_check),
     297    parent(_parent)
     298{
     299  const Matrix& M = World::getInstance().getDomain().getM();
    299300  const char *coords[3] = {"x:","y:","z:"};
    300301  mainLayout= new QHBoxLayout();
     
    304305  mainLayout->addLayout(subLayout);
    305306  for(int i=0; i<3; i++) {
    306     j+=i+1;
    307307    coordLayout[i] = new QHBoxLayout();
    308308    subLayout->addLayout(coordLayout[i]);
     
    310310    coordLayout[i]->addWidget(coordLabel[i]);
    311311    coordInput[i] = new QDoubleSpinBox();
    312     coordInput[i]->setRange(0,cellSize[j]);
     312    coordInput[i]->setRange(0,M.at(i,i));
    313313    coordInput[i]->setDecimals(3);
    314314    coordLayout[i]->addWidget(coordInput[i]);
  • src/UIElements/QT4/QTDialog.hpp

    r192f6e r4e10f5  
    4343  virtual void queryAtom(const char*,atom**,std::string = "");
    4444  virtual void queryMolecule(const char*,molecule**,std::string = "");
    45   virtual void queryVector(const char*,Vector *,const double *const,bool,std::string = "");
    46   virtual void queryBox(const char*,double ** const, std::string = "");
     45  virtual void queryVector(const char*,Vector *,bool,std::string = "");
     46  virtual void queryBox(const char*,Box*, std::string = "");
    4747  virtual void queryElement(const char*,std::vector<element *> *_target,std::string = "");
    4848
     
    124124    class VectorQTQuery : public Dialog::VectorQuery {
    125125    public:
    126       VectorQTQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check,QBoxLayout *,QTDialog *);
     126      VectorQTQuery(std::string title,Vector *_target,bool _check,QBoxLayout *,QTDialog *);
    127127      virtual ~VectorQTQuery();
    128128      virtual bool handle();
  • src/UIElements/QT4/QTMainWindow.cpp

    r192f6e r4e10f5  
    2121#include "atom.hpp"
    2222#include "molecule.hpp"
     23#include "verbose.hpp"
    2324#include "Actions/Action.hpp"
    2425#include "Actions/ActionRegistry.hpp"
  • src/UIElements/TextUI/TextDialog.cpp

    r192f6e r4e10f5  
    2525#include "molecule.hpp"
    2626#include "vector.hpp"
     27#include "Matrix.hpp"
     28#include "Box.hpp"
    2729
    2830using namespace std;
     
    7072}
    7173
    72 void TextDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check, string description) {
    73   registerQuery(new VectorTextQuery(title,target,cellSize,check,description));
    74 }
    75 
    76 void TextDialog::queryBox(const char* title,double ** const cellSize, string description) {
     74void TextDialog::queryVector(const char* title, Vector *target, bool check, string description) {
     75  registerQuery(new VectorTextQuery(title,target,check,description));
     76}
     77
     78void TextDialog::queryBox(const char* title,Box* cellSize, string description) {
    7779  registerQuery(new BoxTextQuery(title,cellSize,description));
    7880}
     
    270272}
    271273
    272 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check, std::string _description) :
    273     Dialog::VectorQuery(title,_target,_cellSize,_check,_description)
     274TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, bool _check, std::string _description) :
     275    Dialog::VectorQuery(title,_target,_check,_description)
    274276{}
    275277
     
    280282  Log() << Verbose(0) << getTitle();
    281283
     284  const Matrix &M = World::getInstance().getDomain().getM();
    282285  char coords[3] = {'x','y','z'};
    283   int j = -1;
    284286  for (int i=0;i<3;i++) {
    285     j += i+1;
    286287    do {
    287       Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j] << "]: ";
     288      Log() << Verbose(0) << coords[i] << "[0.." << M.at(i,i) << "]: ";
    288289      cin >> (*tmp)[i];
    289     } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= cellSize[j])) && (check));
     290    } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= M.at(i,i))) && (check));
    290291  }
    291292  return true;
    292293}
    293294
    294 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const _cellSize, std::string _description) :
     295TextDialog::BoxTextQuery::BoxTextQuery(std::string title, Box* _cellSize, std::string _description) :
    295296    Dialog::BoxQuery(title,_cellSize,_description)
    296297{}
  • src/UIElements/TextUI/TextDialog.hpp

    r192f6e r4e10f5  
    3232  virtual void queryAtom(const char*,atom**,std::string = "");
    3333  virtual void queryMolecule(const char*,molecule**,std::string = "");
    34   virtual void queryVector(const char*,Vector *,const double * const,bool, std::string = "");
    35   virtual void queryBox(const char*,double ** const, std::string = "");
     34  virtual void queryVector(const char*,Vector *,bool, std::string = "");
     35  virtual void queryBox(const char*,Box*, std::string = "");
    3636  virtual void queryElement(const char*, std::vector<element *> *, std::string = "");
    3737
     
    9696  class VectorTextQuery : public Dialog::VectorQuery {
    9797  public:
    98     VectorTextQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check, std::string _description = NULL);
     98    VectorTextQuery(std::string title,Vector *_target,bool _check, std::string _description = NULL);
    9999    virtual ~VectorTextQuery();
    100100    virtual bool handle();
     
    103103  class BoxTextQuery : public Dialog::BoxQuery {
    104104  public:
    105     BoxTextQuery(std::string title,double ** const _cellSize, std::string _description = NULL);
     105    BoxTextQuery(std::string title,Box* _cellSize, std::string _description = NULL);
    106106    virtual ~BoxTextQuery();
    107107    virtual bool handle();
  • src/UIElements/TextUI/TextWindow.hpp

    r192f6e r4e10f5  
    1111#include "MainWindow.hpp"
    1212
     13#include <string>
    1314#include <set>
    1415
  • src/UIElements/Views/StreamStringView.hpp

    r192f6e r4e10f5  
    1010
    1111#include <boost/function.hpp>
    12 #include <iostream>
     12#include <iosfwd>
    1313
    1414#include "Views/StringView.hpp"
  • src/VectorSet.hpp

    r192f6e r4e10f5  
    1212#include <functional>
    1313#include <algorithm>
     14#include <limits>
    1415
    1516/**
     
    1920 */
    2021
    21 class Vector;
     22#include "vector.hpp"
     23#include <list>
    2224
    2325// this tests, whether we actually have a Vector
     
    4850  void translate(const Vector &translater){
    4951    // this is needed to allow template lookup
    50     transform(this->begin(),this->end(),this->begin(),bind1st(plus<Vector>(),translater));
     52    transform(this->begin(),this->end(),this->begin(),std::bind1st(std::plus<Vector>(),translater));
     53  }
     54
     55  double minDistSquared(const Vector &point){
     56    if(!this->size())
     57      return std::numeric_limits<double>::infinity();
     58    std::list<double> helper;
     59    helper.resize(this->size());
     60    transform(this->begin(),this->end(),
     61              helper.begin(),
     62              std::bind2nd(std::mem_fun_ref(&Vector::DistanceSquared),point));
     63    return *min_element(helper.begin(),helper.end());
    5164  }
    5265};
    5366
     67// allows simpler definition of VectorSets
     68#define VECTORSET(container_type) VectorSet<container_type<Vector> >
     69
    5470#endif /* VECTORSET_HPP_ */
  • src/World.cpp

    r192f6e r4e10f5  
    2222#include "Actions/ManipulateAtomsProcess.hpp"
    2323#include "Helpers/Assert.hpp"
     24#include "Box.hpp"
     25#include "Matrix.hpp"
    2426
    2527#include "Patterns/Singleton_impl.hpp"
     
    7476// system
    7577
    76 double * World::getDomain() {
    77   return cell_size;
     78Box& World::getDomain() {
     79  return *cell_size;
     80}
     81
     82void World::setDomain(const Matrix &mat){
     83  *cell_size = mat;
    7884}
    7985
    8086void World::setDomain(double * matrix)
    8187{
    82   OBSERVE;
    83   cell_size[0] = matrix[0];
    84   cell_size[1] = matrix[1];
    85   cell_size[2] = matrix[2];
    86   cell_size[3] = matrix[3];
    87   cell_size[4] = matrix[4];
    88   cell_size[5] = matrix[5];
     88  Matrix M = ReturnFullMatrixforSymmetric(matrix);
     89  cell_size->setM(M);
    8990}
    9091
     
    139140  molecules.erase(id);
    140141}
    141 
    142 double *World::cell_size = NULL;
    143142
    144143atom *World::createAtom(){
     
    303302    molecules_deprecated(new MoleculeListClass(this))
    304303{
    305   cell_size = new double[6];
    306   cell_size[0] = 20.;
    307   cell_size[1] = 0.;
    308   cell_size[2] = 20.;
    309   cell_size[3] = 0.;
    310   cell_size[4] = 0.;
    311   cell_size[5] = 20.;
     304  cell_size = new Box;
     305  Matrix domain;
     306  domain.at(0,0) = 20;
     307  domain.at(1,1) = 20;
     308  domain.at(2,2) = 20;
     309  cell_size->setM(domain);
    312310  defaultName = "none";
    313311  molecules_deprecated->signOn(this);
     
    317315{
    318316  molecules_deprecated->signOff(this);
    319   delete[] cell_size;
     317  delete cell_size;
    320318  delete molecules_deprecated;
    321319  delete periode;
  • src/World.hpp

    r192f6e r4e10f5  
    3434class AtomDescriptor_impl;
    3535template<typename T> class AtomsCalculation;
     36class Box;
    3637class config;
    3738class ManipulateAtomsProcess;
     39class Matrix;
    3840class molecule;
    3941class MoleculeDescriptor;
     
    125127   * get the domain size as a symmetric matrix (6 components)
    126128   */
    127   double * getDomain();
     129  Box& getDomain();
     130
     131  /**
     132   * Set the domain size from a matrix object
     133   *
     134   * Matrix needs to be symmetric
     135   */
     136  void setDomain(const Matrix &mat);
    128137
    129138  /**
     
    257266  periodentafel *periode;
    258267  config *configuration;
    259   static double *cell_size;
     268  Box *cell_size;
    260269  std::string defaultName;
    261270  class ThermoStatContainer *Thermostats;
  • src/analysis_bonds.cpp

    r192f6e r4e10f5  
    1313#include "element.hpp"
    1414#include "info.hpp"
     15#include "verbose.hpp"
    1516#include "log.hpp"
    1617#include "molecule.hpp"
  • src/analysis_correlation.cpp

    r192f6e r4e10f5  
    99
    1010#include <iostream>
     11#include <iomanip>
    1112
    1213#include "analysis_correlation.hpp"
     
    1920#include "triangleintersectionlist.hpp"
    2021#include "vector.hpp"
     22#include "Matrix.hpp"
    2123#include "verbose.hpp"
    2224#include "World.hpp"
     25#include "Box.hpp"
    2326
    2427
     
    3437  PairCorrelationMap *outmap = NULL;
    3538  double distance = 0.;
    36   double *domain = World::getInstance().getDomain();
     39  Box &domain = World::getInstance().getDomain();
    3740
    3841  if (molecules->ListOfMolecules.empty()) {
     
    7578                for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner)
    7679                  if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) {
    77                     distance = (*iter)->node->PeriodicDistance(*(*runner)->node,  domain);
     80                    distance = domain.periodicDistance(*(*iter)->node,*(*runner)->node);
    7881                    //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl;
    7982                    outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> ((*iter), (*runner)) ) );
     
    135138  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++){
    136139    if ((*MolWalker)->ActiveFlag) {
    137       double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());
    138       double * FullInverseMatrix = InverseMatrix(FullMatrix);
     140      Matrix FullMatrix = World::getInstance().getDomain().getM();
     141      Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv();
    139142      DoeLog(2) && (eLog()<< Verbose(2) << "Current molecule is " << *MolWalker << "." << endl);
    140143      eLog() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl;
    141144      for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) {
    142145        DoLog(3) && (Log() << Verbose(3) << "Current atom is " << **iter << "." << endl);
    143         periodicX = *(*iter)->node;
    144         periodicX.MatrixMultiplication(FullInverseMatrix);  // x now in [0,1)^3
     146        periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3
    145147        // go through every range in xyz and get distance
    146148        for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++)
    147149          for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++)
    148150            for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) {
    149               checkX = Vector(n[0], n[1], n[2]) + periodicX;
    150               checkX.MatrixMultiplication(FullMatrix);
     151              checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX);
    151152              for (MoleculeList::const_iterator MolOtherWalker = MolWalker; MolOtherWalker != molecules->ListOfMolecules.end(); MolOtherWalker++){
    152153                if ((*MolOtherWalker)->ActiveFlag) {
     
    157158                      for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner)
    158159                        if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) {
    159                           periodicOtherX = *(*runner)->node;
    160                           periodicOtherX.MatrixMultiplication(FullInverseMatrix);  // x now in [0,1)^3
     160                          periodicOtherX = FullInverseMatrix * (*(*runner)->node); // x now in [0,1)^3
    161161                          // go through every range in xyz and get distance
    162162                          for (Othern[0]=-ranges[0]; Othern[0] <= ranges[0]; Othern[0]++)
    163163                            for (Othern[1]=-ranges[1]; Othern[1] <= ranges[1]; Othern[1]++)
    164164                              for (Othern[2]=-ranges[2]; Othern[2] <= ranges[2]; Othern[2]++) {
    165                                 checkOtherX = Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX;
    166                                 checkOtherX.MatrixMultiplication(FullMatrix);
     165                                checkOtherX = FullMatrix * (Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX);
    167166                                distance = checkX.distance(checkOtherX);
    168167                                //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl;
     
    176175            }
    177176      }
    178       delete[](FullMatrix);
    179       delete[](FullInverseMatrix);
    180177    }
    181178  }
     
    195192  CorrelationToPointMap *outmap = NULL;
    196193  double distance = 0.;
    197   double *cell_size = World::getInstance().getDomain();
     194  Box &domain = World::getInstance().getDomain();
    198195
    199196  if (molecules->ListOfMolecules.empty()) {
     
    211208        for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type)
    212209          if ((*type == NULL) || ((*iter)->type == *type)) {
    213             distance = (*iter)->node->PeriodicDistance(*point, cell_size);
     210            distance = domain.periodicDistance(*(*iter)->node,*point);
    214211            DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl);
    215212            outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> ((*iter), point) ) );
     
    246243  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
    247244    if ((*MolWalker)->ActiveFlag) {
    248       double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());
    249       double * FullInverseMatrix = InverseMatrix(FullMatrix);
     245      Matrix FullMatrix = World::getInstance().getDomain().getM();
     246      Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv();
    250247      DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl);
    251248      for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) {
     
    253250        for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type)
    254251          if ((*type == NULL) || ((*iter)->type == *type)) {
    255             periodicX = *(*iter)->node;
    256             periodicX.MatrixMultiplication(FullInverseMatrix);  // x now in [0,1)^3
     252            periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3
    257253            // go through every range in xyz and get distance
    258254            for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++)
    259255              for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++)
    260256                for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) {
    261                   checkX = Vector(n[0], n[1], n[2]) + periodicX;
    262                   checkX.MatrixMultiplication(FullMatrix);
     257                  checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX);
    263258                  distance = checkX.distance(*point);
    264259                  DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl);
     
    267262          }
    268263      }
    269       delete[](FullMatrix);
    270       delete[](FullInverseMatrix);
    271264    }
    272265
     
    352345  for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++)
    353346    if ((*MolWalker)->ActiveFlag) {
    354       double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());
    355       double * FullInverseMatrix = InverseMatrix(FullMatrix);
     347      Matrix FullMatrix = World::getInstance().getDomain().getM();
     348      Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv();
    356349      DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl);
    357350      for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) {
     
    359352        for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type)
    360353          if ((*type == NULL) || ((*iter)->type == *type)) {
    361             periodicX = *(*iter)->node;
    362             periodicX.MatrixMultiplication(FullInverseMatrix);  // x now in [0,1)^3
     354            periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3
    363355            // go through every range in xyz and get distance
    364356            ShortestDistance = -1.;
     
    366358              for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++)
    367359                for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) {
    368                   checkX = Vector(n[0], n[1], n[2]) + periodicX;
    369                   checkX.MatrixMultiplication(FullMatrix);
     360                  checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX);
    370361                  TriangleIntersectionList Intersections(&checkX,Surface,LC);
    371362                  distance = Intersections.GetSmallestDistance();
     
    381372          }
    382373      }
    383       delete[](FullMatrix);
    384       delete[](FullInverseMatrix);
    385374    }
    386375
  • src/analysis_correlation.hpp

    r192f6e r4e10f5  
    2626
    2727#include "atom.hpp"
     28#include "verbose.hpp"
    2829
    2930/****************************************** forward declarations *****************************/
  • src/analyzer.cpp

    r192f6e r4e10f5  
    1414#include "datacreator.hpp"
    1515#include "helpers.hpp"
    16 #include "memoryallocator.hpp"
    1716#include "parser.hpp"
    1817#include "periodentafel.hpp"
     18#include "verbose.hpp"
    1919
    2020// include config.h
  • src/atom.cpp

    r192f6e r4e10f5  
    1212#include "element.hpp"
    1313#include "lists.hpp"
    14 #include "memoryallocator.hpp"
    1514#include "parser.hpp"
    1615#include "vector.hpp"
    1716#include "World.hpp"
    1817#include "molecule.hpp"
     18#include "Shapes/Shape.hpp"
     19
     20#include <iomanip>
    1921
    2022/************************************* Functions for class atom *************************************/
     
    112114 * \return true - is inside, false - is not
    113115 */
    114 bool atom::IsInParallelepiped(const Vector offset, const double *parallelepiped) const
    115 {
    116   return (node->IsInParallelepiped(offset, parallelepiped));
     116bool atom::IsInShape(const Shape& shape) const
     117{
     118  return shape.isInside(*node);
    117119};
    118120
  • src/atom.hpp

    r192f6e r4e10f5  
    1818#endif
    1919
    20 #include <iostream>
     20#include <iosfwd>
    2121#include <list>
    2222#include <vector>
     
    3535class World;
    3636class molecule;
     37class Shape;
    3738
    3839/********************************************** declarations *******************************/
     
    6667  double DistanceToVector(const Vector &origin) const;
    6768  double DistanceSquaredToVector(const Vector &origin) const;
    68   bool IsInParallelepiped(const Vector offset, const double *parallelepiped) const;
     69  bool IsInShape(const Shape&) const;
    6970
    7071  // getter and setter
  • src/atom_graphnodeinfo.cpp

    r192f6e r4e10f5  
    99
    1010#include "atom_graphnodeinfo.hpp"
    11 #include "memoryallocator.hpp"
    1211
    1312/** Constructor of class GraphNodeInfo.
    1413 */
    15 GraphNodeInfo::GraphNodeInfo() : GraphNr(-1), ComponentNr(NULL), LowpointNr(-1), SeparationVertex(false), IsCyclic(false), Ancestor(NULL) {};
     14GraphNodeInfo::GraphNodeInfo() : GraphNr(-1), ComponentNr(0), LowpointNr(-1), SeparationVertex(false), IsCyclic(false), Ancestor(0) {};
    1615
    1716/** Destructor of class GraphNodeInfo.
  • src/atom_particleinfo.cpp

    r192f6e r4e10f5  
    99
    1010#include "atom_particleinfo.hpp"
    11 #include "memoryallocator.hpp"
     11
     12#include <iostream>
    1213
    1314/** Constructor of ParticleInfo.
  • src/atom_particleinfo.hpp

    r192f6e r4e10f5  
    1818#endif
    1919
    20 #include <iostream>
     20#include <iosfwd>
     21#include <string>
    2122
    2223/****************************************** forward declarations *****************************/
  • src/atom_trajectoryparticle.hpp

    r192f6e r4e10f5  
    2020#include <fstream>
    2121
     22#include <gsl/gsl_inline.h>
    2223#include <gsl/gsl_randist.h>
    2324
  • src/bond.cpp

    r192f6e r4e10f5  
    77#include "Helpers/MemDebug.hpp"
    88
     9#include "verbose.hpp"
    910#include "atom.hpp"
    1011#include "bond.hpp"
  • src/bondgraph.cpp

    r192f6e r4e10f5  
    1515#include "element.hpp"
    1616#include "info.hpp"
     17#include "verbose.hpp"
    1718#include "log.hpp"
    1819#include "molecule.hpp"
  • src/bondgraph.hpp

    r192f6e r4e10f5  
    1818#endif
    1919
    20 #include <iostream>
     20#include <iosfwd>
    2121
    2222/*********************************************** defines ***********************************/
  • src/boundary.cpp

    r192f6e r4e10f5  
    1515#include "info.hpp"
    1616#include "linkedcell.hpp"
     17#include "verbose.hpp"
    1718#include "log.hpp"
    18 #include "memoryallocator.hpp"
    1919#include "molecule.hpp"
    2020#include "tesselation.hpp"
     
    2222#include "World.hpp"
    2323#include "Plane.hpp"
     24#include "Matrix.hpp"
     25#include "Box.hpp"
     26
     27#include <iostream>
     28#include <iomanip>
    2429
    2530#include<gsl/gsl_poly.h>
     
    769774  int N[NDIM];
    770775  int n[NDIM];
    771   double *M =  ReturnFullMatrixforSymmetric(World::getInstance().getDomain());
    772   double Rotations[NDIM*NDIM];
    773   double *MInverse = InverseMatrix(M);
     776  const Matrix &M = World::getInstance().getDomain().getM();
     777  Matrix Rotations;
     778  const Matrix &MInverse = World::getInstance().getDomain().getMinv();
    774779  Vector AtomTranslations;
    775780  Vector FillerTranslations;
     
    804809
    805810  // calculate filler grid in [0,1]^3
    806   FillerDistance = Vector(distance[0], distance[1], distance[2]);
    807   FillerDistance.InverseMatrixMultiplication(M);
     811  FillerDistance = MInverse * Vector(distance[0], distance[1], distance[2]);
    808812  for(int i=0;i<NDIM;i++)
    809813    N[i] = (int) ceil(1./FillerDistance[i]);
     
    818822      for (n[2] = 0; n[2] < N[2]; n[2]++) {
    819823        // calculate position of current grid vector in untransformed box
    820         CurrentPosition = Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]);
    821         CurrentPosition.MatrixMultiplication(M);
     824        CurrentPosition = M * Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]);
    822825        // create molecule random translation vector ...
    823826        for (int i=0;i<NDIM;i++)
     
    840843            }
    841844
    842             Rotations[0] =   cos(phi[0])            *cos(phi[2]) + (sin(phi[0])*sin(phi[1])*sin(phi[2]));
    843             Rotations[3] =   sin(phi[0])            *cos(phi[2]) - (cos(phi[0])*sin(phi[1])*sin(phi[2]));
    844             Rotations[6] =               cos(phi[1])*sin(phi[2])                                     ;
    845             Rotations[1] = - sin(phi[0])*cos(phi[1])                                                ;
    846             Rotations[4] =   cos(phi[0])*cos(phi[1])                                                ;
    847             Rotations[7] =               sin(phi[1])                                                ;
    848             Rotations[3] = - cos(phi[0])            *sin(phi[2]) + (sin(phi[0])*sin(phi[1])*cos(phi[2]));
    849             Rotations[5] = - sin(phi[0])            *sin(phi[2]) - (cos(phi[0])*sin(phi[1])*cos(phi[2]));
    850             Rotations[8] =               cos(phi[1])*cos(phi[2])                                     ;
     845            Rotations.set(0,0,  cos(phi[0])            *cos(phi[2]) + (sin(phi[0])*sin(phi[1])*sin(phi[2])));
     846            Rotations.set(0,1,  sin(phi[0])            *cos(phi[2]) - (cos(phi[0])*sin(phi[1])*sin(phi[2])));
     847            Rotations.set(0,2,              cos(phi[1])*sin(phi[2])                                        );
     848            Rotations.set(1,0, -sin(phi[0])*cos(phi[1])                                                    );
     849            Rotations.set(1,1,  cos(phi[0])*cos(phi[1])                                                    );
     850            Rotations.set(1,2,              sin(phi[1])                                                    );
     851            Rotations.set(2,0, -cos(phi[0])            *sin(phi[2]) + (sin(phi[0])*sin(phi[1])*cos(phi[2])));
     852            Rotations.set(2,1, -sin(phi[0])            *sin(phi[2]) - (cos(phi[0])*sin(phi[1])*cos(phi[2])));
     853            Rotations.set(2,2,              cos(phi[1])*cos(phi[2])                                        );
    851854          }
    852855
     
    854857          Inserter = (*iter)->x;
    855858          if (DoRandomRotation)
    856             Inserter.MatrixMultiplication(Rotations);
     859            Inserter *= Rotations;
    857860          Inserter += AtomTranslations + FillerTranslations + CurrentPosition;
    858861
    859862          // check whether inserter is inside box
    860           Inserter.MatrixMultiplication(MInverse);
     863          Inserter *= MInverse;
    861864          FillIt = true;
    862865          for (int i=0;i<NDIM;i++)
    863866            FillIt = FillIt && (Inserter[i] >= -MYEPSILON) && ((Inserter[i]-1.) <= MYEPSILON);
    864           Inserter.MatrixMultiplication(M);
     867          Inserter *= M;
    865868
    866869          // Check whether point is in- or outside
     
    901904    delete TesselStruct[(*ListRunner)];
    902905  }
    903   delete[](M);
    904   delete[](MInverse);
    905906
    906907  return Filling;
  • src/boundary.hpp

    r192f6e r4e10f5  
    1212
    1313#include <fstream>
    14 #include <iostream>
     14#include <iosfwd>
    1515
    1616// STL headers
  • src/builder.cpp

    r192f6e r4e10f5  
    6060#include "config.hpp"
    6161#include "log.hpp"
    62 #include "memoryusageobserver.hpp"
    6362#include "molecule.hpp"
    6463#include "periodentafel.hpp"
  • src/config.cpp

    r192f6e r4e10f5  
    1919#include "info.hpp"
    2020#include "lists.hpp"
     21#include "verbose.hpp"
    2122#include "log.hpp"
    2223#include "molecule.hpp"
    23 #include "memoryallocator.hpp"
    2424#include "molecule.hpp"
    2525#include "periodentafel.hpp"
    2626#include "ThermoStatContainer.hpp"
    2727#include "World.hpp"
     28#include "Matrix.hpp"
     29#include "Box.hpp"
    2830
    2931/************************************* Functions for class config ***************************/
     
    679681  // Unit cell and magnetic field
    680682  ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
    681   double * const cell_size = World::getInstance().getDomain();
     683  double * cell_size = new double[6];
    682684  cell_size[0] = BoxLength[0];
    683685  cell_size[1] = BoxLength[3];
     
    686688  cell_size[4] = BoxLength[7];
    687689  cell_size[5] = BoxLength[8];
     690  World::getInstance().setDomain(cell_size);
     691  delete cell_size;
    688692  //if (1) fprintf(stderr,"\n");
    689693
     
    883887
    884888  ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */
    885   double * const cell_size = World::getInstance().getDomain();
     889  double * cell_size = new double[6];
    886890  cell_size[0] = BoxLength[0];
    887891  cell_size[1] = BoxLength[3];
     
    890894  cell_size[4] = BoxLength[7];
    891895  cell_size[5] = BoxLength[8];
     896  World::getInstance().setDomain(cell_size);
     897  delete[] cell_size;
    892898  if (1) fprintf(stderr,"\n");
    893899  config::DoPerturbation = 0;
     
    10271033  // bring MaxTypes up to date
    10281034  mol->CountElements();
    1029   const double * const cell_size = World::getInstance().getDomain();
     1035  const Matrix &domain = World::getInstance().getDomain().getM();
    10301036  ofstream * const output = new ofstream(filename, ios::out);
    10311037  if (output != NULL) {
     
    10981104    *output << endl;
    10991105    *output << "BoxLength\t\t\t# (Length of a unit cell)" << endl;
    1100     *output << cell_size[0] << "\t" << endl;
    1101     *output << cell_size[1] << "\t" << cell_size[2] << "\t" << endl;
    1102     *output << cell_size[3] << "\t" << cell_size[4] << "\t" << cell_size[5] << "\t" << endl;
     1106    *output << domain.at(0,0) << "\t" << endl;
     1107    *output << domain.at(1,0) << "\t" << domain.at(1,1) << "\t" << endl;
     1108    *output << domain.at(2,0) << "\t" << domain.at(2,1) << "\t" << domain.at(2,2) << "\t" << endl;
    11031109    // FIXME
    11041110    *output << endl;
  • src/datacreator.cpp

    r192f6e r4e10f5  
    1212#include "helpers.hpp"
    1313#include "parser.hpp"
     14#include "verbose.hpp"
     15
     16#include <iomanip>
    1417
    1518//=========================== FUNCTIONS============================
  • src/datacreator.hpp

    r192f6e r4e10f5  
    1010using namespace std;
    1111
    12 #include <iostream>
     12#include <iosfwd>
    1313
    1414/****************************************** forward declarations *****************************/
  • src/element.hpp

    r192f6e r4e10f5  
    1616#endif
    1717
    18 #include <iostream>
     18#include <iosfwd>
    1919#include <string>
    2020
  • src/ellipsoid.cpp

    r192f6e r4e10f5  
    2121#include "tesselation.hpp"
    2222#include "vector.hpp"
     23#include "Matrix.hpp"
    2324#include "verbose.hpp"
    2425
     
    3435  Vector helper, RefPoint;
    3536  double distance = -1.;
    36   double Matrix[NDIM*NDIM];
     37  Matrix Matrix;
    3738  double InverseLength[3];
    3839  double psi,theta,phi; // euler angles in ZX'Z'' convention
     
    5152  theta = EllipsoidAngle[1];
    5253  phi = EllipsoidAngle[2];
    53   Matrix[0] = cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi);
    54   Matrix[1] = -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi);
    55   Matrix[2] = sin(psi)*sin(theta);
    56   Matrix[3] = sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi);
    57   Matrix[4] = cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi);
    58   Matrix[5] = -cos(psi)*sin(theta);
    59   Matrix[6] = sin(theta)*sin(phi);
    60   Matrix[7] = sin(theta)*cos(phi);
    61   Matrix[8] = cos(theta);
    62   helper.MatrixMultiplication(Matrix);
     54  Matrix.set(0,0, cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi));
     55  Matrix.set(1,0, -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi));
     56  Matrix.set(2,0, sin(psi)*sin(theta));
     57  Matrix.set(0,1, sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi));
     58  Matrix.set(1,1, cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi));
     59  Matrix.set(2,1, -cos(psi)*sin(theta));
     60  Matrix.set(0,2, sin(theta)*sin(phi));
     61  Matrix.set(1,2, sin(theta)*cos(phi));
     62  Matrix.set(2,2, cos(theta));
     63  helper *= Matrix;
    6364  helper.ScaleAll(InverseLength);
    6465  //Log() << Verbose(4) << "Transformed RefPoint is at " << helper << "." << endl;
     
    7374  phi = -EllipsoidAngle[2];
    7475  helper.ScaleAll(EllipsoidLength);
    75   Matrix[0] = cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi);
    76   Matrix[1] = -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi);
    77   Matrix[2] = sin(psi)*sin(theta);
    78   Matrix[3] = sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi);
    79   Matrix[4] = cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi);
    80   Matrix[5] = -cos(psi)*sin(theta);
    81   Matrix[6] = sin(theta)*sin(phi);
    82   Matrix[7] = sin(theta)*cos(phi);
    83   Matrix[8] = cos(theta);
    84   helper.MatrixMultiplication(Matrix);
     76  Matrix.set(0,0, cos(psi)*cos(phi) - sin(psi)*cos(theta)*sin(phi));
     77  Matrix.set(1,0, -cos(psi)*sin(phi) - sin(psi)*cos(theta)*cos(phi));
     78  Matrix.set(2,0, sin(psi)*sin(theta));
     79  Matrix.set(0,1, sin(psi)*cos(phi) + cos(psi)*cos(theta)*sin(phi));
     80  Matrix.set(1,1, cos(psi)*cos(theta)*cos(phi) - sin(psi)*sin(phi));
     81  Matrix.set(2,1, -cos(psi)*sin(theta));
     82  Matrix.set(0,2, sin(theta)*sin(phi));
     83  Matrix.set(1,2, sin(theta)*cos(phi));
     84  Matrix.set(2,2, cos(theta));
     85  helper *= Matrix;
    8586  //Log() << Verbose(4) << "Intersection is at " << helper << "." << endl;
    8687
  • src/errorlogger.cpp

    r192f6e r4e10f5  
    99
    1010#include <fstream>
     11#include <iostream>
    1112#include "errorlogger.hpp"
    1213#include "verbose.hpp"
  • src/errorlogger.hpp

    r192f6e r4e10f5  
    99#define ERRORLOGGER_HPP_
    1010
    11 #include <iostream>
     11#include <iosfwd>
    1212
    1313#include "Patterns/Singleton.hpp"
  • src/graph.cpp

    r192f6e r4e10f5  
    1313#include "config.hpp"
    1414#include "graph.hpp"
     15#include "verbose.hpp"
    1516#include "log.hpp"
    1617#include "molecule.hpp"
  • src/graph.hpp

    r192f6e r4e10f5  
    2727class molecule;
    2828
    29 class Graph;
    3029class SubGraph;
    3130class Node;
     
    3433/********************************************** definitions *********************************/
    3534
    36 #define NodeMap pair < int, class Node* >
    37 #define EdgeMap multimap < class Node*, class Edge* >
     35typedef std::pair < int, class Node* > NodeMap;
     36typedef std::multimap < class Node*, class Edge* > EdgeMap;
    3837
    39 #define KeyStack deque<int>
    40 #define KeySet set<int>
    41 #define NumberValuePair pair<int, double>
    42 #define Graph map <KeySet, NumberValuePair, KeyCompare >
    43 #define GraphPair pair <KeySet, NumberValuePair >
    44 #define KeySetTestPair pair<KeySet::iterator, bool>
    45 #define GraphTestPair pair<Graph::iterator, bool>
     38typedef std::deque<int> KeyStack;
     39typedef std::set<int> KeySet;
     40typedef std::pair<int, double> NumberValuePair;
    4641
    47 
    48 /******************************** Some small functions and/or structures **********************************/
    49 
     42// needed for definition of Graph and GraphTestPair
    5043struct KeyCompare
    5144{
    5245  bool operator() (const KeySet SubgraphA, const KeySet SubgraphB) const;
    5346};
     47
     48typedef std::map <KeySet, NumberValuePair, KeyCompare > Graph;
     49typedef std::pair <KeySet, NumberValuePair > GraphPair;
     50typedef std::pair<KeySet::iterator, bool> KeySetTestPair;
     51typedef std::pair<Graph::iterator, bool> GraphTestPair;
     52
     53
     54/******************************** Some small functions and/or structures **********************************/
    5455
    5556//bool operator < (KeySet SubgraphA, KeySet SubgraphB);   //note: this declaration is important, otherwise normal < is used (producing wrong order)
  • src/gslvector.cpp

    r192f6e r4e10f5  
    1010#include <cassert>
    1111#include <cmath>
     12#include <iostream>
    1213
    1314#include "gslvector.hpp"
    1415#include "defs.hpp"
    1516#include "vector.hpp"
     17#include "VectorContent.hpp"
    1618
    1719/** Constructor of class GSLVector.
     
    6971 */
    7072void GSLVector::SetFromVector(Vector &v){
    71   gsl_vector_memcpy (vector, v.get());
     73  gsl_vector_memcpy (vector, v.get()->content);
    7274}
    7375
  • src/gslvector.hpp

    r192f6e r4e10f5  
    1818#endif
    1919
    20 #include <iostream>
     20#include <iosfwd>
    2121#include <gsl/gsl_vector.h>
    2222
  • src/helpers.cpp

    r192f6e r4e10f5  
    88#include "helpers.hpp"
    99#include "Helpers/fast_functions.hpp"
     10#include "verbose.hpp"
    1011#include "log.hpp"
    11 #include "memoryusageobserver.hpp"
     12
     13#include <iostream>
    1214
    1315/********************************************** helpful functions *********************************/
     
    117119};
    118120
    119 /** Blows the 6-dimensional \a cell_size array up to a full NDIM by NDIM matrix.
    120  * \param *symm 6-dim array of unique symmetric matrix components
    121  * \return allocated NDIM*NDIM array with the symmetric matrix
    122  */
    123 double * ReturnFullMatrixforSymmetric(const double * const symm)
    124 {
    125   double *matrix = new double[NDIM * NDIM];
    126   matrix[0] = symm[0];
    127   matrix[1] = symm[1];
    128   matrix[2] = symm[3];
    129   matrix[3] = symm[1];
    130   matrix[4] = symm[2];
    131   matrix[5] = symm[4];
    132   matrix[6] = symm[3];
    133   matrix[7] = symm[4];
    134   matrix[8] = symm[5];
    135   return matrix;
    136 };
    137 
    138 /** Calculate the inverse of a 3x3 matrix.
    139  * \param *matrix NDIM_NDIM array
    140  */
    141 double * InverseMatrix( const double * const A)
    142 {
    143   double *B = new double[NDIM * NDIM];
    144   double detA = RDET3(A);
    145   double detAReci;
    146 
    147   for (int i=0;i<NDIM*NDIM;++i)
    148     B[i] = 0.;
    149   // calculate the inverse B
    150   if (fabs(detA) > MYEPSILON) {;  // RDET3(A) yields precisely zero if A irregular
    151     detAReci = 1./detA;
    152     B[0] =  detAReci*RDET2(A[4],A[5],A[7],A[8]);    // A_11
    153     B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]);    // A_12
    154     B[2] =  detAReci*RDET2(A[1],A[2],A[4],A[5]);    // A_13
    155     B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]);    // A_21
    156     B[4] =  detAReci*RDET2(A[0],A[2],A[6],A[8]);    // A_22
    157     B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]);    // A_23
    158     B[6] =  detAReci*RDET2(A[3],A[4],A[6],A[7]);    // A_31
    159     B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]);    // A_32
    160     B[8] =  detAReci*RDET2(A[0],A[1],A[3],A[4]);    // A_33
    161   }
    162   return B;
    163 };
    164 
    165 
    166 
    167121/** Comparison function for GSL heapsort on distances in two molecules.
    168122 * \param *a
  • src/helpers.hpp

    r192f6e r4e10f5  
    2020#include "defs.hpp"
    2121#include "log.hpp"
    22 #include "memoryallocator.hpp"
    2322
    2423/********************************************** definitions *********************************/
     
    5251bool IsValidNumber( const char *string);
    5352int CompareDoubles (const void * a, const void * b);
    54 double * ReturnFullMatrixforSymmetric(const double * const cell_size);
    55 double * InverseMatrix(const double * const A);
    5653void performCriticalExit();
    5754
  • src/joiner.cpp

    r192f6e r4e10f5  
    1414#include "datacreator.hpp"
    1515#include "helpers.hpp"
    16 #include "memoryallocator.hpp"
    1716#include "parser.hpp"
    1817#include "periodentafel.hpp"
     18#include "verbose.hpp"
    1919
    2020//============================== MAIN =============================
  • src/linkedcell.cpp

    r192f6e r4e10f5  
    1010#include "helpers.hpp"
    1111#include "linkedcell.hpp"
     12#include "verbose.hpp"
    1213#include "log.hpp"
    1314#include "molecule.hpp"
  • src/logger.cpp

    r192f6e r4e10f5  
    99
    1010#include <fstream>
     11#include <iostream>
    1112#include "logger.hpp"
    1213#include "verbose.hpp"
  • src/logger.hpp

    r192f6e r4e10f5  
    99#define LOGGER_HPP_
    1010
    11 #include <iostream>
     11#include <iosfwd>
    1212
    1313#include "Patterns/Singleton.hpp"
  • src/molecule.cpp

    r192f6e r4e10f5  
    55 */
    66
     7#ifdef HAVE_CONFIG_H
     8#include <config.h>
     9#endif
     10
    711#include "Helpers/MemDebug.hpp"
    812
    913#include <cstring>
    1014#include <boost/bind.hpp>
     15#include <boost/foreach.hpp>
     16
     17#include <gsl/gsl_inline.h>
     18#include <gsl/gsl_heapsort.h>
    1119
    1220#include "World.hpp"
     
    2230#include "log.hpp"
    2331#include "molecule.hpp"
    24 #include "memoryallocator.hpp"
     32
    2533#include "periodentafel.hpp"
    2634#include "stackclass.hpp"
    2735#include "tesselation.hpp"
    2836#include "vector.hpp"
     37#include "Matrix.hpp"
    2938#include "World.hpp"
     39#include "Box.hpp"
    3040#include "Plane.hpp"
    3141#include "Exceptions/LinearDependenceException.hpp"
     
    284294  Vector Orthovector1, Orthovector2;  // temporary vectors in coordination construction
    285295  Vector InBondvector;    // vector in direction of *Bond
    286   double *matrix = NULL;
     296  const Matrix &matrix =  World::getInstance().getDomain().getM();
    287297  bond *Binder = NULL;
    288   double * const cell_size = World::getInstance().getDomain();
    289298
    290299//  Log() << Verbose(3) << "Begin of AddHydrogenReplacementAtom." << endl;
     
    307316      } // (signs are correct, was tested!)
    308317    }
    309     matrix = ReturnFullMatrixforSymmetric(cell_size);
    310     Orthovector1.MatrixMultiplication(matrix);
     318    Orthovector1 *= matrix;
    311319    InBondvector -= Orthovector1; // subtract just the additional translation
    312     delete[](matrix);
    313320    bondlength = InBondvector.Norm();
    314321//    Log() << Verbose(4) << "Corrected InBondvector is now: ";
     
    541548      break;
    542549  }
    543   delete[](matrix);
    544550
    545551//  Log() << Verbose(3) << "End of AddHydrogenReplacementAtom." << endl;
     
    660666 * @param three vectors forming the matrix that defines the shape of the parallelpiped
    661667 */
    662 molecule* molecule::CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const {
     668molecule* molecule::CopyMoleculeFromSubRegion(const Shape &region) const {
    663669  molecule *copy = World::getInstance().createMolecule();
    664670
    665   ActOnCopyWithEachAtomIfTrue ( &molecule::AddCopyAtom, copy, &atom::IsInParallelepiped, offset, parallelepiped );
     671  BOOST_FOREACH(atom *iter,atoms){
     672    if(iter->IsInShape(region)){
     673      copy->AddCopyAtom(iter);
     674    }
     675  }
    666676
    667677  //TODO: copy->BuildInducedSubgraph(this);
     
    750760void molecule::SetBoxDimension(Vector *dim)
    751761{
    752   double * const cell_size = World::getInstance().getDomain();
    753   cell_size[0] = dim->at(0);
    754   cell_size[1] = 0.;
    755   cell_size[2] = dim->at(1);
    756   cell_size[3] = 0.;
    757   cell_size[4] = 0.;
    758   cell_size[5] = dim->at(2);
     762  Matrix domain;
     763  for(int i =0; i<NDIM;++i)
     764    domain.at(i,i) = dim->at(i);
     765  World::getInstance().setDomain(domain);
    759766};
    760767
     
    849856bool molecule::CheckBounds(const Vector *x) const
    850857{
    851   double * const cell_size = World::getInstance().getDomain();
     858  const Matrix &domain = World::getInstance().getDomain().getM();
    852859  bool result = true;
    853   int j =-1;
    854860  for (int i=0;i<NDIM;i++) {
    855     j += i+1;
    856     result = result && ((x->at(i) >= 0) && (x->at(i) < cell_size[j]));
     861    result = result && ((x->at(i) >= 0) && (x->at(i) < domain.at(i,i)));
    857862  }
    858863  //return result;
  • src/molecule.hpp

    r192f6e r4e10f5  
    77#define MOLECULES_HPP_
    88
    9 using namespace std;
    10 
    119/*********************************************** includes ***********************************/
    1210
    13 // GSL headers
    14 #include <gsl/gsl_eigen.h>
    15 #include <gsl/gsl_heapsort.h>
    16 #include <gsl/gsl_linalg.h>
    17 #include <gsl/gsl_matrix.h>
    18 #include <gsl/gsl_multimin.h>
    19 #include <gsl/gsl_vector.h>
    20 #include <gsl/gsl_randist.h>
     11#ifdef HAVE_CONFIG_H
     12#include <config.h>
     13#endif
    2114
    2215//// STL headers
     
    3124#include "types.hpp"
    3225#include "graph.hpp"
    33 #include "stackclass.hpp"
    3426#include "tesselation.hpp"
    3527#include "Patterns/Observer.hpp"
     
    5345class periodentafel;
    5446class Vector;
     47class Shape;
     48template <class> class StackClass;
    5549
    5650/******************************** Some definitions for easier reading **********************************/
     
    316310
    317311  molecule *CopyMolecule();
    318   molecule* CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const;
     312  molecule* CopyMoleculeFromSubRegion(const Shape&) const;
    319313
    320314  /// Fragment molecule by two different approaches:
  • src/molecule_dynamics.cpp

    r192f6e r4e10f5  
    1313#include "element.hpp"
    1414#include "info.hpp"
     15#include "verbose.hpp"
    1516#include "log.hpp"
    16 #include "memoryallocator.hpp"
    1717#include "molecule.hpp"
    1818#include "parser.hpp"
    1919#include "Plane.hpp"
    2020#include "ThermoStatContainer.hpp"
     21
     22#include <gsl/gsl_matrix.h>
     23#include <gsl/gsl_vector.h>
     24#include <gsl/gsl_linalg.h>
    2125
    2226/************************************* Functions for class molecule *********************************/
  • src/molecule_fragmentation.cpp

    r192f6e r4e10f5  
    1717#include "helpers.hpp"
    1818#include "lists.hpp"
     19#include "verbose.hpp"
    1920#include "log.hpp"
    20 #include "memoryallocator.hpp"
    2121#include "molecule.hpp"
    2222#include "periodentafel.hpp"
    2323#include "World.hpp"
     24#include "Matrix.hpp"
     25#include "Box.hpp"
     26#include "stackclass.hpp"
    2427
    2528/************************************* Functions for class molecule *********************************/
     
    17161719  atom *Walker = NULL;
    17171720  atom *OtherWalker = NULL;
    1718   double * const cell_size = World::getInstance().getDomain();
    1719   double *matrix = ReturnFullMatrixforSymmetric(cell_size);
     1721  Matrix matrix = World::getInstance().getDomain().getM();
    17201722  enum Shading *ColorList = NULL;
    17211723  double tmp;
     
    17571759          Translationvector[i] = (tmp < 0) ? +1. : -1.;
    17581760      }
    1759       Translationvector.MatrixMultiplication(matrix);
     1761      Translationvector *= matrix;
    17601762      //Log() << Verbose(3) << "Translation vector is ";
    17611763      Log() << Verbose(0) << Translationvector <<  endl;
     
    17881790  delete(AtomStack);
    17891791  delete[](ColorList);
    1790   delete[](matrix);
    17911792  DoLog(2) && (Log() << Verbose(2) << "End of ScanForPeriodicCorrection." << endl);
    17921793};
  • src/molecule_geometry.cpp

    r192f6e r4e10f5  
    55 *      Author: heber
    66 */
     7
     8#ifdef HAVE_CONFIG_H
     9#include <config.h>
     10#endif
    711
    812#include "Helpers/MemDebug.hpp"
     
    1418#include "helpers.hpp"
    1519#include "leastsquaremin.hpp"
     20#include "verbose.hpp"
    1621#include "log.hpp"
    17 #include "memoryallocator.hpp"
    1822#include "molecule.hpp"
    1923#include "World.hpp"
    2024#include "Plane.hpp"
     25#include "Matrix.hpp"
     26#include "Box.hpp"
    2127#include <boost/foreach.hpp>
     28
     29#include <gsl/gsl_eigen.h>
     30#include <gsl/gsl_multimin.h>
    2231
    2332
     
    3342  const Vector *Center = DetermineCenterOfAll();
    3443  const Vector *CenterBox = DetermineCenterOfBox();
    35   double * const cell_size = World::getInstance().getDomain();
    36   double *M = ReturnFullMatrixforSymmetric(cell_size);
    37   double *Minv = InverseMatrix(M);
     44  Box &domain = World::getInstance().getDomain();
    3845
    3946  // go through all atoms
    4047  ActOnAllVectors( &Vector::SubtractVector, *Center);
    4148  ActOnAllVectors( &Vector::SubtractVector, *CenterBox);
    42   ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
    43 
    44   delete[](M);
    45   delete[](Minv);
     49  BOOST_FOREACH(atom* iter, atoms){
     50    *iter->node = domain.WrapPeriodically(*iter->node);
     51  }
     52
    4653  delete(Center);
    4754  delete(CenterBox);
     
    5663{
    5764  bool status = true;
    58   double * const cell_size = World::getInstance().getDomain();
    59   double *M = ReturnFullMatrixforSymmetric(cell_size);
    60   double *Minv = InverseMatrix(M);
     65  Box &domain = World::getInstance().getDomain();
    6166
    6267  // go through all atoms
    63   ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
    64 
    65   delete[](M);
    66   delete[](Minv);
     68  BOOST_FOREACH(atom* iter, atoms){
     69    *iter->node = domain.WrapPeriodically(*iter->node);
     70  }
     71
    6772  return status;
    6873};
     
    153158{
    154159  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 
     160  const Matrix &M = World::getInstance().getDomain().getM();
     161  (*a) *= M;
    161162  return a;
    162163};
     
    244245void molecule::TranslatePeriodically(const Vector *trans)
    245246{
    246   double * const cell_size = World::getInstance().getDomain();
    247   double *M = ReturnFullMatrixforSymmetric(cell_size);
    248   double *Minv = InverseMatrix(M);
     247  Box &domain = World::getInstance().getDomain();
    249248
    250249  // go through all atoms
    251250  ActOnAllVectors( &Vector::AddVector, *trans);
    252   ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);
    253 
    254   delete[](M);
    255   delete[](Minv);
     251  BOOST_FOREACH(atom* iter, atoms){
     252    *iter->node = domain.WrapPeriodically(*iter->node);
     253  }
     254
    256255};
    257256
     
    264263  OBSERVE;
    265264  Plane p(*n,0);
    266   BOOST_FOREACH( atom* iter, atoms ){
     265  BOOST_FOREACH(atom* iter, atoms ){
    267266    (*iter->node) = p.mirrorVector(*iter->node);
    268267  }
     
    274273void molecule::DeterminePeriodicCenter(Vector &center)
    275274{
    276   double * const cell_size = World::getInstance().getDomain();
    277   double *matrix = ReturnFullMatrixforSymmetric(cell_size);
    278   double *inversematrix = InverseMatrix(matrix);
     275  const Matrix &matrix = World::getInstance().getDomain().getM();
     276  const Matrix &inversematrix = World::getInstance().getDomain().getM();
    279277  double tmp;
    280278  bool flag;
     
    288286      if ((*iter)->type->Z != 1) {
    289287#endif
    290         Testvector = (*iter)->x;
    291         Testvector.MatrixMultiplication(inversematrix);
     288        Testvector = inversematrix * (*iter)->x;
    292289        Translationvector.Zero();
    293290        for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) {
     
    306303        }
    307304        Testvector += Translationvector;
    308         Testvector.MatrixMultiplication(matrix);
     305        Testvector *= matrix;
    309306        Center += Testvector;
    310307        Log() << Verbose(1) << "vector is: " << Testvector << endl;
     
    313310        for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) {
    314311          if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) {
    315             Testvector = (*Runner)->GetOtherAtom((*iter))->x;
    316             Testvector.MatrixMultiplication(inversematrix);
     312            Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x;
    317313            Testvector += Translationvector;
    318             Testvector.MatrixMultiplication(matrix);
     314            Testvector *= matrix;
    319315            Center += Testvector;
    320316            Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl;
     
    325321    }
    326322  } while (!flag);
    327   delete[](matrix);
    328   delete[](inversematrix);
    329323
    330324  Center.Scale(1./static_cast<double>(getAtomCount()));
     
    388382    DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... ");
    389383    // the eigenvectors specify the transformation matrix
    390     ActOnAllVectors( &Vector::MatrixMultiplication, (const double *) evec->data );
     384    Matrix M = Matrix(evec->data);
     385    BOOST_FOREACH(atom* iter, atoms){
     386      (*iter->node) *= M;
     387    }
    391388    DoLog(0) && (Log() << Verbose(0) << "done." << endl);
    392389
  • src/molecule_graph.cpp

    r192f6e r4e10f5  
    55 *      Author: heber
    66 */
     7
     8#ifdef HAVE_CONFIG_H
     9#include <config.h>
     10#endif
    711
    812#include "Helpers/MemDebug.hpp"
     
    1822#include "linkedcell.hpp"
    1923#include "lists.hpp"
     24#include "verbose.hpp"
    2025#include "log.hpp"
    21 #include "memoryallocator.hpp"
    2226#include "molecule.hpp"
    2327#include "World.hpp"
    2428#include "Helpers/fast_functions.hpp"
    2529#include "Helpers/Assert.hpp"
    26 
     30#include "Matrix.hpp"
     31#include "Box.hpp"
     32#include "stackclass.hpp"
    2733
    2834struct BFSAccounting
     
    121127  LinkedCell *LC = NULL;
    122128  bool free_BG = false;
    123   double * const cell_size = World::getInstance().getDomain();
     129  Box &domain = World::getInstance().getDomain();
    124130
    125131  if (BG == NULL) {
     
    178184                          //Log() << Verbose(1) << "Checking distance " << OtherWalker->x.PeriodicDistanceSquared(&(Walker->x), cell_size) << " against typical bond length of " << bonddistance*bonddistance << "." << endl;
    179185                          (BG->*minmaxdistance)(Walker, OtherWalker, MinDistance, MaxDistance, IsAngstroem);
    180                           const double distance = OtherWalker->x.PeriodicDistanceSquared(Walker->x,cell_size);
     186                          const double distance = domain.periodicDistanceSquared(OtherWalker->x,Walker->x);
    181187                          const bool status = (distance <= MaxDistance * MaxDistance) && (distance >= MinDistance * MinDistance);
    182188//                          Log() << Verbose(1) << "MinDistance is " << MinDistance << " and MaxDistance is " << MaxDistance << "." << endl;
     
    579585    // From OldGraphNr to CurrentGraphNr ranges an disconnected subgraph
    580586    DoLog(0) && (Log() << Verbose(0) << "Disconnected subgraph ranges from " << OldGraphNr << " to " << DFS.CurrentGraphNr << "." << endl);
    581     LeafWalker->Leaf->Output((ofstream *)&cout);
     587    LeafWalker->Leaf->Output((ofstream *)&(Log() << Verbose(0)));
    582588    DoLog(0) && (Log() << Verbose(0) << endl);
    583589
  • src/molecule_pointcloud.cpp

    r192f6e r4e10f5  
    1111#include "config.hpp"
    1212#include "info.hpp"
    13 #include "memoryallocator.hpp"
    1413#include "molecule.hpp"
    1514
  • src/moleculelist.cpp

    r192f6e r4e10f5  
    55 */
    66
     7#ifdef HAVE_CONFIG_H
     8#include <config.h>
     9#endif
     10
    711#include "Helpers/MemDebug.hpp"
    812
    913#include <cstring>
     14
     15#include <gsl/gsl_inline.h>
     16#include <gsl/gsl_heapsort.h>
    1017
    1118#include "World.hpp"
     
    1926#include "linkedcell.hpp"
    2027#include "lists.hpp"
     28#include "verbose.hpp"
    2129#include "log.hpp"
    2230#include "molecule.hpp"
    23 #include "memoryallocator.hpp"
    2431#include "periodentafel.hpp"
    2532#include "Helpers/Assert.hpp"
     33#include "Matrix.hpp"
     34#include "Box.hpp"
     35#include "stackclass.hpp"
    2636
    2737#include "Helpers/Assert.hpp"
     
    631641  int FragmentCounter = 0;
    632642  ofstream output;
    633   double cell_size_backup[6];
    634   double * const cell_size = World::getInstance().getDomain();
    635 
    636   // backup cell_size
    637   for (int i=0;i<6;i++)
    638     cell_size_backup[i] = cell_size[i];
     643  Matrix cell_size = World::getInstance().getDomain().getM();
     644  Matrix cell_size_backup = cell_size;
     645
    639646  // store the fragments as config and as xyz
    640647  for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) {
     
    674681    (*ListRunner)->CenterEdge(&BoxDimension);
    675682    (*ListRunner)->SetBoxDimension(&BoxDimension); // update Box of atoms by boundary
    676     int j = -1;
    677683    for (int k = 0; k < NDIM; k++) {
    678       j += k + 1;
    679684      BoxDimension[k] = 2.5 * (World::getInstance().getConfig()->GetIsAngstroem() ? 1. : 1. / AtomicLengthToAngstroem);
    680       cell_size[j] = BoxDimension[k] * 2.;
    681     }
     685      cell_size.at(k,k) = BoxDimension[k] * 2.;
     686    }
     687    World::getInstance().setDomain(cell_size);
    682688    (*ListRunner)->Translate(&BoxDimension);
    683689
     
    725731
    726732  // restore cell_size
    727   for (int i=0;i<6;i++)
    728     cell_size[i] = cell_size_backup[i];
     733  World::getInstance().setDomain(cell_size_backup);
    729734
    730735  return result;
     
    887892  // center at set box dimensions
    888893  mol->CenterEdge(&center);
    889   World::getInstance().getDomain()[0] = center[0];
    890   World::getInstance().getDomain()[1] = 0;
    891   World::getInstance().getDomain()[2] = center[1];
    892   World::getInstance().getDomain()[3] = 0;
    893   World::getInstance().getDomain()[4] = 0;
    894   World::getInstance().getDomain()[5] = center[2];
     894  Matrix domain;
     895  for(int i =0;i<NDIM;++i)
     896    domain.at(i,i) = center[i];
     897  World::getInstance().setDomain(domain);
    895898  insert(mol);
    896899}
  • src/parser.cpp

    r192f6e r4e10f5  
    1212
    1313#include "helpers.hpp"
    14 #include "memoryallocator.hpp"
    1514#include "parser.hpp"
     15#include "verbose.hpp"
    1616
    1717// include config.h
  • src/periodentafel.hpp

    r192f6e r4e10f5  
    99#endif
    1010
    11 #include <iostream>
     11#include <iosfwd>
    1212#include <map>
    13 #include <iterator>
    1413
    1514#include "unittests/periodentafelTest.hpp"
  • src/stackclass.hpp

    r192f6e r4e10f5  
    1212
    1313#include "verbose.hpp"
    14 #include "memoryallocator.hpp"
     14#include "log.hpp"
    1515
    1616/****************************************** forward declarations *****************************/
  • src/tesselation.cpp

    r192f6e r4e10f5  
    99
    1010#include <fstream>
     11#include <iomanip>
    1112
    1213#include "helpers.hpp"
  • src/tesselationhelpers.cpp

    r192f6e r4e10f5  
    2121#include "verbose.hpp"
    2222#include "Plane.hpp"
    23 
    24 double DetGet(gsl_matrix * const A, const int inPlace)
    25 {
    26         Info FunctionInfo(__func__);
    27   /*
    28   inPlace = 1 => A is replaced with the LU decomposed copy.
    29   inPlace = 0 => A is retained, and a copy is used for LU.
    30   */
    31 
    32   double det;
    33   int signum;
    34   gsl_permutation *p = gsl_permutation_alloc(A->size1);
    35   gsl_matrix *tmpA=0;
    36 
    37   if (inPlace)
    38   tmpA = A;
    39   else {
    40   gsl_matrix *tmpA = gsl_matrix_alloc(A->size1, A->size2);
    41   gsl_matrix_memcpy(tmpA , A);
    42   }
    43 
    44 
    45   gsl_linalg_LU_decomp(tmpA , p , &signum);
    46   det = gsl_linalg_LU_det(tmpA , signum);
    47   gsl_permutation_free(p);
    48   if (! inPlace)
    49   gsl_matrix_free(tmpA);
    50 
    51   return det;
    52 };
     23#include "Matrix.hpp"
    5324
    5425void GetSphere(Vector * const center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS)
    5526{
    5627        Info FunctionInfo(__func__);
    57   gsl_matrix *A = gsl_matrix_calloc(3,3);
     28  Matrix mat;
    5829  double m11, m12, m13, m14;
    5930
    6031  for(int i=0;i<3;i++) {
    61     gsl_matrix_set(A, i, 0, a[i]);
    62     gsl_matrix_set(A, i, 1, b[i]);
    63     gsl_matrix_set(A, i, 2, c[i]);
    64   }
    65   m11 = DetGet(A, 1);
     32    mat.set(i, 0, a[i]);
     33    mat.set(i, 1, b[i]);
     34    mat.set(i, 2, c[i]);
     35  }
     36  m11 = mat.determinant();
    6637
    6738  for(int i=0;i<3;i++) {
    68     gsl_matrix_set(A, i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);
    69     gsl_matrix_set(A, i, 1, b[i]);
    70     gsl_matrix_set(A, i, 2, c[i]);
    71   }
    72   m12 = DetGet(A, 1);
     39    mat.set(i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);
     40    mat.set(i, 1, b[i]);
     41    mat.set(i, 2, c[i]);
     42  }
     43  m12 = mat.determinant();
    7344
    7445  for(int i=0;i<3;i++) {
    75     gsl_matrix_set(A, i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);
    76     gsl_matrix_set(A, i, 1, a[i]);
    77     gsl_matrix_set(A, i, 2, c[i]);
    78   }
    79   m13 = DetGet(A, 1);
     46    mat.set(i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);
     47    mat.set(i, 1, a[i]);
     48    mat.set(i, 2, c[i]);
     49  }
     50  m13 = mat.determinant();
    8051
    8152  for(int i=0;i<3;i++) {
    82     gsl_matrix_set(A, i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);
    83     gsl_matrix_set(A, i, 1, a[i]);
    84     gsl_matrix_set(A, i, 2, b[i]);
    85   }
    86   m14 = DetGet(A, 1);
     53    mat.set(i, 0, a[i]*a[i] + b[i]*b[i] + c[i]*c[i]);
     54    mat.set(i, 1, a[i]);
     55    mat.set(i, 2, b[i]);
     56  }
     57  m14 = mat.determinant();
    8758
    8859  if (fabs(m11) < MYEPSILON)
     
    9566  if (fabs(a.distance(*center) - RADIUS) > MYEPSILON)
    9667    DoeLog(1) && (eLog()<< Verbose(1) << "The given center is further way by " << fabs(a.distance(*center) - RADIUS) << " from a than RADIUS." << endl);
    97 
    98   gsl_matrix_free(A);
    9968};
    10069
     
    248217  Vector x3;
    249218  Vector x4;
    250 };
    251 
    252 /**
    253  * Intersection calculation function.
    254  *
    255  * @param x to find the result for
    256  * @param function parameter
    257  */
    258 double MinIntersectDistance(const gsl_vector * x, void *params)
    259 {
    260         Info FunctionInfo(__func__);
    261   double retval = 0;
    262   struct Intersection *I = (struct Intersection *)params;
    263   Vector intersection;
    264   for (int i=0;i<NDIM;i++)
    265     intersection[i] = gsl_vector_get(x, i);
    266 
    267   Vector SideA = I->x1 -I->x2 ;
    268   Vector HeightA = intersection - I->x1;
    269   HeightA.ProjectOntoPlane(SideA);
    270 
    271   Vector SideB = I->x3 - I->x4;
    272   Vector HeightB = intersection - I->x3;
    273   HeightB.ProjectOntoPlane(SideB);
    274 
    275   retval = HeightA.ScalarProduct(HeightA) + HeightB.ScalarProduct(HeightB);
    276   //Log() << Verbose(1) << "MinIntersectDistance called, result: " << retval << endl;
    277 
    278   return retval;
    279 };
    280 
    281 
    282 /**
    283  * Calculates whether there is an intersection between two lines. The first line
    284  * always goes through point 1 and point 2 and the second line is given by the
    285  * connection between point 4 and point 5.
    286  *
    287  * @param point 1 of line 1
    288  * @param point 2 of line 1
    289  * @param point 1 of line 2
    290  * @param point 2 of line 2
    291  *
    292  * @return true if there is an intersection between the given lines, false otherwise
    293  */
    294 bool existsIntersection(const Vector &point1, const Vector &point2, const Vector &point3, const Vector &point4)
    295 {
    296         Info FunctionInfo(__func__);
    297   bool result;
    298 
    299   struct Intersection par;
    300     par.x1 = point1;
    301     par.x2 = point2;
    302     par.x3 = point3;
    303     par.x4 = point4;
    304 
    305     const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex;
    306     gsl_multimin_fminimizer *s = NULL;
    307     gsl_vector *ss, *x;
    308     gsl_multimin_function minexFunction;
    309 
    310     size_t iter = 0;
    311     int status;
    312     double size;
    313 
    314     /* Starting point */
    315     x = gsl_vector_alloc(NDIM);
    316     gsl_vector_set(x, 0, point1[0]);
    317     gsl_vector_set(x, 1, point1[1]);
    318     gsl_vector_set(x, 2, point1[2]);
    319 
    320     /* Set initial step sizes to 1 */
    321     ss = gsl_vector_alloc(NDIM);
    322     gsl_vector_set_all(ss, 1.0);
    323 
    324     /* Initialize method and iterate */
    325     minexFunction.n = NDIM;
    326     minexFunction.f = &MinIntersectDistance;
    327     minexFunction.params = (void *)&par;
    328 
    329     s = gsl_multimin_fminimizer_alloc(T, NDIM);
    330     gsl_multimin_fminimizer_set(s, &minexFunction, x, ss);
    331 
    332     do {
    333         iter++;
    334         status = gsl_multimin_fminimizer_iterate(s);
    335 
    336         if (status) {
    337           break;
    338         }
    339 
    340         size = gsl_multimin_fminimizer_size(s);
    341         status = gsl_multimin_test_size(size, 1e-2);
    342 
    343         if (status == GSL_SUCCESS) {
    344           DoLog(1) && (Log() << Verbose(1) << "converged to minimum" <<  endl);
    345         }
    346     } while (status == GSL_CONTINUE && iter < 100);
    347 
    348     // check whether intersection is in between or not
    349   Vector intersection;
    350   double t1, t2;
    351   for (int i = 0; i < NDIM; i++) {
    352     intersection[i] = gsl_vector_get(s->x, i);
    353   }
    354 
    355   Vector SideA = par.x2 - par.x1;
    356   Vector HeightA = intersection - par.x1;
    357 
    358   t1 = HeightA.ScalarProduct(SideA)/SideA.ScalarProduct(SideA);
    359 
    360   Vector SideB = par.x4 - par.x3;
    361   Vector HeightB = intersection - par.x3;
    362 
    363   t2 = HeightB.ScalarProduct(SideB)/SideB.ScalarProduct(SideB);
    364 
    365   Log() << Verbose(1) << "Intersection " << intersection << " is at "
    366     << t1 << " for (" << point1 << "," << point2 << ") and at "
    367     << t2 << " for (" << point3 << "," << point4 << "): ";
    368 
    369   if (((t1 >= 0) && (t1 <= 1)) && ((t2 >= 0) && (t2 <= 1))) {
    370     DoLog(1) && (Log() << Verbose(1) << "true intersection." << endl);
    371     result = true;
    372   } else {
    373     DoLog(1) && (Log() << Verbose(1) << "intersection out of region of interest." << endl);
    374     result = false;
    375   }
    376 
    377   // free minimizer stuff
    378     gsl_vector_free(x);
    379     gsl_vector_free(ss);
    380     gsl_multimin_fminimizer_free(s);
    381 
    382   return result;
    383219};
    384220
  • src/tesselationhelpers.hpp

    r192f6e r4e10f5  
    2020#endif
    2121
    22 #include <gsl/gsl_linalg.h>
    23 #include <gsl/gsl_matrix.h>
    24 #include <gsl/gsl_multimin.h>
    25 #include <gsl/gsl_permutation.h>
    26 #include <gsl/gsl_vector.h>
    27 
    28 #include <iostream>
     22#include <iosfwd>
    2923
    3024#include "defs.hpp"
     
    4741/********************************************** declarations *******************************/
    4842
    49 double DetGet(gsl_matrix * const A, const int inPlace);
    5043void GetSphere(Vector * const Center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS);
    5144void GetCenterOfSphere(Vector* const Center, const Vector &a, const Vector &b, const Vector &c, Vector * const NewUmkreismittelpunkt, const Vector* const Direction, const Vector* const AlternativeDirection, const double HalfplaneIndicator, const double AlternativeIndicator, const double alpha, const double beta, const double gamma, const double RADIUS, const double Umkreisradius);
    5245void GetCenterofCircumcircle(Vector * const Center, const Vector &a, const Vector &b, const Vector &c);
    5346double GetPathLengthonCircumCircle(const Vector &CircleCenter, const Vector &CirclePlaneNormal, const double CircleRadius, const Vector &NewSphereCenter, const Vector &OldSphereCenter, const Vector &NormalVector, const Vector &SearchDirection);
    54 double MinIntersectDistance(const gsl_vector * x, void *params);
    55 bool existsIntersection(const Vector &point1, const Vector &point2, const Vector &point3, const Vector &point4);
    5647double CalculateVolumeofGeneralTetraeder(const Vector &a, const Vector &b, const Vector &c, const Vector &d);
    5748double CalculateAreaofGeneralTriangle(const Vector &A, const Vector &B, const Vector &C);
  • src/triangleintersectionlist.cpp

    r192f6e r4e10f5  
    1818#include "tesselation.hpp"
    1919#include "vector.hpp"
     20#include "verbose.hpp"
    2021
    2122/** Constructor for class TriangleIntersectionList.
  • src/unittests/ActOnAllUnitTest.cpp

    r192f6e r4e10f5  
    1414#include "../test/ActOnAlltest.hpp"
    1515#include "ActOnAllUnitTest.hpp"
    16 #include "memoryallocator.hpp"
    1716#include "vector.hpp"
    1817
  • src/unittests/LineUnittest.cpp

    r192f6e r4e10f5  
    1717
    1818#include <iostream>
     19#include <cmath>
    1920
    2021using namespace std;
     
    352353  CPPUNIT_ASSERT_EQUAL(fixture,zeroVec);
    353354}
     355
     356void LineUnittest::sphereIntersectionTest(){
     357  {
     358    std::vector<Vector> res = la1->getSphereIntersections();
     359    CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2);
     360    CPPUNIT_ASSERT(testDirection(res[0],e1));
     361    CPPUNIT_ASSERT(testDirection(res[1],e1));
     362    CPPUNIT_ASSERT(res[0]!=res[1]);
     363  }
     364
     365  {
     366    std::vector<Vector> res = la2->getSphereIntersections();
     367    CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2);
     368    CPPUNIT_ASSERT(testDirection(res[0],e2));
     369    CPPUNIT_ASSERT(testDirection(res[1],e2));
     370    CPPUNIT_ASSERT(res[0]!=res[1]);
     371  }
     372
     373  {
     374    std::vector<Vector> res = la3->getSphereIntersections();
     375    CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2);
     376    CPPUNIT_ASSERT(testDirection(res[0],e3));
     377    CPPUNIT_ASSERT(testDirection(res[1],e3));
     378    CPPUNIT_ASSERT(res[0]!=res[1]);
     379  }
     380
     381  {
     382    std::vector<Vector> res = lp1->getSphereIntersections();
     383    CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2);
     384    CPPUNIT_ASSERT((res[0]==e1) || (res[0]==e2));
     385    CPPUNIT_ASSERT((res[1]==e1) || (res[1]==e2));
     386    CPPUNIT_ASSERT(res[0]!=res[1]);
     387  }
     388
     389  {
     390    std::vector<Vector> res = lp2->getSphereIntersections();
     391    CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2);
     392    CPPUNIT_ASSERT((res[0]==e2) || (res[0]==e3));
     393    CPPUNIT_ASSERT((res[1]==e2) || (res[1]==e3));
     394    CPPUNIT_ASSERT(res[0]!=res[1]);
     395  }
     396
     397  {
     398    std::vector<Vector> res = lp3->getSphereIntersections();
     399    CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2);
     400    CPPUNIT_ASSERT((res[0]==e3) || (res[0]==e1));
     401    CPPUNIT_ASSERT((res[1]==e3) || (res[1]==e1));
     402    CPPUNIT_ASSERT(res[0]!=res[1]);
     403  }
     404}
  • src/unittests/LineUnittest.hpp

    r192f6e r4e10f5  
    2222  CPPUNIT_TEST ( intersectionTest );
    2323  CPPUNIT_TEST ( rotationTest );
     24  CPPUNIT_TEST ( sphereIntersectionTest );
    2425  CPPUNIT_TEST_SUITE_END();
    2526
     
    3334  void intersectionTest();
    3435  void rotationTest();
     36  void sphereIntersectionTest();
    3537
    3638private:
  • src/unittests/Makefile.am

    r192f6e r4e10f5  
    3131  LogUnitTest \
    3232  manipulateAtomsTest \
    33   MemoryUsageObserverUnitTest \
    34   MemoryAllocatorUnitTest \
     33  MatrixUnittest \
    3534  MoleculeDescriptorTest \
    3635  ObserverTest \
     
    3837  periodentafelTest \
    3938  PlaneUnittest \
     39  ShapeUnittest \
    4040  SingletonTest \
    4141  StackClassUnitTest \
     
    7575  listofbondsunittest.cpp \
    7676  logunittest.cpp \
     77  MatrixUnittest.cpp \
    7778  manipulateAtomsTest.cpp \
    78   memoryallocatorunittest.cpp  \
    79   memoryusageobserverunittest.cpp \
    8079  MoleculeDescriptorTest.cpp \
    8180  ObserverTest.cpp \
     
    8382  periodentafelTest.cpp \
    8483  PlaneUnittest.cpp \
     84  ShapeUnittest.cpp \
    8585  SingletonTest.cpp \
    8686  stackclassunittest.cpp \
     
    112112  logunittest.hpp \
    113113  manipulateAtomsTest.hpp \
    114   memoryallocatorunittest.hpp  \
    115   memoryusageobserverunittest.hpp \
     114  MatrixUnittest.hpp \
    116115  MoleculeDescriptorTest.hpp \
    117116  periodentafelTest.hpp \
     
    189188manipulateAtomsTest_LDADD = ${ALLLIBS}
    190189
    191 MemoryAllocatorUnitTest_SOURCES = UnitTestMain.cpp ../memoryallocator.hpp ../memoryallocator.cpp ../memoryusageobserver.cpp ../memoryusageobserver.hpp memoryallocatorunittest.cpp memoryallocatorunittest.hpp
    192 MemoryAllocatorUnitTest_LDADD = ${ALLLIBS}
    193 
    194 MemoryUsageObserverUnitTest_SOURCES = UnitTestMain.cpp ../memoryallocator.hpp ../memoryusageobserver.cpp ../memoryusageobserver.hpp memoryusageobserverunittest.cpp memoryusageobserverunittest.hpp
    195 MemoryUsageObserverUnitTest_LDADD = ${ALLLIBS}
     190MatrixUnittest_SOURCES = UnitTestMain.cpp MatrixUnittest.cpp MatrixUnittest.hpp
     191MatrixUnittest_LDADD = ${ALLLIBS}
    196192
    197193MoleculeDescriptorTest_SOURCES = UnitTestMain.cpp MoleculeDescriptorTest.cpp MoleculeDescriptorTest.hpp
     
    210206PlaneUnittest_LDADD = ${ALLLIBS}
    211207
     208ShapeUnittest_SOURCES = UnitTestMain.cpp ShapeUnittest.cpp ShapeUnittest.hpp
     209ShapeUnittest_LDADD = ${ALLLIBS}
     210
    212211SingletonTest_SOURCES = UnitTestMain.cpp SingletonTest.cpp SingletonTest.hpp
    213212SingletonTest_LDADD = ${ALLLIBS} $(BOOST_LIB) ${BOOST_THREAD_LIB}
     
    225224Tesselation_InOutsideUnitTest_LDADD = ${ALLLIBS}
    226225
    227 TestRunner_SOURCES = TestRunnerMain.cpp ../memoryallocator.hpp ../memoryallocator.cpp ../memoryusageobserver.cpp ../memoryusageobserver.hpp $(TESTSOURCES) $(TESTHEADERS)
     226TestRunner_SOURCES = TestRunnerMain.cpp $(TESTSOURCES) $(TESTHEADERS)
    228227TestRunner_LDADD = ${ALLLIBS}
    229228
  • src/unittests/PlaneUnittest.cpp

    r192f6e r4e10f5  
    1111#include <cppunit/extensions/TestFactoryRegistry.h>
    1212#include <cppunit/ui/text/TestRunner.h>
     13
     14#include <cmath>
    1315
    1416#ifdef HAVE_TESTRUNNER
  • src/unittests/linearsystemofequationsunittest.cpp

    r192f6e r4e10f5  
    1212#include <cppunit/extensions/TestFactoryRegistry.h>
    1313#include <cppunit/ui/text/TestRunner.h>
     14#include <cmath>
    1415
    1516#include "linearsystemofequationsunittest.hpp"
  • src/unittests/tesselation_insideoutsideunittest.cpp

    r192f6e r4e10f5  
    1717#include "tesselation.hpp"
    1818#include "tesselation_insideoutsideunittest.hpp"
     19#include "verbose.hpp"
    1920
    2021#ifdef HAVE_TESTRUNNER
  • src/unittests/vectorunittest.cpp

    r192f6e r4e10f5  
    1515#include "defs.hpp"
    1616#include "log.hpp"
    17 #include "memoryusageobserver.hpp"
    1817#include "vector.hpp"
    1918#include "vector_ops.hpp"
     
    2120#include "Plane.hpp"
    2221#include "Exceptions/LinearDependenceException.hpp"
     22#include "Matrix.hpp"
    2323
    2424#ifdef HAVE_TESTRUNNER
     
    214214  CPPUNIT_ASSERT(testVector.ScalarProduct(three) < MYEPSILON);
    215215}
    216 
    217 
    218 /**
    219  * UnitTest for Vector::IsInParallelepiped().
    220  */
    221 void VectorTest::IsInParallelepipedTest()
    222 {
    223   double parallelepiped[NDIM*NDIM];
    224   parallelepiped[0] = 1;
    225   parallelepiped[1] = 0;
    226   parallelepiped[2] = 0;
    227   parallelepiped[3] = 0;
    228   parallelepiped[4] = 1;
    229   parallelepiped[5] = 0;
    230   parallelepiped[6] = 0;
    231   parallelepiped[7] = 0;
    232   parallelepiped[8] = 1;
    233 
    234   fixture = zero;
    235   CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    236   fixture = Vector(2.5,2.5,2.5);
    237   CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    238   fixture = Vector(1.,1.,1.);
    239   CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    240   fixture = Vector(3.5,3.5,3.5);
    241   CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    242   fixture = Vector(2.,2.,2.);
    243   CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    244   fixture = Vector(2.,3.,2.);
    245   CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    246   fixture = Vector(-2.,2.,-1.);
    247   CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );
    248 }
    249 
  • src/unittests/vectorunittest.hpp

    r192f6e r4e10f5  
    2727    CPPUNIT_TEST ( ProjectionTest );
    2828    CPPUNIT_TEST ( NormalsTest );
    29     CPPUNIT_TEST ( IsInParallelepipedTest );
    3029    CPPUNIT_TEST_SUITE_END();
    3130
     
    4544    void LineIntersectionTest();
    4645    void VectorRotationTest();
    47     void IsInParallelepipedTest();
    4846
    4947private:
  • src/vector.cpp

    r192f6e r4e10f5  
    88
    99#include "vector.hpp"
     10#include "VectorContent.hpp"
    1011#include "verbose.hpp"
    1112#include "World.hpp"
    1213#include "Helpers/Assert.hpp"
    1314#include "Helpers/fast_functions.hpp"
     15#include "Exceptions/MathException.hpp"
    1416
    1517#include <iostream>
     18#include <gsl/gsl_blas.h>
     19
    1620
    1721using namespace std;
     
    2428Vector::Vector()
    2529{
    26   content = gsl_vector_calloc (NDIM);
     30  content = new VectorContent();
    2731};
    2832
     
    3337Vector::Vector(const Vector& src)
    3438{
    35   content = gsl_vector_alloc(NDIM);
    36   gsl_vector_set(content,0,src[0]);
    37   gsl_vector_set(content,1,src[1]);
    38   gsl_vector_set(content,2,src[2]);
     39  content = new VectorContent();
     40  gsl_vector_memcpy(content->content, src.content->content);
    3941}
    4042
     
    4345Vector::Vector(const double x1, const double x2, const double x3)
    4446{
    45   content = gsl_vector_alloc(NDIM);
    46   gsl_vector_set(content,0,x1);
    47   gsl_vector_set(content,1,x2);
    48   gsl_vector_set(content,2,x3);
    49 };
     47  content = new VectorContent();
     48  gsl_vector_set(content->content,0,x1);
     49  gsl_vector_set(content->content,1,x2);
     50  gsl_vector_set(content->content,2,x3);
     51};
     52
     53Vector::Vector(VectorContent *_content) :
     54  content(_content)
     55{}
    5056
    5157/**
     
    5561  // check for self assignment
    5662  if(&src!=this){
    57     gsl_vector_set(content,0,src[0]);
    58     gsl_vector_set(content,1,src[1]);
    59     gsl_vector_set(content,2,src[2]);
     63    gsl_vector_memcpy(content->content, src.content->content);
    6064  }
    6165  return *this;
     
    6569 */
    6670Vector::~Vector() {
    67   gsl_vector_free(content);
     71  delete content;
    6872};
    6973
     
    9498}
    9599
    96 /** Calculates distance between this and another vector in a periodic cell.
    97  * \param *y array to second vector
    98  * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell
    99  * \return \f$| x - y |\f$
    100  */
    101 double Vector::PeriodicDistance(const Vector &y, const double * const cell_size) const
    102 {
    103   double res = distance(y), tmp, matrix[NDIM*NDIM];
    104     Vector Shiftedy, TranslationVector;
    105     int N[NDIM];
    106     matrix[0] = cell_size[0];
    107     matrix[1] = cell_size[1];
    108     matrix[2] = cell_size[3];
    109     matrix[3] = cell_size[1];
    110     matrix[4] = cell_size[2];
    111     matrix[5] = cell_size[4];
    112     matrix[6] = cell_size[3];
    113     matrix[7] = cell_size[4];
    114     matrix[8] = cell_size[5];
    115     // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells
    116     for (N[0]=-1;N[0]<=1;N[0]++)
    117       for (N[1]=-1;N[1]<=1;N[1]++)
    118         for (N[2]=-1;N[2]<=1;N[2]++) {
    119           // create the translation vector
    120           TranslationVector.Zero();
    121           for (int i=NDIM;i--;)
    122             TranslationVector[i] = (double)N[i];
    123           TranslationVector.MatrixMultiplication(matrix);
    124           // add onto the original vector to compare with
    125           Shiftedy = y + TranslationVector;
    126           // get distance and compare with minimum so far
    127           tmp = distance(Shiftedy);
    128           if (tmp < res) res = tmp;
    129         }
    130     return (res);
    131 };
    132 
    133 /** Calculates distance between this and another vector in a periodic cell.
    134  * \param *y array to second vector
    135  * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell
    136  * \return \f$| x - y |^2\f$
    137  */
    138 double Vector::PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const
    139 {
    140   double res = DistanceSquared(y), tmp, matrix[NDIM*NDIM];
    141     Vector Shiftedy, TranslationVector;
    142     int N[NDIM];
    143     matrix[0] = cell_size[0];
    144     matrix[1] = cell_size[1];
    145     matrix[2] = cell_size[3];
    146     matrix[3] = cell_size[1];
    147     matrix[4] = cell_size[2];
    148     matrix[5] = cell_size[4];
    149     matrix[6] = cell_size[3];
    150     matrix[7] = cell_size[4];
    151     matrix[8] = cell_size[5];
    152     // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells
    153     for (N[0]=-1;N[0]<=1;N[0]++)
    154       for (N[1]=-1;N[1]<=1;N[1]++)
    155         for (N[2]=-1;N[2]<=1;N[2]++) {
    156           // create the translation vector
    157           TranslationVector.Zero();
    158           for (int i=NDIM;i--;)
    159             TranslationVector[i] = (double)N[i];
    160           TranslationVector.MatrixMultiplication(matrix);
    161           // add onto the original vector to compare with
    162           Shiftedy = y + TranslationVector;
    163           // get distance and compare with minimum so far
    164           tmp = DistanceSquared(Shiftedy);
    165           if (tmp < res) res = tmp;
    166         }
    167     return (res);
    168 };
    169 
    170 /** Keeps the vector in a periodic cell, defined by the symmetric \a *matrix.
    171  * \param *out ofstream for debugging messages
    172  * Tries to translate a vector into each adjacent neighbouring cell.
    173  */
    174 void Vector::KeepPeriodic(const double * const matrix)
    175 {
    176   //  int N[NDIM];
    177   //  bool flag = false;
    178     //vector Shifted, TranslationVector;
    179   //  Log() << Verbose(1) << "Begin of KeepPeriodic." << endl;
    180   //  Log() << Verbose(2) << "Vector is: ";
    181   //  Output(out);
    182   //  Log() << Verbose(0) << endl;
    183     InverseMatrixMultiplication(matrix);
    184     for(int i=NDIM;i--;) { // correct periodically
    185       if (at(i) < 0) {  // get every coefficient into the interval [0,1)
    186         at(i) += ceil(at(i));
    187       } else {
    188         at(i) -= floor(at(i));
    189       }
    190     }
    191     MatrixMultiplication(matrix);
    192   //  Log() << Verbose(2) << "New corrected vector is: ";
    193   //  Output(out);
    194   //  Log() << Verbose(0) << endl;
    195   //  Log() << Verbose(1) << "End of KeepPeriodic." << endl;
    196 };
    197 
    198100/** Calculates scalar product between this and another vector.
    199101 * \param *y array to second vector
     
    203105{
    204106  double res = 0.;
    205   for (int i=NDIM;i--;)
    206     res += at(i)*y[i];
     107  gsl_blas_ddot(content->content, y.content->content, &res);
    207108  return (res);
    208109};
     
    369270double& Vector::operator[](size_t i){
    370271  ASSERT(i<=NDIM && i>=0,"Vector Index out of Range");
    371   return *gsl_vector_ptr (content, i);
     272  return *gsl_vector_ptr (content->content, i);
    372273}
    373274
    374275const double& Vector::operator[](size_t i) const{
    375276  ASSERT(i<=NDIM && i>=0,"Vector Index out of Range");
    376   return *gsl_vector_ptr (content, i);
     277  return *gsl_vector_ptr (content->content, i);
    377278}
    378279
     
    385286}
    386287
    387 gsl_vector* Vector::get(){
     288VectorContent* Vector::get(){
    388289  return content;
    389290}
     
    504405};
    505406
     407void Vector::ScaleAll(const Vector &factor){
     408  gsl_vector_mul(content->content, factor.content->content);
     409}
    506410
    507411
    508412void Vector::Scale(const double factor)
    509413{
    510   for (int i=NDIM;i--;)
    511     at(i) *= factor;
    512 };
    513 
    514 /** Given a box by its matrix \a *M and its inverse *Minv the vector is made to point within that box.
    515  * \param *M matrix of box
    516  * \param *Minv inverse matrix
    517  */
    518 void Vector::WrapPeriodically(const double * const M, const double * const Minv)
    519 {
    520   MatrixMultiplication(Minv);
    521   // truncate to [0,1] for each axis
    522   for (int i=0;i<NDIM;i++) {
    523     //at(i) += 0.5;  // set to center of box
    524     while (at(i) >= 1.)
    525       at(i) -= 1.;
    526     while (at(i) < 0.)
    527       at(i) += 1.;
    528   }
    529   MatrixMultiplication(M);
     414  gsl_vector_scale(content->content,factor);
    530415};
    531416
     
    546431  return make_pair(res,helper);
    547432}
    548 
    549 /** Do a matrix multiplication.
    550  * \param *matrix NDIM_NDIM array
    551  */
    552 void Vector::MatrixMultiplication(const double * const M)
    553 {
    554   Vector tmp;
    555   // do the matrix multiplication
    556   for(int i=NDIM;i--;)
    557     tmp[i] = M[i]*at(0)+M[i+3]*at(1)+M[i+6]*at(2);
    558 
    559   (*this) = tmp;
    560 };
    561 
    562 /** Do a matrix multiplication with the \a *A' inverse.
    563  * \param *matrix NDIM_NDIM array
    564  */
    565 bool Vector::InverseMatrixMultiplication(const double * const A)
    566 {
    567   double B[NDIM*NDIM];
    568   double detA = RDET3(A);
    569   double detAReci;
    570 
    571   // calculate the inverse B
    572   if (fabs(detA) > MYEPSILON) {;  // RDET3(A) yields precisely zero if A irregular
    573     detAReci = 1./detA;
    574     B[0] =  detAReci*RDET2(A[4],A[5],A[7],A[8]);    // A_11
    575     B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]);    // A_12
    576     B[2] =  detAReci*RDET2(A[1],A[2],A[4],A[5]);    // A_13
    577     B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]);    // A_21
    578     B[4] =  detAReci*RDET2(A[0],A[2],A[6],A[8]);    // A_22
    579     B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]);    // A_23
    580     B[6] =  detAReci*RDET2(A[3],A[4],A[6],A[7]);    // A_31
    581     B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]);    // A_32
    582     B[8] =  detAReci*RDET2(A[0],A[1],A[3],A[4]);    // A_33
    583 
    584     MatrixMultiplication(B);
    585 
    586     return true;
    587   } else {
    588     return false;
    589   }
    590 };
    591 
    592433
    593434/** Creates this vector as the b y *factors' components scaled linear combination of the given three.
     
    679520void Vector::AddVector(const Vector &y)
    680521{
    681   for(int i=NDIM;i--;)
    682     at(i) += y[i];
     522  gsl_vector_add(content->content, y.content->content);
    683523}
    684524
     
    688528void Vector::SubtractVector(const Vector &y)
    689529{
    690   for(int i=NDIM;i--;)
    691     at(i) -= y[i];
    692 }
    693 
    694 /**
    695  * Checks whether this vector is within the parallelepiped defined by the given three vectors and
    696  * their offset.
    697  *
    698  * @param offest for the origin of the parallelepiped
    699  * @param three vectors forming the matrix that defines the shape of the parallelpiped
    700  */
    701 bool Vector::IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const
    702 {
    703   Vector a = (*this)-offset;
    704   a.InverseMatrixMultiplication(parallelepiped);
    705   bool isInside = true;
    706 
    707   for (int i=NDIM;i--;)
    708     isInside = isInside && ((a[i] <= 1) && (a[i] >= 0));
    709 
    710   return isInside;
     530  gsl_vector_sub(content->content, y.content->content);
    711531}
    712532
  • src/vector.hpp

    r192f6e r4e10f5  
    1111#endif
    1212
    13 #include <iostream>
    14 #include <gsl/gsl_vector.h>
    15 #include <gsl/gsl_multimin.h>
     13#include <iosfwd>
    1614
    1715#include <memory>
     
    2422
    2523class Vector;
     24class Matrix;
     25struct VectorContent;
    2626
    2727typedef std::vector<Vector> pointset;
     
    3131 */
    3232class Vector : public Space{
     33  friend Vector operator*(const Matrix&,const Vector&);
     34  friend class Matrix;
    3335public:
    34 
    3536  Vector();
    3637  Vector(const double x1, const double x2, const double x3);
     
    4243  double DistanceSquared(const Vector &y) const;
    4344  double DistanceToSpace(const Space& space) const;
    44   double PeriodicDistance(const Vector &y, const double * const cell_size) const;
    45   double PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const;
    4645  double ScalarProduct(const Vector &y) const;
    4746  double Angle(const Vector &y) const;
     
    5857  Vector Projection(const Vector &y) const;
    5958  void ScaleAll(const double *factor);
     59  void ScaleAll(const Vector &factor);
    6060  void Scale(const double factor);
    61   void MatrixMultiplication(const double * const M);
    62   bool InverseMatrixMultiplication(const double * const M);
    63   void KeepPeriodic(const double * const matrix);
    6461  bool GetOneNormalVector(const Vector &x1);
    6562  bool MakeNormalTo(const Vector &y1);
    66   bool IsInParallelepiped(const Vector &offset, const double * const parallelepiped) const;
    67   void WrapPeriodically(const double * const M, const double * const Minv);
    6863  std::pair<Vector,Vector> partition(const Vector&) const;
    6964  std::pair<pointset,Vector> partition(const pointset&) const;
     
    7974
    8075  // Access to internal structure
    81   gsl_vector* get();
     76  VectorContent* get();
    8277
    8378  // Methods that are derived directly from other methods
     
    10499
    105100private:
    106   gsl_vector *content;
     101  Vector(VectorContent *);
     102  VectorContent *content;
    107103
    108104};
  • src/vector_ops.cpp

    r192f6e r4e10f5  
    2323#include <gsl/gsl_permutation.h>
    2424#include <gsl/gsl_vector.h>
     25#include <gsl/gsl_multimin.h>
    2526
    2627/**
  • src/verbose.cpp

    r192f6e r4e10f5  
    55#include "info.hpp"
    66#include "verbose.hpp"
     7#include <iostream>
    78
    89/** Prints the tabs according to verbosity stored in the temporary constructed class.
  • src/verbose.hpp

    r192f6e r4e10f5  
    1818#endif
    1919
    20 #include <iostream>
     20#include <iosfwd>
    2121
    2222/************************************* Class Verbose & Binary *******************************/
  • tests/regression/Domain/4/post/test.conf

    r192f6e r4e10f5  
    4747BoxLength                       # (Length of a unit cell)
    48481       
    49 0       0       
     490       1       
    50500       0       2       
    5151
Note: See TracChangeset for help on using the changeset viewer.