Changes in / [ba9f5b:be97a8]


Ignore:
Files:
29 added
5 deleted
124 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/ActionRegistry.hpp

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    1111#include "Actions/AtomsCalculation.hpp"
    1212#include "Actions/Calculation_impl.hpp"
    13 
    14 #include <iostream>
    1513
    1614using namespace std;
     
    3533  Process::setMaxSteps(steps);
    3634  Process::start();
    37   for(World::AtomIterator iter=world->getAtomIter(descr);iter!=world->atomEnd();++iter){
     35  for(World::internal_AtomIterator
     36      iter=world->getAtomIter_internal(descr);
     37      iter!=world->atomEnd_internal();
     38      ++iter){
     39
    3840    Process::setCurrStep(iter.getCount());
    3941    res->push_back(op(*iter));
  • src/Actions/ManipulateAtomsProcess.cpp

    rba9f5b rbe97a8  
    5353  setMaxSteps(world->numAtoms());
    5454  start();
    55   for(World::AtomIterator iter=world->getAtomIter(descr);iter!=world->atomEnd();++iter){
     55  for(World::internal_AtomIterator
     56      iter=world->getAtomIter_internal(descr);
     57      iter!=world->atomEnd_internal();
     58      ++iter){
     59
    5660    setCurrStep(iter.getCount());
    5761    operation(*iter);
  • src/Actions/MapOfActions.cpp

    rba9f5b rbe97a8  
    1717#include <boost/optional.hpp>
    1818#include <boost/program_options.hpp>
     19
     20#include <iostream>
    1921
    2022#include "CommandLineParser.hpp"
     
    321323  TypeMap["MaxDistance"] = Double;
    322324  TypeMap["molecule-by-id"] = Molecule;
    323   TypeMap["molecule-by-name"] = Molecule;
     325  TypeMap["molecule-by-name"] = String;
    324326  TypeMap["nonconvex-file"] = String;
    325327  TypeMap["order"] = Integer;
  • src/Actions/MoleculeAction/BondFileAction.cpp

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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);
     43    World::getInstance().setDomain(cell_size.getM());
    4244    delete dialog;
    4345    return Action::success;
  • src/Actions/WorldAction/RemoveSphereOfAtomsAction.cpp

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    1717#endif
    1818
    19 #include <iostream>
     19#include <iosfwd>
    2020
    2121/****************************************** forward declarations *****************************/
  • src/Descriptors/AtomDescriptor.cpp

    rba9f5b rbe97a8  
    1313#include "World.hpp"
    1414#include "atom.hpp"
     15#include "Patterns/ObservedContainer_impl.hpp"
    1516
    1617#include <boost/bind.hpp>
     
    2021using namespace std;
    2122
    22 typedef World::AtomSet::iterator atoms_iter_t;
     23typedef World::AtomSet::internal_iterator atoms_iter_t;
    2324
    2425/************************ Forwarding object **************************************/
     
    7374
    7475atom* AtomDescriptor_impl::find() {
    75   World::AtomSet atoms = getAtoms();
    76   atoms_iter_t res = find_if(atoms.begin(),atoms.end(),boost::bind(&AtomDescriptor_impl::predicate,this,_1));
    77   return (res!=atoms.end())?((*res).second):0;
     76  World::AtomSet &atoms = getAtoms();
     77  atoms_iter_t res = find_if(atoms.begin_internal(),atoms.end_internal(),boost::bind(&AtomDescriptor_impl::predicate,this,_1));
     78  return (res!=atoms.end_internal())?((*res).second):0;
    7879}
    7980
     
    8182  vector<atom*> res;
    8283  World::AtomSet atoms = getAtoms();
    83   atoms_iter_t iter;
    84   for(iter=atoms.begin();iter!=atoms.end();++iter) {
    85     if(predicate(*iter)){
    86       res.push_back((*iter).second);
    87     }
     84  for_each(atoms.begin_internal(),
     85           atoms.end_internal(),
     86           boost::bind(&AtomDescriptor_impl::checkAndAdd,
     87                       this,&res,_1));
     88  return res;
     89}
     90
     91void AtomDescriptor_impl::checkAndAdd(std::vector<atom*> *v,std::pair<atomId_t,atom*> p){
     92  if(predicate(p)){
     93    v->push_back(p.second);
    8894  }
    89   return res;
    9095}
    9196
  • src/Descriptors/AtomDescriptor_impl.hpp

    rba9f5b rbe97a8  
    5050   */
    5151  World::AtomSet& getAtoms();
     52
     53  void checkAndAdd(std::vector<atom*>*,std::pair<atomId_t,atom*>);
    5254};
    5355
  • src/Descriptors/AtomIdDescriptor.cpp

    rba9f5b rbe97a8  
    1212
    1313#include "atom.hpp"
     14#include "Patterns/ObservedContainer_impl.hpp"
    1415
    1516using namespace std;
     
    3233
    3334atom *AtomIdDescriptor_impl::find(){
    34   World::AtomSet atoms = getAtoms();
     35  World::AtomSet &atoms = getAtoms();
    3536  World::AtomSet::iterator res = atoms.find(id);
    3637  return (res!=atoms.end())?((*res).second):0;
  • src/Descriptors/MoleculeDescriptor.cpp

    rba9f5b rbe97a8  
    1212
    1313#include "World.hpp"
     14#include "Patterns/ObservedContainer_impl.hpp"
    1415
    1516#include "molecule.hpp"
     
    2021using namespace std;
    2122
    22 typedef World::MoleculeSet::iterator molecules_iter_t;
     23typedef World::MoleculeSet::internal_iterator molecules_iter_t;
    2324
    2425/************************ Forwarding object **************************************/
     
    7374
    7475molecule* MoleculeDescriptor_impl::find() {
    75   World::MoleculeSet molecules = getMolecules();
    76   molecules_iter_t res = find_if(molecules.begin(),molecules.end(),boost::bind(&MoleculeDescriptor_impl::predicate,this,_1));
    77   return (res!=molecules.end())?((*res).second):0;
     76  World::MoleculeSet &molecules = getMolecules();
     77  molecules_iter_t res = find_if(molecules.begin_internal(),molecules.end_internal(),boost::bind(&MoleculeDescriptor_impl::predicate,this,_1));
     78  return (res!=molecules.end_internal())?((*res).second):0;
    7879}
    7980
    8081vector<molecule*> MoleculeDescriptor_impl::findAll() {
    8182  vector<molecule*> res;
    82   World::MoleculeSet molecules = getMolecules();
    83   molecules_iter_t iter;
    84   for(iter=molecules.begin();iter!=molecules.end();++iter) {
    85     if(predicate(*iter)){
    86       res.push_back((*iter).second);
    87     }
     83  World::MoleculeSet &molecules = getMolecules();
     84  for_each(molecules.begin_internal(),
     85           molecules.end_internal(),
     86           boost::bind(&MoleculeDescriptor_impl::checkAndAdd,
     87                       this,&res,_1));
     88  return res;
     89}
     90
     91void MoleculeDescriptor_impl::checkAndAdd(std::vector<molecule*> *v,std::pair<moleculeId_t,molecule*> p){
     92  if(predicate(p)){
     93    v->push_back(p.second);
    8894  }
    89   return res;
    9095}
    9196
  • src/Descriptors/MoleculeDescriptor_impl.hpp

    rba9f5b rbe97a8  
    5050   */
    5151  World::MoleculeSet& getMolecules();
     52
     53  void checkAndAdd(std::vector<molecule*>*,std::pair<moleculeId_t,molecule*>);
    5254};
    5355
  • src/Descriptors/MoleculeIdDescriptor.cpp

    rba9f5b rbe97a8  
    1010#include "MoleculeIdDescriptor.hpp"
    1111#include "MoleculeIdDescriptor_impl.hpp"
     12
     13#include "Patterns/ObservedContainer_impl.hpp"
    1214
    1315#include "molecule.hpp"
     
    3234
    3335molecule *MoleculeIdDescriptor_impl::find(){
    34   World::MoleculeSet molecules = getMolecules();
     36  World::MoleculeSet &molecules = getMolecules();
    3537  World::MoleculeSet::iterator res = molecules.find(id);
    3638  return (res!=molecules.end())?((*res).second):0;
  • src/Exceptions/CustomException.cpp

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

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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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 \
     
    120144DESCRIPTORSOURCE = Descriptors/AtomDescriptor.cpp \
    121145  Descriptors/AtomIdDescriptor.cpp \
     146  Descriptors/AtomSelectionDescriptor.cpp \
    122147  Descriptors/AtomTypeDescriptor.cpp \
    123148  Descriptors/MoleculeDescriptor.cpp \
    124149  Descriptors/MoleculeIdDescriptor.cpp \
    125150  Descriptors/MoleculeNameDescriptor.cpp \
    126   Descriptors/MoleculePtrDescriptor.cpp
     151  Descriptors/MoleculePtrDescriptor.cpp \
     152  Descriptors/MoleculeSelectionDescriptor.cpp
    127153                                   
    128154
    129155DESCRIPTORHEADER = Descriptors/AtomDescriptor.hpp \
    130156  Descriptors/AtomIdDescriptor.hpp \
     157  Descriptors/AtomSelectionDescriptor.hpp \
    131158  Descriptors/AtomTypeDescriptor.hpp \
    132159  Descriptors/MoleculeDescriptor.hpp \
    133160  Descriptors/MoleculeIdDescriptor.hpp \
    134161  Descriptors/MoleculeNameDescriptor.hpp \
    135   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
     162  Descriptors/MoleculePtrDescriptor.hpp \
     163  Descriptors/MoleculeSelectionDescriptor.cpp
    148164                                 
    149165QTUISOURCE = ${QTUIMOC_TARGETS} \
     
    165181  ${ACTIONSSOURCE} \
    166182  ${ATOMSOURCE} \
     183  ${EXCEPTIONSOURCE} \
    167184  ${PATTERNSOURCE} \
    168185  ${PARSERSOURCE} \
     186  ${SHAPESOURCE} \
    169187  ${DESCRIPTORSOURCE} \
    170188  ${HELPERSOURCE} \
    171   ${EXCEPTIONSOURCE} \
    172189  bond.cpp \
    173190  bondgraph.cpp \
    174191  boundary.cpp \
     192  Box.cpp \
    175193  CommandLineParser.cpp \
    176194  config.cpp \
     
    188206  log.cpp \
    189207  logger.cpp \
     208  Matrix.cpp \
    190209  moleculelist.cpp \
    191210  molecule.cpp \
     
    212231  ${ACTIONSHEADER} \
    213232  ${ATOMHEADER} \
     233  ${EXCEPTIONHEADER} \
    214234  ${PARSERHEADER} \
    215235  ${PATTERNHEADER} \
     236  ${SHAPEHEADER} \
    216237  ${DESCRIPTORHEADER} \
    217   ${EXCEPTIONHEADER} \
    218238  bond.hpp \
    219239  bondgraph.hpp \
    220240  boundary.hpp \
     241  Box.hpp \
    221242  CommandLineParser.hpp \
    222243  config.hpp \
     
    236257  log.hpp \
    237258  logger.hpp \
     259  Matrix.hpp \
    238260  molecule.hpp \
    239261  molecule_template.hpp \
  • src/Parser/MpqcParser.hpp

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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    1212#include <boost/function.hpp>
    1313#include <boost/shared_ptr.hpp>
    14 #include <iostream>
    1514
    1615#include "Helpers/Assert.hpp"
  • src/Patterns/ObservedIterator.hpp

    rba9f5b rbe97a8  
    108108  }
    109109
     110  value_type *operator->(){
     111    acquireLock();
     112    return &(*iter);
     113  }
     114
    110115  // when we turn into a const iterator we can loose our lock
    111116  operator typename _Set::const_iterator() {
  • src/Patterns/Observer.hpp

    rba9f5b rbe97a8  
    170170  //! @cond
    171171  // Structure for RAII-Style notification
    172 protected:
     172public:
    173173  /**
    174174   * This structure implements the Observer-mechanism RAII-Idiom.
     
    241241#define OBSERVE Observable::_Observable_protector PASTE(_scope_obs_protector_,__LINE__)(this)
    242242#define NOTIFY(notification) do{Observable::enque_notification_internal(this,notification);}while(0)
     243#define LOCK_OBSERVABLE(observable) Observable::_Observable_protector PASTE(_scope_obs_protector_,__LINE__)(&(observable))
    243244
    244245#endif /* OBSERVER_HPP_ */
  • src/Plane.hpp

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    99
    1010#include "World.hpp"
     11
     12#include <functional>
    1113
    1214#include "atom.hpp"
     
    2224#include "Actions/ManipulateAtomsProcess.hpp"
    2325#include "Helpers/Assert.hpp"
     26#include "Box.hpp"
     27#include "Matrix.hpp"
     28#include "defs.hpp"
    2429
    2530#include "Patterns/Singleton_impl.hpp"
     31#include "Patterns/ObservedContainer_impl.hpp"
    2632
    2733using namespace std;
     
    7480// system
    7581
    76 double * World::getDomain() {
    77   return cell_size;
     82Box& World::getDomain() {
     83  return *cell_size;
     84}
     85
     86void World::setDomain(const Matrix &mat){
     87  OBSERVE;
     88  *cell_size = mat;
    7889}
    7990
     
    8192{
    8293  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];
     94  Matrix M = ReturnFullMatrixforSymmetric(matrix);
     95  cell_size->setM(M);
    8996}
    9097
     
    95102void World::setDefaultName(std::string name)
    96103{
     104  OBSERVE;
    97105  defaultName = name;
    98106};
     
    119127  molecule *mol = NULL;
    120128  mol = NewMolecule();
    121   ASSERT(!molecules.count(currMoleculeId),"currMoleculeId did not specify an unused ID");
    122   mol->setId(currMoleculeId++);
     129  moleculeId_t id = getNextMoleculeId();
     130  ASSERT(!molecules.count(id),"proposed id did not specify an unused ID");
     131  mol->setId(id);
    123132  // store the molecule by ID
    124133  molecules[mol->getId()] = mol;
     
    138147  DeleteMolecule(mol);
    139148  molecules.erase(id);
    140 }
    141 
    142 double *World::cell_size = NULL;
     149  releaseMoleculeId(id);
     150}
    143151
    144152atom *World::createAtom(){
    145153  OBSERVE;
    146154  atomId_t id = getNextAtomId();
     155  ASSERT(!atoms.count(id),"proposed id did not specify an unused ID");
    147156  atom *res = NewAtom(id);
    148157  res->setWorld(this);
     
    221230
    222231atomId_t World::getNextAtomId(){
    223   // see if we can reuse some Id
    224   if(atomIdPool.empty()){
    225     return currAtomId++;
    226   }
    227   else{
    228     // we give out the first ID from the pool
    229     atomId_t id = *(atomIdPool.begin());
    230     atomIdPool.erase(id);
     232  // try to find an Id in the pool;
     233  if(!atomIdPool.empty()){
     234    atomIdPool_t::iterator iter=atomIdPool.begin();
     235    atomId_t id = iter->first;
     236    pair<atomId_t,atomId_t> newRange = make_pair(id+1,iter->second);
     237    // we wont use this iterator anymore, so we don't care about invalidating
     238    atomIdPool.erase(iter);
     239    if(newRange.first<newRange.second){
     240      atomIdPool.insert(newRange);
     241    }
    231242    return id;
    232243  }
     244  // Nothing in the pool... we are out of luck
     245  return currAtomId++;
    233246}
    234247
    235248void World::releaseAtomId(atomId_t id){
    236   atomIdPool.insert(id);
    237   // defragmentation of the pool
    238   set<atomId_t>::reverse_iterator iter;
    239   // go through all Ids in the pool that lie immediately below the border
    240   while(!atomIdPool.empty() && *(atomIdPool.rbegin())==(currAtomId-1)){
    241     atomIdPool.erase(--currAtomId);
    242   }
     249  atomIdPool.insert(make_pair(id,id+1));
     250  defragAtomIdPool();
    243251}
    244252
    245253bool World::reserveAtomId(atomId_t id){
    246254  if(id>=currAtomId ){
    247     // add all ids between the new one and current border as available
    248     for(atomId_t pos=currAtomId; pos<id; ++pos){
    249       atomIdPool.insert(pos);
     255    pair<atomId_t,atomId_t> newRange = make_pair(currAtomId,id);
     256    if(newRange.first<newRange.second){
     257      atomIdPool.insert(newRange);
    250258    }
    251259    currAtomId=id+1;
     260    defragAtomIdPool();
    252261    return true;
    253262  }
    254   else if(atomIdPool.count(id)){
    255     atomIdPool.erase(id);
     263  // look for a range that matches the request
     264  for(atomIdPool_t::iterator iter=atomIdPool.begin();iter!=atomIdPool.end();++iter){
     265    if(iter->first>id){
     266      // we have coverd all available ranges... nothing to be found here
     267      break;
     268    }
     269    // no need to check first, since it has to be <=id, since otherwise we would have broken out
     270    if(iter->second > id){
     271      // we found a matching range... get the id from this range
     272
     273      // split up this range at the point of id
     274      pair<atomId_t,atomId_t> bottomRange = make_pair(iter->first,id);
     275      pair<atomId_t,atomId_t> topRange = make_pair(id+1,iter->second);
     276      // remove this range
     277      atomIdPool.erase(iter);
     278      if(bottomRange.first<bottomRange.second){
     279        atomIdPool.insert(bottomRange);
     280      }
     281      if(topRange.first<topRange.second){
     282        atomIdPool.insert(topRange);
     283      }
     284      defragAtomIdPool();
     285      return true;
     286    }
     287  }
     288  // this ID could not be reserved
     289  return false;
     290}
     291
     292void World::defragAtomIdPool(){
     293  // check if the situation is bad enough to make defragging neccessary
     294  if((numAtomDefragSkips<MAX_FRAGMENTATION_SKIPS) &&
     295     (atomIdPool.size()<lastAtomPoolSize+MAX_POOL_FRAGMENTATION)){
     296    ++numAtomDefragSkips;
     297    return;
     298  }
     299  for(atomIdPool_t::iterator iter = atomIdPool.begin();iter!=atomIdPool.end();){
     300    // see if this range is adjacent to the next one
     301    atomIdPool_t::iterator next = iter;
     302    next++;
     303    if(next!=atomIdPool.end() && (next->first==iter->second)){
     304      // merge the two ranges
     305      pair<atomId_t,atomId_t> newRange = make_pair(iter->first,next->second);
     306      atomIdPool.erase(iter);
     307      atomIdPool.erase(next);
     308      pair<atomIdPool_t::iterator,bool> res = atomIdPool.insert(newRange);
     309      ASSERT(res.second,"Id-Pool was confused");
     310      iter=res.first;
     311      continue;
     312    }
     313    ++iter;
     314  }
     315  if(!atomIdPool.empty()){
     316    // check if the last range is at the border
     317    atomIdPool_t::iterator iter = atomIdPool.end();
     318    iter--;
     319    if(iter->second==currAtomId){
     320      currAtomId=iter->first;
     321      atomIdPool.erase(iter);
     322    }
     323  }
     324  lastAtomPoolSize=atomIdPool.size();
     325  numAtomDefragSkips=0;
     326}
     327
     328// Molecules
     329
     330moleculeId_t World::getNextMoleculeId(){
     331  // try to find an Id in the pool;
     332  if(!moleculeIdPool.empty()){
     333    moleculeIdPool_t::iterator iter=moleculeIdPool.begin();
     334    moleculeId_t id = iter->first;
     335    pair<moleculeId_t,moleculeId_t> newRange = make_pair(id+1,iter->second);
     336    // we wont use this iterator anymore, so we don't care about invalidating
     337    moleculeIdPool.erase(iter);
     338    if(newRange.first<newRange.second){
     339      moleculeIdPool.insert(newRange);
     340    }
     341    return id;
     342  }
     343  // Nothing in the pool... we are out of luck
     344  return currMoleculeId++;
     345}
     346
     347void World::releaseMoleculeId(moleculeId_t id){
     348  moleculeIdPool.insert(make_pair(id,id+1));
     349  defragMoleculeIdPool();
     350}
     351
     352bool World::reserveMoleculeId(moleculeId_t id){
     353  if(id>=currMoleculeId ){
     354    pair<moleculeId_t,moleculeId_t> newRange = make_pair(currMoleculeId,id);
     355    if(newRange.first<newRange.second){
     356      moleculeIdPool.insert(newRange);
     357    }
     358    currMoleculeId=id+1;
     359    defragMoleculeIdPool();
    256360    return true;
    257361  }
    258   else{
    259     // this ID could not be reserved
    260     return false;
    261   }
     362  // look for a range that matches the request
     363  for(moleculeIdPool_t::iterator iter=moleculeIdPool.begin();iter!=moleculeIdPool.end();++iter){
     364    if(iter->first>id){
     365      // we have coverd all available ranges... nothing to be found here
     366      break;
     367    }
     368    // no need to check first, since it has to be <=id, since otherwise we would have broken out
     369    if(iter->second > id){
     370      // we found a matching range... get the id from this range
     371
     372      // split up this range at the point of id
     373      pair<moleculeId_t,moleculeId_t> bottomRange = make_pair(iter->first,id);
     374      pair<moleculeId_t,moleculeId_t> topRange = make_pair(id+1,iter->second);
     375      // remove this range
     376      moleculeIdPool.erase(iter);
     377      if(bottomRange.first<bottomRange.second){
     378        moleculeIdPool.insert(bottomRange);
     379      }
     380      if(topRange.first<topRange.second){
     381        moleculeIdPool.insert(topRange);
     382      }
     383      defragMoleculeIdPool();
     384      return true;
     385    }
     386  }
     387  // this ID could not be reserved
     388  return false;
     389}
     390
     391void World::defragMoleculeIdPool(){
     392  // check if the situation is bad enough to make defragging neccessary
     393  if((numMoleculeDefragSkips<MAX_FRAGMENTATION_SKIPS) &&
     394     (moleculeIdPool.size()<lastMoleculePoolSize+MAX_POOL_FRAGMENTATION)){
     395    ++numMoleculeDefragSkips;
     396    return;
     397  }
     398  for(moleculeIdPool_t::iterator iter = moleculeIdPool.begin();iter!=moleculeIdPool.end();){
     399    // see if this range is adjacent to the next one
     400    moleculeIdPool_t::iterator next = iter;
     401    next++;
     402    if(next!=moleculeIdPool.end() && (next->first==iter->second)){
     403      // merge the two ranges
     404      pair<moleculeId_t,moleculeId_t> newRange = make_pair(iter->first,next->second);
     405      moleculeIdPool.erase(iter);
     406      moleculeIdPool.erase(next);
     407      pair<moleculeIdPool_t::iterator,bool> res = moleculeIdPool.insert(newRange);
     408      ASSERT(res.second,"Id-Pool was confused");
     409      iter=res.first;
     410      continue;
     411    }
     412    ++iter;
     413  }
     414  if(!moleculeIdPool.empty()){
     415    // check if the last range is at the border
     416    moleculeIdPool_t::iterator iter = moleculeIdPool.end();
     417    iter--;
     418    if(iter->second==currMoleculeId){
     419      currMoleculeId=iter->first;
     420      moleculeIdPool.erase(iter);
     421    }
     422  }
     423  lastMoleculePoolSize=moleculeIdPool.size();
     424  numMoleculeDefragSkips=0;
     425}
     426
     427/******************************* Iterators ********************************/
     428
     429// external parts with observers
     430
     431CONSTRUCT_SELECTIVE_ITERATOR(atom*,World::AtomSet,AtomDescriptor);
     432
     433World::AtomIterator
     434World::getAtomIter(AtomDescriptor descr){
     435    return AtomIterator(descr,atoms);
     436}
     437
     438World::AtomIterator
     439World::getAtomIter(){
     440    return AtomIterator(AllAtoms(),atoms);
     441}
     442
     443World::AtomIterator
     444World::atomEnd(){
     445  return AtomIterator(AllAtoms(),atoms,atoms.end());
     446}
     447
     448CONSTRUCT_SELECTIVE_ITERATOR(molecule*,World::MoleculeSet,MoleculeDescriptor);
     449
     450World::MoleculeIterator
     451World::getMoleculeIter(MoleculeDescriptor descr){
     452    return MoleculeIterator(descr,molecules);
     453}
     454
     455World::MoleculeIterator
     456World::getMoleculeIter(){
     457    return MoleculeIterator(AllMolecules(),molecules);
     458}
     459
     460World::MoleculeIterator
     461World::moleculeEnd(){
     462  return MoleculeIterator(AllMolecules(),molecules,molecules.end());
     463}
     464
     465// Internal parts, without observers
     466
     467// Build the AtomIterator from template
     468CONSTRUCT_SELECTIVE_ITERATOR(atom*,World::AtomSet::set_t,AtomDescriptor);
     469
     470
     471World::internal_AtomIterator
     472World::getAtomIter_internal(AtomDescriptor descr){
     473  return internal_AtomIterator(descr,atoms.getContent());
     474}
     475
     476World::internal_AtomIterator
     477World::atomEnd_internal(){
     478  return internal_AtomIterator(AllAtoms(),atoms.getContent(),atoms.end_internal());
     479}
     480
     481// build the MoleculeIterator from template
     482CONSTRUCT_SELECTIVE_ITERATOR(molecule*,World::MoleculeSet::set_t,MoleculeDescriptor);
     483
     484World::internal_MoleculeIterator World::getMoleculeIter_internal(MoleculeDescriptor descr){
     485  return internal_MoleculeIterator(descr,molecules.getContent());
     486}
     487
     488World::internal_MoleculeIterator World::moleculeEnd_internal(){
     489  return internal_MoleculeIterator(AllMolecules(),molecules.getContent(),molecules.end_internal());
     490}
     491
     492/************************** Selection of Atoms and molecules ******************/
     493
     494// Atoms
     495
     496void World::clearAtomSelection(){
     497  selectedAtoms.clear();
     498}
     499
     500void World::selectAtom(atom *atom){
     501  ASSERT(atom,"Invalid pointer in selection of atom");
     502  selectedAtoms[atom->getId()]=atom;
     503}
     504
     505void World::selectAtom(atomId_t id){
     506  ASSERT(atoms.count(id),"Atom Id selected that was not in the world");
     507  selectedAtoms[id]=atoms[id];
     508}
     509
     510void World::selectAllAtoms(AtomDescriptor descr){
     511  internal_AtomIterator begin = getAtomIter_internal(descr);
     512  internal_AtomIterator end = atomEnd_internal();
     513  void (World::*func)(atom*) = &World::selectAtom; // needed for type resolution of overloaded function
     514  for_each(begin,end,bind1st(mem_fun(func),this)); // func is select... see above
     515}
     516
     517void World::selectAtomsOfMolecule(molecule *_mol){
     518  ASSERT(_mol,"Invalid pointer to molecule in selection of Atoms of Molecule");
     519  // need to make it const to get the fast iterators
     520  const molecule *mol = _mol;
     521  void (World::*func)(atom*) = &World::selectAtom; // needed for type resolution of overloaded function
     522  for_each(mol->begin(),mol->end(),bind1st(mem_fun(func),this)); // func is select... see above
     523}
     524
     525void World::selectAtomsOfMolecule(moleculeId_t id){
     526  ASSERT(molecules.count(id),"No molecule with the given id upon Selection of atoms from molecule");
     527  selectAtomsOfMolecule(molecules[id]);
     528}
     529
     530void World::unselectAtom(atom *atom){
     531  ASSERT(atom,"Invalid pointer in unselection of atom");
     532  unselectAtom(atom->getId());
     533}
     534
     535void World::unselectAtom(atomId_t id){
     536  ASSERT(atoms.count(id),"Atom Id unselected that was not in the world");
     537  selectedAtoms.erase(id);
     538}
     539
     540void World::unselectAllAtoms(AtomDescriptor descr){
     541  internal_AtomIterator begin = getAtomIter_internal(descr);
     542  internal_AtomIterator end = atomEnd_internal();
     543  void (World::*func)(atom*) = &World::unselectAtom; // needed for type resolution of overloaded function
     544  for_each(begin,end,bind1st(mem_fun(func),this)); // func is unselect... see above
     545}
     546
     547void World::unselectAtomsOfMolecule(molecule *_mol){
     548  ASSERT(_mol,"Invalid pointer to molecule in selection of Atoms of Molecule");
     549  // need to make it const to get the fast iterators
     550  const molecule *mol = _mol;
     551  void (World::*func)(atom*) = &World::unselectAtom; // needed for type resolution of overloaded function
     552  for_each(mol->begin(),mol->end(),bind1st(mem_fun(func),this)); // func is unsselect... see above
     553}
     554
     555void World::unselectAtomsOfMolecule(moleculeId_t id){
     556  ASSERT(molecules.count(id),"No molecule with the given id upon Selection of atoms from molecule");
     557  unselectAtomsOfMolecule(molecules[id]);
    262558}
    263559
    264560// Molecules
    265561
    266 /******************************* Iterators ********************************/
    267 
    268 // Build the AtomIterator from template
    269 CONSTRUCT_SELECTIVE_ITERATOR(atom*,World::AtomSet,AtomDescriptor);
    270 
    271 
    272 World::AtomIterator World::getAtomIter(AtomDescriptor descr){
    273   return AtomIterator(descr,atoms);
    274 }
    275 
    276 World::AtomIterator World::atomEnd(){
    277   return AtomIterator(AllAtoms(),atoms,atoms.end());
    278 }
    279 
    280 // build the MoleculeIterator from template
    281 CONSTRUCT_SELECTIVE_ITERATOR(molecule*,World::MoleculeSet,MoleculeDescriptor);
    282 
    283 World::MoleculeIterator World::getMoleculeIter(MoleculeDescriptor descr){
    284   return MoleculeIterator(descr,molecules);
    285 }
    286 
    287 World::MoleculeIterator World::moleculeEnd(){
    288   return MoleculeIterator(AllMolecules(),molecules,molecules.end());
     562void World::clearMoleculeSelection(){
     563  selectedMolecules.clear();
     564}
     565
     566void World::selectMolecule(molecule *mol){
     567  ASSERT(mol,"Invalid pointer to molecule in selection");
     568  selectedMolecules[mol->getId()]=mol;
     569}
     570
     571void World::selectMolecule(moleculeId_t id){
     572  ASSERT(molecules.count(id),"Molecule Id selected that was not in the world");
     573  selectedMolecules[id]=molecules[id];
     574}
     575
     576void World::selectAllMoleculess(MoleculeDescriptor descr){
     577  internal_MoleculeIterator begin = getMoleculeIter_internal(descr);
     578  internal_MoleculeIterator end = moleculeEnd_internal();
     579  void (World::*func)(molecule*) = &World::selectMolecule; // needed for type resolution of overloaded function
     580  for_each(begin,end,bind1st(mem_fun(func),this)); // func is select... see above
     581}
     582
     583void World::selectMoleculeOfAtom(atom *atom){
     584  ASSERT(atom,"Invalid atom pointer in selection of MoleculeOfAtom");
     585  molecule *mol=atom->getMolecule();
     586  // the atom might not be part of a molecule
     587  if(mol){
     588    selectMolecule(mol);
     589  }
     590}
     591
     592void World::selectMoleculeOfAtom(atomId_t id){
     593  ASSERT(atoms.count(id),"No such atom with given ID in selection of Molecules of Atom");\
     594  selectMoleculeOfAtom(atoms[id]);
     595}
     596
     597void World::unselectMolecule(molecule *mol){
     598  ASSERT(mol,"invalid pointer in unselection of molecule");
     599  unselectMolecule(mol->getId());
     600}
     601
     602void World::unselectMolecule(moleculeId_t id){
     603  ASSERT(molecules.count(id),"No such molecule with ID in unselection");
     604  selectedMolecules.erase(id);
     605}
     606
     607void World::unselectAllMoleculess(MoleculeDescriptor descr){
     608  internal_MoleculeIterator begin = getMoleculeIter_internal(descr);
     609  internal_MoleculeIterator end = moleculeEnd_internal();
     610  void (World::*func)(molecule*) = &World::unselectMolecule; // needed for type resolution of overloaded function
     611  for_each(begin,end,bind1st(mem_fun(func),this)); // func is unselect... see above
     612}
     613
     614void World::unselectMoleculeOfAtom(atom *atom){
     615  ASSERT(atom,"Invalid atom pointer in selection of MoleculeOfAtom");
     616  molecule *mol=atom->getMolecule();
     617  // the atom might not be part of a molecule
     618  if(mol){
     619    unselectMolecule(mol);
     620  }
     621}
     622
     623void World::unselectMoleculeOfAtom(atomId_t id){
     624  ASSERT(atoms.count(id),"No such atom with given ID in selection of Molecules of Atom");\
     625  unselectMoleculeOfAtom(atoms[id]);
     626}
     627
     628/******************* Iterators over Selection *****************************/
     629World::AtomSelectionIterator World::beginAtomSelection(){
     630  return selectedAtoms.begin();
     631}
     632
     633World::AtomSelectionIterator World::endAtomSelection(){
     634  return selectedAtoms.end();
     635}
     636
     637
     638World::MoleculeSelectionIterator World::beginMoleculeSelection(){
     639  return selectedMolecules.begin();
     640}
     641
     642World::MoleculeSelectionIterator World::endMoleculeSelection(){
     643  return selectedMolecules.end();
    289644}
    290645
     
    297652    Thermostats(new ThermoStatContainer),
    298653    ExitFlag(0),
    299     atoms(),
     654    atoms(this),
     655    selectedAtoms(this),
    300656    currAtomId(0),
    301     molecules(),
     657    lastAtomPoolSize(0),
     658    numAtomDefragSkips(0),
     659    molecules(this),
     660    selectedMolecules(this),
    302661    currMoleculeId(0),
    303662    molecules_deprecated(new MoleculeListClass(this))
    304663{
    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.;
     664  cell_size = new Box;
     665  Matrix domain;
     666  domain.at(0,0) = 20;
     667  domain.at(1,1) = 20;
     668  domain.at(2,2) = 20;
     669  cell_size->setM(domain);
    312670  defaultName = "none";
    313671  molecules_deprecated->signOn(this);
     
    317675{
    318676  molecules_deprecated->signOff(this);
    319   delete[] cell_size;
     677  delete cell_size;
    320678  delete molecules_deprecated;
    321679  delete periode;
  • src/World.hpp

    rba9f5b rbe97a8  
    2323#include "Patterns/Cacheable.hpp"
    2424#include "Patterns/Singleton.hpp"
     25#include "Patterns/ObservedContainer.hpp"
    2526
    2627// include config.h
     
    3435class AtomDescriptor_impl;
    3536template<typename T> class AtomsCalculation;
     37class Box;
    3638class config;
    3739class ManipulateAtomsProcess;
     40class Matrix;
    3841class molecule;
    3942class MoleculeDescriptor;
     
    4346class ThermoStatContainer;
    4447
     48
    4549/****************************************** forward declarations *****************************/
    4650
     
    5862friend class MoleculeDescriptor_impl;
    5963friend class MoleculeDescriptor;
     64// coupling with descriptors over selection
     65friend class AtomSelectionDescriptor_impl;
     66friend class MoleculeSelectionDescriptor_impl;
    6067
    6168// Actions, calculations etc associated with the World
     
    6572
    6673  // Types for Atom and Molecule structures
    67   typedef std::map<atomId_t,atom*> AtomSet;
    68   typedef std::map<moleculeId_t,molecule*> MoleculeSet;
     74  typedef ObservedContainer<std::map<atomId_t,atom*> > AtomSet;
     75  typedef ObservedContainer<std::map<moleculeId_t,molecule*> > MoleculeSet;
    6976
    7077  /***** getter and setter *****/
     
    125132   * get the domain size as a symmetric matrix (6 components)
    126133   */
    127   double * getDomain();
     134  Box& getDomain();
     135
     136  /**
     137   * Set the domain size from a matrix object
     138   *
     139   * Matrix needs to be symmetric
     140   */
     141  void setDomain(const Matrix &mat);
    128142
    129143  /**
     
    207221  ManipulateAtomsProcess* manipulateAtoms(boost::function<void(atom*)>,std::string);
    208222
     223  /****
     224   * Iterators to use internal data structures
     225   * All these iterators are observed to track changes.
     226   * There is a corresponding protected section with unobserved iterators,
     227   * which can be used internally when the extra speed is needed
     228   */
     229
     230  typedef SelectiveIterator<atom*,AtomSet,AtomDescriptor>       AtomIterator;
     231
     232  /**
     233   * returns an iterator over all Atoms matching a given descriptor.
     234   * This iterator is observed, so don't keep it around unnecessary to
     235   * avoid unintended blocking.
     236   */
     237  AtomIterator getAtomIter(AtomDescriptor descr);
     238  AtomIterator getAtomIter();
     239
     240  AtomIterator atomEnd();
     241
     242  typedef SelectiveIterator<molecule*,MoleculeSet,MoleculeDescriptor>   MoleculeIterator;
     243
     244  /**
     245   * returns an iterator over all Molecules matching a given descriptor.
     246   * This iterator is observed, so don't keep it around unnecessary to
     247   * avoid unintended blocking.
     248   */
     249  MoleculeIterator getMoleculeIter(MoleculeDescriptor descr);
     250  MoleculeIterator getMoleculeIter();
     251
     252  MoleculeIterator moleculeEnd();
     253
     254  /******** Selections of molecules and Atoms *************/
     255  void clearAtomSelection();
     256  void selectAtom(atom*);
     257  void selectAtom(atomId_t);
     258  void selectAllAtoms(AtomDescriptor);
     259  void selectAtomsOfMolecule(molecule*);
     260  void selectAtomsOfMolecule(moleculeId_t);
     261  void unselectAtom(atom*);
     262  void unselectAtom(atomId_t);
     263  void unselectAllAtoms(AtomDescriptor);
     264  void unselectAtomsOfMolecule(molecule*);
     265  void unselectAtomsOfMolecule(moleculeId_t);
     266
     267  void clearMoleculeSelection();
     268  void selectMolecule(molecule*);
     269  void selectMolecule(moleculeId_t);
     270  void selectAllMoleculess(MoleculeDescriptor);
     271  void selectMoleculeOfAtom(atom*);
     272  void selectMoleculeOfAtom(atomId_t);
     273  void unselectMolecule(molecule*);
     274  void unselectMolecule(moleculeId_t);
     275  void unselectAllMoleculess(MoleculeDescriptor);
     276  void unselectMoleculeOfAtom(atom*);
     277  void unselectMoleculeOfAtom(atomId_t);
     278
     279  /******************** Iterators to selections *****************/
     280  typedef AtomSet::iterator AtomSelectionIterator;
     281  AtomSelectionIterator beginAtomSelection();
     282  AtomSelectionIterator endAtomSelection();
     283
     284  typedef MoleculeSet::iterator MoleculeSelectionIterator;
     285  MoleculeSelectionIterator beginMoleculeSelection();
     286  MoleculeSelectionIterator endMoleculeSelection();
     287
    209288protected:
    210   /**** Iterators to use internal data structures */
     289  /****
     290   * Iterators to use internal data structures
     291   * All these iterators are unobserved for speed reasons.
     292   * There is a corresponding public section to these methods,
     293   * which produce observed iterators.*/
    211294
    212295  // Atoms
    213   typedef SelectiveIterator<atom*,AtomSet,AtomDescriptor> AtomIterator;
     296  typedef SelectiveIterator<atom*,AtomSet::set_t,AtomDescriptor>        internal_AtomIterator;
    214297
    215298  /**
     
    217300   * used for internal purposes, like AtomProcesses and AtomCalculations.
    218301   */
    219   AtomIterator getAtomIter(AtomDescriptor descr);
     302  internal_AtomIterator getAtomIter_internal(AtomDescriptor descr);
    220303
    221304  /**
     
    225308   * used for internal purposes, like AtomProcesses and AtomCalculations.
    226309   */
    227   AtomIterator atomEnd();
     310  internal_AtomIterator atomEnd_internal();
    228311
    229312  // Molecules
    230 
    231   typedef SelectiveIterator<molecule*,MoleculeSet,MoleculeDescriptor> MoleculeIterator;
     313  typedef SelectiveIterator<molecule*,MoleculeSet::set_t,MoleculeDescriptor>   internal_MoleculeIterator;
     314
    232315
    233316  /**
     
    235318   * used for internal purposes, like MoleculeProcesses and MoleculeCalculations.
    236319   */
    237   MoleculeIterator getMoleculeIter(MoleculeDescriptor descr);
     320  internal_MoleculeIterator getMoleculeIter_internal(MoleculeDescriptor descr);
    238321
    239322  /**
     
    243326   * used for internal purposes, like MoleculeProcesses and MoleculeCalculations.
    244327   */
    245   MoleculeIterator moleculeEnd();
     328  internal_MoleculeIterator moleculeEnd_internal();
    246329
    247330
     
    254337  void releaseAtomId(atomId_t);
    255338  bool reserveAtomId(atomId_t);
     339  void defragAtomIdPool();
     340
     341  moleculeId_t getNextMoleculeId();
     342  void releaseMoleculeId(moleculeId_t);
     343  bool reserveMoleculeId(moleculeId_t);
     344  void defragMoleculeIdPool();
    256345
    257346  periodentafel *periode;
    258347  config *configuration;
    259   static double *cell_size;
     348  Box *cell_size;
    260349  std::string defaultName;
    261350  class ThermoStatContainer *Thermostats;
    262351  int ExitFlag;
    263 public:
     352private:
     353
    264354  AtomSet atoms;
    265 private:
    266   std::set<atomId_t> atomIdPool; //<!stores the pool for all available AtomIds below currAtomId
     355  AtomSet selectedAtoms;
     356  typedef std::set<std::pair<atomId_t, atomId_t> > atomIdPool_t;
     357  /**
     358   * stores the pool for all available AtomIds below currAtomId
     359   *
     360   * The pool contains ranges of free ids in the form [bottom,top).
     361   */
     362  atomIdPool_t atomIdPool;
    267363  atomId_t currAtomId; //!< stores the next available Id for atoms
     364  size_t lastAtomPoolSize; //!< size of the pool after last defrag, to skip some defrags
     365  unsigned int numAtomDefragSkips;
     366
    268367  MoleculeSet molecules;
     368  MoleculeSet selectedMolecules;
     369  typedef std::set<std::pair<moleculeId_t, moleculeId_t> > moleculeIdPool_t;
     370  /**
     371   * stores the pool for all available AtomIds below currAtomId
     372   *
     373   * The pool contains ranges of free ids in the form [bottom,top).
     374   */
     375  moleculeIdPool_t moleculeIdPool;
    269376  moleculeId_t currMoleculeId;
     377  size_t lastMoleculePoolSize; //!< size of the pool after last defrag, to skip some defrags
     378  unsigned int numMoleculeDefragSkips;
    270379private:
    271380  /**
  • src/analysis_bonds.cpp

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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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
     
    328330}
    329331
     332molecule* atom::getMolecule(){
     333  return mol;
     334}
     335
    330336void atom::removeFromMolecule(){
    331337  if(mol){
  • src/atom.hpp

    rba9f5b rbe97a8  
    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
     
    8990
    9091   void setMolecule(molecule*);
     92   molecule* getMolecule();
    9193   void removeFromMolecule();
    9294
  • src/atom_graphnodeinfo.cpp

    rba9f5b rbe97a8  
    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

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

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

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

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

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

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

    rba9f5b rbe97a8  
    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

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

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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    1010using namespace std;
    1111
    12 #include <iostream>
     12#include <iosfwd>
    1313
    1414/****************************************** forward declarations *****************************/
  • src/defs.hpp

    rba9f5b rbe97a8  
    8484#define MOLECUILDER_NAME "Molecuilder"
    8585
     86const unsigned int MAX_POOL_FRAGMENTATION=20;
     87const unsigned int MAX_FRAGMENTATION_SKIPS=100;
     88
    8689#endif /*DEFS_HPP_*/
  • src/element.hpp

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

    rba9f5b rbe97a8  
    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

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

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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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/ObserverTest.cpp

    rba9f5b rbe97a8  
    182182};
    183183
    184 class ObservableCollection : public Observable {
     184class ObservableSet : public Observable {
    185185public:
    186186  typedef std::set<SimpleObservable*> set;
     
    188188  typedef set::const_iterator const_iterator;
    189189
    190   ObservableCollection(int _num) :
     190  ObservableSet(int _num) :
    191191    Observable("ObservableCollection"),
    192192    num(_num)
     
    199199  }
    200200
    201   ~ObservableCollection(){
     201  ~ObservableSet(){
    202202    set::iterator iter;
    203203    for(iter=theSet.begin(); iter!=theSet.end(); ++iter ){
    204204      delete (*iter);
     205    }
     206  }
     207
     208  iterator begin(){
     209    return iterator(theSet.begin(),this);
     210  }
     211
     212  iterator end(){
     213    return iterator(theSet.end(),this);
     214  }
     215
     216  const int num;
     217
     218private:
     219  set theSet;
     220};
     221
     222class ObservableMap : public Observable {
     223public:
     224  typedef std::map<int,SimpleObservable*> set;
     225  typedef ObservedIterator<set> iterator;
     226  typedef set::const_iterator const_iterator;
     227
     228  ObservableMap(int _num) :
     229    Observable("ObservableCollection"),
     230    num(_num)
     231  {
     232    for(int i=0; i<num; ++i){
     233      SimpleObservable *content = new SimpleObservable();
     234      content->signOn(this);
     235      theSet.insert(make_pair(i,content));
     236    }
     237  }
     238
     239  ~ObservableMap(){
     240    set::iterator iter;
     241    for(iter=theSet.begin(); iter!=theSet.end(); ++iter ){
     242      delete iter->second;
    205243    }
    206244  }
     
    231269  blockObservable = new BlockObservable();
    232270  notificationObservable = new NotificationObservable();
    233   collection = new ObservableCollection(5);
     271  obsset = new ObservableSet(5);
     272  obsmap = new ObservableMap(5);
    234273
    235274  observer1 = new UpdateCountObserver();
     
    249288  delete blockObservable;
    250289  delete notificationObservable;
    251   delete collection;
     290  delete obsset;
     291  delete obsmap;
    252292
    253293  delete observer1;
     
    268308  simpleObservable2->signOn(observer4);
    269309
     310  CPPUNIT_ASSERT_EQUAL( 0, observer1->updates );
     311  CPPUNIT_ASSERT_EQUAL( 0, observer2->updates );
     312  CPPUNIT_ASSERT_EQUAL( 0, observer3->updates );
     313  CPPUNIT_ASSERT_EQUAL( 0, observer4->updates );
     314
     315
    270316  simpleObservable1->changeMethod();
    271317  CPPUNIT_ASSERT_EQUAL( 1, observer1->updates );
     
    292338void ObserverTest::doesBlockUpdateTest() {
    293339  callObservable->signOn(observer1);
     340  CPPUNIT_ASSERT_EQUAL( 0, observer1->updates );
    294341
    295342  callObservable->changeMethod1();
     
    311358  CPPUNIT_ASSERT_EQUAL( 2, observer1->updates );
    312359  CPPUNIT_ASSERT_EQUAL( 2, observer2->updates );
     360}
     361
     362void ObserverTest::outsideLockTest(){
     363  callObservable->signOn(observer1);
     364  CPPUNIT_ASSERT_EQUAL( 0, observer1->updates );
     365
     366  {
     367    LOCK_OBSERVABLE(*callObservable);
     368    CPPUNIT_ASSERT_EQUAL( 0, observer1->updates );
     369  }
     370  // lock is gone now, observer should have notified
     371  CPPUNIT_ASSERT_EQUAL( 1, observer1->updates );
    313372}
    314373
     
    341400  int i = 0;
    342401  // test the general iterator methods
    343   for(ObservableCollection::iterator iter=collection->begin(); iter!=collection->end();++iter){
    344     CPPUNIT_ASSERT(i< collection->num);
     402  for(ObservableSet::iterator iter=obsset->begin(); iter!=obsset->end();++iter){
     403    CPPUNIT_ASSERT(i< obsset->num);
    345404    i++;
    346405  }
    347406
    348407  i=0;
    349   for(ObservableCollection::const_iterator iter=collection->begin(); iter!=collection->end();++iter){
    350     CPPUNIT_ASSERT(i<collection->num);
    351     i++;
    352   }
    353 
    354   collection->signOn(observer1);
     408  for(ObservableSet::const_iterator iter=obsset->begin(); iter!=obsset->end();++iter){
     409    CPPUNIT_ASSERT(i<obsset->num);
     410    i++;
     411  }
     412
     413  obsset->signOn(observer1);
    355414  {
    356415    // we construct this out of the loop, so the iterator dies at the end of
    357416    // the scope and not the end of the loop (allows more testing)
    358     ObservableCollection::iterator iter;
    359     for(iter=collection->begin(); iter!=collection->end(); ++iter){
     417    ObservableSet::iterator iter;
     418    for(iter=obsset->begin(); iter!=obsset->end(); ++iter){
    360419      (*iter)->changeMethod();
    361420    }
     
    367426
    368427  // when using a const_iterator no changes should be propagated
    369   for(ObservableCollection::const_iterator iter = collection->begin(); iter!=collection->end();++iter);
     428  for(ObservableSet::const_iterator iter = obsset->begin(); iter!=obsset->end();++iter);
    370429  CPPUNIT_ASSERT_EQUAL( 1, observer1->updates);
    371   collection->signOff(observer1);
     430
     431  // we need to test the operator-> as well
     432  obsmap->signOn(observer2);
     433  {
     434    // we construct this out of the loop, so the iterator dies at the end of
     435    // the scope and not the end of the loop (allows more testing)
     436    ObservableMap::iterator iter;
     437    for(iter=obsmap->begin(); iter!=obsmap->end(); ++iter){
     438      iter->second->changeMethod();
     439    }
     440    // At this point no change should have been propagated
     441    CPPUNIT_ASSERT_EQUAL( 0, observer2->updates);
     442  }
     443  // After the Iterator has died the propagation should take place
     444  CPPUNIT_ASSERT_EQUAL( 1, observer2->updates);
     445
     446
     447  obsset->signOff(observer1);
     448  obsmap->signOff(observer2);
    372449}
    373450
  • src/unittests/ObserverTest.hpp

    rba9f5b rbe97a8  
    1717class CallObservable;
    1818class SuperObservable;
    19 class ObservableCollection;
     19class ObservableSet;
     20class ObservableMap;
    2021class BlockObservable;
    2122class NotificationObservable;
     
    2728  CPPUNIT_TEST ( doesBlockUpdateTest );
    2829  CPPUNIT_TEST ( doesSubObservableTest );
     30  CPPUNIT_TEST ( outsideLockTest );
    2931  CPPUNIT_TEST ( doesNotifyTest );
    3032  CPPUNIT_TEST ( doesReportTest );
     
    4042  void doesBlockUpdateTest();
    4143  void doesSubObservableTest();
     44  void outsideLockTest();
    4245  void doesNotifyTest();
    4346  void doesReportTest();
     
    6063  SuperObservable *superObservable;
    6164  NotificationObservable *notificationObservable;
    62   ObservableCollection *collection;
     65  ObservableSet *obsset;
     66  ObservableMap *obsmap;
    6367
    6468};
  • src/unittests/PlaneUnittest.cpp

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    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

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

    rba9f5b rbe97a8  
    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

    rba9f5b rbe97a8  
    1818#endif
    1919
    20 #include <iostream>
     20#include <iosfwd>
    2121
    2222/************************************* Class Verbose & Binary *******************************/
  • test_all.sh

    rba9f5b rbe97a8  
    2323docheck=0;
    2424docheck_mem=0;
     25if [ -n "$TMPDIR" ]
     26then
     27  tmpdir="$TMPDIR";
     28else
     29  tmpdir="/tmp";
     30fi
     31tmppattern="MolecuilderTest";
    2532
    2633function usage(){
     
    3643  echo "  -c                    Only configure and compile (implies -s)";
    3744  echo "  -O <opt-level>        Only compile this optimization level";
    38 }
    39 
    40 while getopts “ho:f:scO:” OPTION
     45  echo "  -t <tmpDir>           Use tmpDir as temporary directory";
     46  echo "  -p <prefix>           Prefix to use for directory names (standart MolecuilderTest)";
     47}
     48
     49while getopts “ho:f:scO:t:p:” OPTION
    4150do
    4251  case $OPTION in
     
    4655      ;;
    4756   o)
    48      outfile=$OPTARG;
     57     outfile="$OPTARG";
    4958     ;;
    5059   f)
    51      logfile=$OPTARG;
     60     logfile="$OPTARG";
    5261     ;;
    5362   s)
     
    6170     optimizations=("-O$OPTARG");
    6271     ;;
     72   t)
     73     tmpdir="$OPTARG";
     74     ;;
     75   p)
     76     tmppattern="$OPTARG";
     77     ;;
    6378   ?)
    6479     usage;
     
    6883done
    6984
    70 if [[ -z $outfile ]] || [[ -z $logfile ]]
     85# test if all arguments were provided
     86if [[ -z "$outfile" ]] || [[ -z "$logfile" ]] || [[ -z "$tmpdir" ]] || [[ -z "$tmppattern" ]]
    7187then
    7288  usage;
     
    7490fi
    7591
     92# turn all relative paths into absolutes
    7693outfile=`realpath -s $outfile`;
    7794logfile=`realpath -s $logfile`;
     95tmpdir=`realpath -s $tmpdir`;
    7896
    7997
     
    167185function run(){
    168186  echo "Testing with \"$1\":" >> $outfile;
    169   testdir=`mktemp -d --tmpdir MolecuilderTest.XXXXXXXXXX`;
     187  testdir=`mktemp -d --tmpdir=$tmpdir $tmppattern.XXXXXXXXXX`;
    170188  basedir=$PWD;
    171189  cd $testdir;
  • tests/Tesselations/defs.in

    rba9f5b rbe97a8  
    5959        fi
    6060        #echo "Molecuilder done with exitcode $exitcode."
     61        cd ../..
    6162        #cat stderr
    6263        #cat stdout
    63         grep -E "^[0-9]* [0-9]* [0-9]*$" ../../@srcdir@/$mol/$2/${FILENAME}-$mol.dat | sort -n >reference-triangles.dat
    64         grep -E "^[0-9]* [0-9]* [0-9]*$" ${FILENAME}.dat | sort -n >new-triangles.dat
    65         diff reference-triangles.dat new-triangles.dat 2>diffstderr >diffstdout || exitcode=$?
     64        grep -E "^[0-9]* [0-9]* [0-9]*$" @srcdir@/$mol/$2/${FILENAME}-$mol.dat | sort -n >$testdir/$RADIUS/reference-triangles.dat
     65        grep -E "^[0-9]* [0-9]* [0-9]*$" $testdir/$RADIUS/${FILENAME}.dat | sort -n >$testdir/$RADIUS/new-triangles.dat
     66        diff $testdir/$RADIUS/reference-triangles.dat $testdir/$RADIUS/new-triangles.dat 2>$testdir/$RADIUS/diffstderr >$testdir/$RADIUS/diffstdout || exitcode=$?
    6667        #echo "Diff done with exitcode $exitcode."
    6768        #cat diffstderr
    6869        #cat diffstdout
    69         cd ../..
    7070        test $exitcode = $expected_exitcode || exit 1
    7171}
  • tests/Tesselations/heptan/1.5/NonConvexEnvelope-heptan.dat

    rba9f5b rbe97a8  
    11TITLE = "3D CONVEX SHELL"
    22VARIABLES = "X" "Y" "Z" "U"
    3 ZONE T="heptan", N=23, E=64, DATAPACKING=POINT, ZONETYPE=FETRIANGLE
     3ZONE T="none", N=23, E=64, DATAPACKING=POINT, ZONETYPE=FETRIANGLE
    44-7.27e-07 -1.22006 0.930455 18.7229
    55-7.27e-07 -1.22006 -0.849545 18.7229
     
    77-1.2492 0.921941 -0.849545 18.7227
    881.2492 0.921941 -0.849545 18.7222
    9 1.2492 0.921941 0.930455 27.0641
    10 -2.4985 -1.22006 -0.849545 19.9769
    11 -2.4985 -1.22006 0.930455 27.4727
    12 2.4985 -1.22006 0.930455 19.9769
    13 2.4985 -1.22006 -0.849545 27.4727
     91.2492 0.921941 0.930455 18.7222
     10-2.4985 -1.22006 -0.849545 27.4727
     11-2.4985 -1.22006 0.930455 19.9769
     122.4985 -1.22006 0.930455 27.4727
     132.4985 -1.22006 -0.849545 19.9769
    1414-4.6377 -0.336759 0.0404545 21.541
    1515-3.7477 0.921941 0.930455 18.8853
     
    17174.6377 -0.336759 0.0404545 10.6618
    18183.7477 0.921941 -0.849545 18.5406
    19 3.7477 0.921941 0.930455 12.1988
     193.7477 0.921941 0.930455 18.5406
    2020-7.27e-07 -0.590759 0.0404545 23.0174
    2121-1.2492 0.292641 0.0404545 23.0167
    22 1.2492 0.292641 0.0404545 20.1632
     221.2492 0.292641 0.0404545 23.0172
    2323-2.4985 -0.590759 0.0404545 18.9798
    24242.4985 -0.590759 0.0404545 18.9798
    2525-3.7477 0.292641 0.0404545 39.5267
    26 3.7477 0.292641 0.0404545 23.2512
     263.7477 0.292641 0.0404545 20.5497
    2727
    282814 15 23
     
    343415 19 23
    35355 15 19
     3616 19 23
     376 16 19
    36385 6 19
    37395 6 19
     
    42443 4 18
    43453 4 18
     463 18 22
     473 12 22
    44484 18 22
    45494 13 22
    46 3 18 22
    47 3 12 22
    485012 13 22
    495112 13 22
    50 6 19 23
    51 6 16 23
     5211 12 22
     5311 12 22
     548 11 22
     558 12 22
    525611 13 22
    535711 13 22
    54587 11 22
    55597 13 22
    56 11 12 22
    57 11 12 22
    58 8 11 22
    59 8 12 22
    606014 16 23
    616114 16 23
     
    76769 10 21
    77779 14 21
    78 10 17 21
    79 2 10 17
     789 17 21
     791 9 17
    80801 2 17
    81811 2 17
    82 1 17 21
    83 1 9 21
    84 2 17 20
    85 2 7 20
     822 17 21
     832 10 21
     841 17 20
     851 8 20
    86867 8 20
    87877 8 20
     888 11 20
    88897 11 20
    89 8 11 20
    90 8 17 20
    91 1 8 17
     907 17 20
     912 7 17
  • tests/regression/Domain/4/post/test.conf

    rba9f5b rbe97a8  
    4747BoxLength                       # (Length of a unit cell)
    48481       
    49 0       0       
     490       1       
    50500       0       2       
    5151
  • tests/regression/testsuite-analysis.at

    rba9f5b rbe97a8  
    3939AT_KEYWORDS([analysis])
    4040AT_CHECK([/bin/cp -f ${abs_top_srcdir}/${AUTOTEST_PATH}/Analysis/4/pre/test.conf .], 0)
    41 AT_CHECK([../../molecuilder -i test.conf -e ${abs_top_srcdir}/src/ -v 3 -I -C S --elements 1 --output-file output.csv --bin-output-file bin_output.csv --bin-start 0 --bin-width 1. --bin-end 20 --molecule-by-id 208], 0, [stdout], [stderr])
     41AT_CHECK([../../molecuilder -i test.conf -e ${abs_top_srcdir}/src/ -v 3 -I -C S --elements 1 --output-file output.csv --bin-output-file bin_output.csv --bin-start 0 --bin-width 1. --bin-end 20 --molecule-by-id 207], 0, [stdout], [stderr])
    4242AT_CHECK([fgrep "Begin of CorrelationToSurface" stdout], 0, [ignore], [ignore])
    4343#AT_CHECK([file=output.csv; diff $file ${abs_top_srcdir}/${AUTOTEST_PATH}/Analysis/4/post/$file], 0, [ignore], [ignore])
Note: See TracChangeset for help on using the changeset viewer.