Changes in / [192f6e:4e10f5]
- Files:
-
- 22 added
- 4 deleted
- 108 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/ActionRegistry.hpp
r192f6e r4e10f5 9 9 #define ACTIONREGISTRY_HPP_ 10 10 11 #include <ios tream>11 #include <iosfwd> 12 12 #include <string> 13 13 #include <map> -
src/Actions/AnalysisAction/PairCorrelationAction.cpp
r192f6e r4e10f5 12 12 #include "boundary.hpp" 13 13 #include "linkedcell.hpp" 14 #include "verbose.hpp" 14 15 #include "log.hpp" 15 16 #include "element.hpp" … … 67 68 dialog = UIFactory::getInstance().makeDialog(); 68 69 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")); 70 71 if (type == "S") 71 72 dialog->queryMolecule("molecule-by-id", &Boundary, MapOfActions::getInstance().getDescription("molecule-by-id")); -
src/Actions/AtomAction/AddAction.cpp
r192f6e r4e10f5 41 41 42 42 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")); 44 44 cout << "pre-dialog" << endl; 45 45 -
src/Actions/AtomsCalculation_impl.hpp
r192f6e r4e10f5 11 11 #include "Actions/AtomsCalculation.hpp" 12 12 #include "Actions/Calculation_impl.hpp" 13 14 #include <iostream>15 13 16 14 using namespace std; -
src/Actions/MapOfActions.cpp
r192f6e r4e10f5 17 17 #include <boost/optional.hpp> 18 18 #include <boost/program_options.hpp> 19 20 #include <iostream> 19 21 20 22 #include "CommandLineParser.hpp" -
src/Actions/MoleculeAction/BondFileAction.cpp
r192f6e r4e10f5 24 24 #include "config.hpp" 25 25 #include "defs.hpp" 26 #include "verbose.hpp" 26 27 #include "log.hpp" 27 28 #include "molecule.hpp" -
src/Actions/MoleculeAction/FillWithMoleculeAction.cpp
r192f6e r4e10f5 62 62 63 63 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")); 66 66 dialog->queryBoolean("DoRotate", &DoRotate, MapOfActions::getInstance().getDescription("DoRotate")); 67 67 dialog->queryDouble("MaxDistance", &MaxDistance, MapOfActions::getInstance().getDescription("MaxDistance")); -
src/Actions/MoleculeAction/SuspendInWaterAction.cpp
r192f6e r4e10f5 22 22 #include "boundary.hpp" 23 23 #include "config.hpp" 24 #include "verbose.hpp" 24 25 #include "log.hpp" 25 26 #include "config.hpp" -
src/Actions/MoleculeAction/TranslateAction.cpp
r192f6e r4e10f5 55 55 bool periodic = false; 56 56 57 dialog->queryVector(NAME, &x, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));57 dialog->queryVector(NAME, &x, false, MapOfActions::getInstance().getDescription(NAME)); 58 58 dialog->queryMolecule("molecule-by-id", &mol, MapOfActions::getInstance().getDescription("molecule-by-id")); 59 59 dialog->queryBoolean("periodic", &periodic, MapOfActions::getInstance().getDescription("periodic")); -
src/Actions/WorldAction/AddEmptyBoundaryAction.cpp
r192f6e r4e10f5 41 41 int j=0; 42 42 43 dialog->queryVector(NAME, &boundary, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));43 dialog->queryVector(NAME, &boundary, false, MapOfActions::getInstance().getDescription(NAME)); 44 44 45 45 if(dialog->display()) { … … 59 59 } 60 60 // set new box size 61 double * const cell_size = World::getInstance().getDomain();61 double * const cell_size = new double[6]; 62 62 for (j=0;j<6;j++) 63 63 cell_size[j] = 0.; … … 67 67 cell_size[j] = (Max[i]-Min[i]+2.*boundary[i]); 68 68 } 69 World::getInstance().setDomain(cell_size); 70 delete[] cell_size; 69 71 // translate all atoms, such that Min is aty (0,0,0) 70 72 AtomRunner = AllAtoms.begin(); -
src/Actions/WorldAction/CenterInBoxAction.cpp
r192f6e r4e10f5 34 34 Dialog *dialog = UIFactory::getInstance().makeDialog(); 35 35 36 double *cell_size = World::getInstance().getDomain();36 Box& cell_size = World::getInstance().getDomain(); 37 37 dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME)); 38 38 39 39 if(dialog->display()) { 40 World::getInstance().setDomain(cell_size);41 40 // center 42 41 vector<molecule *> AllMolecules = World::getInstance().getAllMolecules(); -
src/Actions/WorldAction/CenterOnEdgeAction.cpp
r192f6e r4e10f5 13 13 #include "vector.hpp" 14 14 #include "World.hpp" 15 #include "Matrix.hpp" 15 16 16 17 #include <iostream> … … 37 38 Vector Min; 38 39 Vector Max; 39 int j=0;40 40 41 41 dialog->queryEmpty(NAME, MapOfActions::getInstance().getDescription(NAME)); … … 57 57 } 58 58 // 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; 63 60 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; 66 64 } 67 World::getInstance().setDomain( cell_size);65 World::getInstance().setDomain(domain); 68 66 // translate all atoms, such that Min is aty (0,0,0) 69 67 for (vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) -
src/Actions/WorldAction/ChangeBoxAction.cpp
r192f6e r4e10f5 12 12 #include "verbose.hpp" 13 13 #include "World.hpp" 14 #include "Box.hpp" 15 #include "Matrix.hpp" 14 16 15 17 #include <iostream> … … 34 36 Dialog *dialog = UIFactory::getInstance().makeDialog(); 35 37 36 double *cell_size = World::getInstance().getDomain();38 Box& cell_size = World::getInstance().getDomain(); 37 39 dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME)); 38 40 39 41 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); 42 43 delete dialog; 43 44 return Action::success; -
src/Actions/WorldAction/RemoveSphereOfAtomsAction.cpp
r192f6e r4e10f5 41 41 42 42 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")); 44 44 45 45 if(dialog->display()) { -
src/Actions/WorldAction/RepeatBoxAction.cpp
r192f6e r4e10f5 13 13 #include "molecule.hpp" 14 14 #include "vector.hpp" 15 #include "Matrix.hpp" 15 16 #include "verbose.hpp" 16 17 #include "World.hpp" 18 #include "Box.hpp" 17 19 18 20 #include <iostream> … … 46 48 MoleculeListClass *molecules = World::getInstance().getMolecules(); 47 49 48 dialog->queryVector(NAME, &Repeater, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));50 dialog->queryVector(NAME, &Repeater, false, MapOfActions::getInstance().getDescription(NAME)); 49 51 //dialog->queryMolecule("molecule-by-id", &mol,MapOfActions::getInstance().getDescription("molecule-by-id")); 50 52 vector<molecule *> AllMolecules; … … 59 61 if(dialog->display()) { 60 62 (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; 63 65 Vector x,y; 64 66 int n[NDIM]; 67 Matrix repMat; 65 68 for (int axis = 0; axis < NDIM; axis++) { 66 69 Repeater[axis] = floor(Repeater[axis]); … … 69 72 Repeater[axis] = 1; 70 73 } 71 cell_size[ ((axis == 1) ? 2 : (axis == 2) ? 5 : 0) ] *= Repeater[axis];74 repMat.at(axis,axis) = Repeater[axis]; 72 75 } 76 newM *= repMat; 77 World::getInstance().setDomain(newM); 73 78 74 World::getInstance().setDomain(cell_size);75 79 molecule *newmol = NULL; 76 80 Vector ** vectors = NULL; … … 99 103 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl); 100 104 x = y; 101 x .MatrixMultiplication(M);105 x *= M; 102 106 newmol = World::getInstance().createMolecule(); 103 107 molecules->insert(newmol); … … 119 123 } 120 124 } 121 delete(M);122 125 delete dialog; 123 126 return Action::success; -
src/Actions/WorldAction/ScaleBoxAction.cpp
r192f6e r4e10f5 14 14 #include "verbose.hpp" 15 15 #include "World.hpp" 16 #include "Box.hpp" 17 #include "Matrix.hpp" 16 18 17 19 #include <iostream> … … 37 39 Vector Scaler; 38 40 double x[NDIM]; 39 int j=0;40 41 41 dialog->queryVector(NAME, &Scaler, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription(NAME));42 dialog->queryVector(NAME, &Scaler, false, MapOfActions::getInstance().getDescription(NAME)); 42 43 43 44 if(dialog->display()) { … … 49 50 (*AtomRunner)->x.ScaleAll(x); 50 51 } 51 j = -1; 52 double * const cell_size = World::getInstance().getDomain(); 52 53 Matrix M = World::getInstance().getDomain().getM(); 54 Matrix scale; 55 53 56 for (int i=0;i<NDIM;i++) { 54 j += i+1; 55 cell_size[j]*=x[i]; 57 scale.at(i,i) = x[i]; 56 58 } 57 World::getInstance().setDomain(cell_size); 59 M *= scale; 60 World::getInstance().setDomain(M); 58 61 59 62 delete dialog; -
src/ConfigFileBuffer.cpp
r192f6e r4e10f5 9 9 #include "helpers.hpp" 10 10 #include "lists.hpp" 11 #include "verbose.hpp" 11 12 #include "log.hpp" 12 13 #include "World.hpp" -
src/ConfigFileBuffer.hpp
r192f6e r4e10f5 17 17 #endif 18 18 19 #include <ios tream>19 #include <iosfwd> 20 20 21 21 /****************************************** forward declarations *****************************/ -
src/Exceptions/CustomException.cpp
r192f6e r4e10f5 9 9 10 10 #include "CustomException.hpp" 11 #include <iostream> 11 12 12 13 using namespace std; -
src/Exceptions/CustomException.hpp
r192f6e r4e10f5 10 10 11 11 #include <exception> 12 #include <iostream> 12 #include <iosfwd> 13 #include <string> 13 14 14 15 /** -
src/Helpers/Assert.hpp
r192f6e r4e10f5 11 11 #include<sstream> 12 12 #include<string> 13 #include<ios tream>13 #include<iosfwd> 14 14 #include<vector> 15 15 #include<map> -
src/Helpers/MemDebug.cpp
r192f6e r4e10f5 6 6 */ 7 7 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 10 27 11 28 #include <iostream> … … 489 506 } 490 507 #endif 491 #endif -
src/Helpers/MemDebug.hpp
r192f6e r4e10f5 21 21 * your sourcefiles. 22 22 */ 23 #ifndef NDEBUG24 #ifndef NO_MEMDEBUG25 23 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 28 31 #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 29 45 30 46 #include <new> … … 83 99 #endif 84 100 85 #endif 86 #endif 87 88 89 #ifdef NDEBUG 90 #undef MEMDEBUG 91 #endif 92 93 #ifndef MEMDEBUG 101 #else 94 102 // memory debugging was disabled 95 103 … … 104 112 105 113 #endif 114 115 106 116 #endif /* MEMDEBUG_HPP_ */ -
src/Line.cpp
r192f6e r4e10f5 215 215 } 216 216 217 std::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 217 236 Line makeLineThrough(const Vector &x1, const Vector &x2){ 218 237 if(x1==x2){ -
src/Line.hpp
r192f6e r4e10f5 38 38 Plane getOrthogonalPlane(const Vector &origin) const; 39 39 40 std::vector<Vector> getSphereIntersections() const; 41 40 42 private: 41 43 std::auto_ptr<Vector> origin; -
src/Makefile.am
r192f6e r4e10f5 38 38 vector.cpp 39 39 40 LINALGHEADER = gslmatrix.hpp \ 40 LINALGHEADER = \ 41 gslmatrix.hpp \ 41 42 gslvector.hpp \ 42 43 linearsystemofequations.hpp \ … … 75 76 Actions/MethodAction.hpp \ 76 77 Actions/Process.hpp 77 78 79 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \ 80 Exceptions/LinearDependenceException.cpp \ 81 Exceptions/MathException.cpp \ 82 Exceptions/NotInvertibleException.cpp \ 83 Exceptions/SkewException.cpp \ 84 Exceptions/ZeroVectorException.cpp 85 86 EXCEPTIONHEADER = Exceptions/CustomException.hpp \ 87 Exceptions/LinearDependenceException.hpp \ 88 Exceptions/MathException.hpp \ 89 Exceptions/NotInvertibleException.hpp \ 90 Exceptions/SkewException.hpp \ 91 Exceptions/ZeroVectorException.hpp 78 92 79 93 PARSERSOURCE = \ … … 101 115 Patterns/Observer.hpp \ 102 116 Patterns/Singleton.hpp 117 118 SHAPESOURCE = \ 119 Shapes/BaseShapes.cpp \ 120 Shapes/Shape.cpp \ 121 Shapes/ShapeOps.cpp 122 SHAPEHEADER = \ 123 Shapes/BaseShapes.hpp \ 124 Shapes/Shape.hpp \ 125 Shapes/ShapeOps.hpp 126 103 127 104 128 QTUIMOC_HEADER = UIElements/QT4/QTDialog.hpp \ … … 134 158 Descriptors/MoleculeNameDescriptor.hpp \ 135 159 Descriptors/MoleculePtrDescriptor.hpp 136 137 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \138 Exceptions/LinearDependenceException.cpp \139 Exceptions/MathException.cpp \140 Exceptions/SkewException.cpp \141 Exceptions/ZeroVectorException.cpp142 143 EXCEPTIONHEADER = Exceptions/CustomException.hpp \144 Exceptions/LinearDependenceException.hpp \145 Exceptions/MathException.hpp \146 Exceptions/SkewException.hpp \147 Exceptions/ZeroVectorException.hpp148 160 149 161 QTUISOURCE = ${QTUIMOC_TARGETS} \ … … 165 177 ${ACTIONSSOURCE} \ 166 178 ${ATOMSOURCE} \ 179 ${EXCEPTIONSOURCE} \ 167 180 ${PATTERNSOURCE} \ 168 181 ${PARSERSOURCE} \ 182 ${SHAPESOURCE} \ 169 183 ${DESCRIPTORSOURCE} \ 170 184 ${HELPERSOURCE} \ 171 ${EXCEPTIONSOURCE} \172 185 bond.cpp \ 173 186 bondgraph.cpp \ 174 187 boundary.cpp \ 188 Box.cpp \ 175 189 CommandLineParser.cpp \ 176 190 config.cpp \ … … 188 202 log.cpp \ 189 203 logger.cpp \ 204 Matrix.cpp \ 190 205 moleculelist.cpp \ 191 206 molecule.cpp \ … … 212 227 ${ACTIONSHEADER} \ 213 228 ${ATOMHEADER} \ 229 ${EXCEPTIONHEADER} \ 214 230 ${PARSERHEADER} \ 215 231 ${PATTERNHEADER} \ 232 ${SHAPEHEADER} \ 216 233 ${DESCRIPTORHEADER} \ 217 ${EXCEPTIONHEADER} \218 234 bond.hpp \ 219 235 bondgraph.hpp \ 220 236 boundary.hpp \ 237 Box.hpp \ 221 238 CommandLineParser.hpp \ 222 239 config.hpp \ … … 236 253 log.hpp \ 237 254 logger.hpp \ 255 Matrix.hpp \ 238 256 molecule.hpp \ 239 257 molecule_template.hpp \ -
src/Parser/MpqcParser.hpp
r192f6e r4e10f5 11 11 #include "FormatParser.hpp" 12 12 13 #include <ios tream>13 #include <iosfwd> 14 14 15 15 /** -
src/Parser/PcpParser.cpp
r192f6e r4e10f5 7 7 8 8 #include <iostream> 9 #include <iomanip> 9 10 10 11 #include "atom.hpp" … … 20 21 #include "verbose.hpp" 21 22 #include "World.hpp" 23 #include "Matrix.hpp" 24 #include "Box.hpp" 22 25 23 26 /** Constructor of PcpParser. … … 210 213 // Unit cell and magnetic field 211 214 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]; 213 216 cell_size[0] = BoxLength[0]; 214 217 cell_size[1] = BoxLength[3]; … … 217 220 cell_size[4] = BoxLength[7]; 218 221 cell_size[5] = BoxLength[8]; 222 World::getInstance().setDomain(cell_size); 223 delete[] cell_size; 219 224 //if (1) fprintf(stderr,"\n"); 220 225 … … 327 332 void PcpParser::save(std::ostream* file) 328 333 { 329 const double * const cell_size = World::getInstance().getDomain();334 const Matrix &domain = World::getInstance().getDomain().getM(); 330 335 class ThermoStatContainer *Thermostats = World::getInstance().getThermostats(); 331 336 if (!file->fail()) { … … 412 417 *file << endl; 413 418 *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; 417 422 // FIXME 418 423 *file << endl; -
src/Parser/PcpParser.hpp
r192f6e r4e10f5 9 9 #define PCPPARSER_HPP_ 10 10 11 #include <ios tream>11 #include <iosfwd> 12 12 #include "Parser/FormatParser.hpp" 13 13 -
src/Patterns/Cacheable.hpp
r192f6e r4e10f5 12 12 #include <boost/function.hpp> 13 13 #include <boost/shared_ptr.hpp> 14 #include <iostream>15 14 16 15 #include "Helpers/Assert.hpp" -
src/Plane.hpp
r192f6e r4e10f5 11 11 #include <memory> 12 12 #include <vector> 13 #include <ios tream>13 #include <iosfwd> 14 14 #include "Space.hpp" 15 15 #include "Exceptions/LinearDependenceException.hpp" -
src/UIElements/CommandLineUI/CommandLineDialog.cpp
r192f6e r4e10f5 27 27 #include "verbose.hpp" 28 28 #include "World.hpp" 29 #include "Box.hpp" 29 30 30 31 #include "atom.hpp" … … 77 78 } 78 79 79 void CommandLineDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check, string _description) {80 registerQuery(new VectorCommandLineQuery(title,target,c ellSize,check, _description));81 } 82 83 void CommandLineDialog::queryBox(const char* title, double ** constcellSize, string _description) {80 void CommandLineDialog::queryVector(const char* title, Vector *target, bool check, string _description) { 81 registerQuery(new VectorCommandLineQuery(title,target,check, _description)); 82 } 83 84 void CommandLineDialog::queryBox(const char* title, Box* cellSize, string _description) { 84 85 registerQuery(new BoxCommandLineQuery(title,cellSize,_description)); 85 86 } … … 222 223 } 223 224 224 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, const double *const _cellSize,bool _check, string _description) :225 Dialog::VectorQuery(title,_target,_c ellSize,_check, _description)225 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, bool _check, string _description) : 226 Dialog::VectorQuery(title,_target,_check, _description) 226 227 {} 227 228 … … 244 245 245 246 246 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, double ** const_cellSize, string _description) :247 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, Box* _cellSize, string _description) : 247 248 Dialog::BoxQuery(title,_cellSize, _description) 248 249 {} -
src/UIElements/CommandLineUI/CommandLineDialog.hpp
r192f6e r4e10f5 35 35 virtual void queryAtom(const char*,atom**, std::string = ""); 36 36 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 = ""); 39 39 virtual void queryElement(const char*, std::vector<element *> *, std::string = ""); 40 40 … … 99 99 class VectorCommandLineQuery : public Dialog::VectorQuery { 100 100 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 = ""); 102 102 virtual ~VectorCommandLineQuery(); 103 103 virtual bool handle(); … … 106 106 class BoxCommandLineQuery : public Dialog::BoxQuery { 107 107 public: 108 BoxCommandLineQuery(std::string title, double ** const_cellSize, std::string _description = "");108 BoxCommandLineQuery(std::string title,Box* _cellSize, std::string _description = ""); 109 109 virtual ~BoxCommandLineQuery(); 110 110 virtual bool handle(); -
src/UIElements/Dialog.cpp
r192f6e r4e10f5 10 10 #include "Dialog.hpp" 11 11 12 #include "verbose.hpp" 12 13 #include "atom.hpp" 13 14 #include "element.hpp" 14 15 #include "molecule.hpp" 15 16 #include "vector.hpp" 17 #include "Matrix.hpp" 18 #include "Box.hpp" 16 19 17 20 using namespace std; … … 185 188 // Vector Queries 186 189 187 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description) :190 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,bool _check, std::string _description) : 188 191 Query(title, _description), 189 cellSize(_cellSize),190 192 check(_check), 191 193 target(_target) … … 205 207 // Box Queries 206 208 207 Dialog::BoxQuery::BoxQuery(std::string title, double ** const_cellSize, std::string _description) :209 Dialog::BoxQuery::BoxQuery(std::string title, Box* _cellSize, std::string _description) : 208 210 Query(title, _description), 209 211 target(_cellSize) … … 218 220 219 221 void Dialog::BoxQuery::setResult() { 220 for (int i=0;i<6;i++) { 221 (*target)[i] = tmp[i]; 222 } 222 (*target)= ReturnFullMatrixforSymmetric(tmp); 223 223 } 224 224 -
src/UIElements/Dialog.hpp
r192f6e r4e10f5 14 14 15 15 class atom; 16 class Box; 16 17 class element; 17 18 class molecule; … … 43 44 virtual void queryAtom(const char*,atom**,std::string = "")=0; 44 45 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; 47 48 virtual void queryElement(const char*, std::vector<element *> *, std::string = "")=0; 48 49 … … 176 177 class VectorQuery : public Query { 177 178 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 = ""); 179 180 virtual ~VectorQuery(); 180 181 virtual bool handle()=0; … … 182 183 protected: 183 184 Vector *tmp; 184 const double *const cellSize;185 185 bool check; 186 186 private: … … 190 190 class BoxQuery : public Query { 191 191 public: 192 BoxQuery(std::string title, double ** const_cellSize, std::string _description = "");192 BoxQuery(std::string title,Box *_cellSize, std::string _description = ""); 193 193 virtual ~BoxQuery(); 194 194 virtual bool handle()=0; 195 195 virtual void setResult(); 196 196 protected: 197 double *tmp;197 double* tmp; 198 198 private: 199 double **target;199 Box* target; 200 200 }; 201 201 -
src/UIElements/QT4/QTDialog.cpp
r192f6e r4e10f5 29 29 #include "molecule.hpp" 30 30 #include "Descriptors/MoleculeIdDescriptor.hpp" 31 #include "Matrix.hpp" 32 #include "Box.hpp" 31 33 32 34 … … 93 95 } 94 96 95 void QTDialog::queryBox(char const*, double**, string){97 void QTDialog::queryBox(char const*, Box*, string){ 96 98 // TODO 97 99 ASSERT(false, "Not implemented yet"); … … 123 125 } 124 126 125 void QTDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check,string) {126 registerQuery(new VectorQTQuery(title,target,c ellSize,check,inputLayout,this));127 void QTDialog::queryVector(const char* title, Vector *target, bool check,string) { 128 registerQuery(new VectorQTQuery(title,target,check,inputLayout,this)); 127 129 } 128 130 … … 291 293 } 292 294 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; 295 QTDialog::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(); 299 300 const char *coords[3] = {"x:","y:","z:"}; 300 301 mainLayout= new QHBoxLayout(); … … 304 305 mainLayout->addLayout(subLayout); 305 306 for(int i=0; i<3; i++) { 306 j+=i+1;307 307 coordLayout[i] = new QHBoxLayout(); 308 308 subLayout->addLayout(coordLayout[i]); … … 310 310 coordLayout[i]->addWidget(coordLabel[i]); 311 311 coordInput[i] = new QDoubleSpinBox(); 312 coordInput[i]->setRange(0, cellSize[j]);312 coordInput[i]->setRange(0,M.at(i,i)); 313 313 coordInput[i]->setDecimals(3); 314 314 coordLayout[i]->addWidget(coordInput[i]); -
src/UIElements/QT4/QTDialog.hpp
r192f6e r4e10f5 43 43 virtual void queryAtom(const char*,atom**,std::string = ""); 44 44 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 = ""); 47 47 virtual void queryElement(const char*,std::vector<element *> *_target,std::string = ""); 48 48 … … 124 124 class VectorQTQuery : public Dialog::VectorQuery { 125 125 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 *); 127 127 virtual ~VectorQTQuery(); 128 128 virtual bool handle(); -
src/UIElements/QT4/QTMainWindow.cpp
r192f6e r4e10f5 21 21 #include "atom.hpp" 22 22 #include "molecule.hpp" 23 #include "verbose.hpp" 23 24 #include "Actions/Action.hpp" 24 25 #include "Actions/ActionRegistry.hpp" -
src/UIElements/TextUI/TextDialog.cpp
r192f6e r4e10f5 25 25 #include "molecule.hpp" 26 26 #include "vector.hpp" 27 #include "Matrix.hpp" 28 #include "Box.hpp" 27 29 28 30 using namespace std; … … 70 72 } 71 73 72 void TextDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check, string description) {73 registerQuery(new VectorTextQuery(title,target,c ellSize,check,description));74 } 75 76 void TextDialog::queryBox(const char* title, double ** constcellSize, string description) {74 void TextDialog::queryVector(const char* title, Vector *target, bool check, string description) { 75 registerQuery(new VectorTextQuery(title,target,check,description)); 76 } 77 78 void TextDialog::queryBox(const char* title,Box* cellSize, string description) { 77 79 registerQuery(new BoxTextQuery(title,cellSize,description)); 78 80 } … … 270 272 } 271 273 272 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize,bool _check, std::string _description) :273 Dialog::VectorQuery(title,_target,_c ellSize,_check,_description)274 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, bool _check, std::string _description) : 275 Dialog::VectorQuery(title,_target,_check,_description) 274 276 {} 275 277 … … 280 282 Log() << Verbose(0) << getTitle(); 281 283 284 const Matrix &M = World::getInstance().getDomain().getM(); 282 285 char coords[3] = {'x','y','z'}; 283 int j = -1;284 286 for (int i=0;i<3;i++) { 285 j += i+1;286 287 do { 287 Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j]<< "]: ";288 Log() << Verbose(0) << coords[i] << "[0.." << M.at(i,i) << "]: "; 288 289 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)); 290 291 } 291 292 return true; 292 293 } 293 294 294 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const_cellSize, std::string _description) :295 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, Box* _cellSize, std::string _description) : 295 296 Dialog::BoxQuery(title,_cellSize,_description) 296 297 {} -
src/UIElements/TextUI/TextDialog.hpp
r192f6e r4e10f5 32 32 virtual void queryAtom(const char*,atom**,std::string = ""); 33 33 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 = ""); 36 36 virtual void queryElement(const char*, std::vector<element *> *, std::string = ""); 37 37 … … 96 96 class VectorTextQuery : public Dialog::VectorQuery { 97 97 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); 99 99 virtual ~VectorTextQuery(); 100 100 virtual bool handle(); … … 103 103 class BoxTextQuery : public Dialog::BoxQuery { 104 104 public: 105 BoxTextQuery(std::string title, double ** const_cellSize, std::string _description = NULL);105 BoxTextQuery(std::string title,Box* _cellSize, std::string _description = NULL); 106 106 virtual ~BoxTextQuery(); 107 107 virtual bool handle(); -
src/UIElements/TextUI/TextWindow.hpp
r192f6e r4e10f5 11 11 #include "MainWindow.hpp" 12 12 13 #include <string> 13 14 #include <set> 14 15 -
src/UIElements/Views/StreamStringView.hpp
r192f6e r4e10f5 10 10 11 11 #include <boost/function.hpp> 12 #include <ios tream>12 #include <iosfwd> 13 13 14 14 #include "Views/StringView.hpp" -
src/VectorSet.hpp
r192f6e r4e10f5 12 12 #include <functional> 13 13 #include <algorithm> 14 #include <limits> 14 15 15 16 /** … … 19 20 */ 20 21 21 class Vector; 22 #include "vector.hpp" 23 #include <list> 22 24 23 25 // this tests, whether we actually have a Vector … … 48 50 void translate(const Vector &translater){ 49 51 // 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()); 51 64 } 52 65 }; 53 66 67 // allows simpler definition of VectorSets 68 #define VECTORSET(container_type) VectorSet<container_type<Vector> > 69 54 70 #endif /* VECTORSET_HPP_ */ -
src/World.cpp
r192f6e r4e10f5 22 22 #include "Actions/ManipulateAtomsProcess.hpp" 23 23 #include "Helpers/Assert.hpp" 24 #include "Box.hpp" 25 #include "Matrix.hpp" 24 26 25 27 #include "Patterns/Singleton_impl.hpp" … … 74 76 // system 75 77 76 double * World::getDomain() { 77 return cell_size; 78 Box& World::getDomain() { 79 return *cell_size; 80 } 81 82 void World::setDomain(const Matrix &mat){ 83 *cell_size = mat; 78 84 } 79 85 80 86 void World::setDomain(double * matrix) 81 87 { 82 OBSERVE; 83 cell_size[0] = matrix[0]; 84 cell_size[1] = matrix[1]; 85 cell_size[2] = matrix[2]; 86 cell_size[3] = matrix[3]; 87 cell_size[4] = matrix[4]; 88 cell_size[5] = matrix[5]; 88 Matrix M = ReturnFullMatrixforSymmetric(matrix); 89 cell_size->setM(M); 89 90 } 90 91 … … 139 140 molecules.erase(id); 140 141 } 141 142 double *World::cell_size = NULL;143 142 144 143 atom *World::createAtom(){ … … 303 302 molecules_deprecated(new MoleculeListClass(this)) 304 303 { 305 cell_size = new double[6]; 306 cell_size[0] = 20.; 307 cell_size[1] = 0.; 308 cell_size[2] = 20.; 309 cell_size[3] = 0.; 310 cell_size[4] = 0.; 311 cell_size[5] = 20.; 304 cell_size = new Box; 305 Matrix domain; 306 domain.at(0,0) = 20; 307 domain.at(1,1) = 20; 308 domain.at(2,2) = 20; 309 cell_size->setM(domain); 312 310 defaultName = "none"; 313 311 molecules_deprecated->signOn(this); … … 317 315 { 318 316 molecules_deprecated->signOff(this); 319 delete []cell_size;317 delete cell_size; 320 318 delete molecules_deprecated; 321 319 delete periode; -
src/World.hpp
r192f6e r4e10f5 34 34 class AtomDescriptor_impl; 35 35 template<typename T> class AtomsCalculation; 36 class Box; 36 37 class config; 37 38 class ManipulateAtomsProcess; 39 class Matrix; 38 40 class molecule; 39 41 class MoleculeDescriptor; … … 125 127 * get the domain size as a symmetric matrix (6 components) 126 128 */ 127 double * getDomain(); 129 Box& getDomain(); 130 131 /** 132 * Set the domain size from a matrix object 133 * 134 * Matrix needs to be symmetric 135 */ 136 void setDomain(const Matrix &mat); 128 137 129 138 /** … … 257 266 periodentafel *periode; 258 267 config *configuration; 259 static double*cell_size;268 Box *cell_size; 260 269 std::string defaultName; 261 270 class ThermoStatContainer *Thermostats; -
src/analysis_bonds.cpp
r192f6e r4e10f5 13 13 #include "element.hpp" 14 14 #include "info.hpp" 15 #include "verbose.hpp" 15 16 #include "log.hpp" 16 17 #include "molecule.hpp" -
src/analysis_correlation.cpp
r192f6e r4e10f5 9 9 10 10 #include <iostream> 11 #include <iomanip> 11 12 12 13 #include "analysis_correlation.hpp" … … 19 20 #include "triangleintersectionlist.hpp" 20 21 #include "vector.hpp" 22 #include "Matrix.hpp" 21 23 #include "verbose.hpp" 22 24 #include "World.hpp" 25 #include "Box.hpp" 23 26 24 27 … … 34 37 PairCorrelationMap *outmap = NULL; 35 38 double distance = 0.; 36 double *domain = World::getInstance().getDomain();39 Box &domain = World::getInstance().getDomain(); 37 40 38 41 if (molecules->ListOfMolecules.empty()) { … … 75 78 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 76 79 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); 78 81 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; 79 82 outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> ((*iter), (*runner)) ) ); … … 135 138 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++){ 136 139 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(); 139 142 DoeLog(2) && (eLog()<< Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 140 143 eLog() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl; 141 144 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { 142 145 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 145 147 // go through every range in xyz and get distance 146 148 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 147 149 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 148 150 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); 151 152 for (MoleculeList::const_iterator MolOtherWalker = MolWalker; MolOtherWalker != molecules->ListOfMolecules.end(); MolOtherWalker++){ 152 153 if ((*MolOtherWalker)->ActiveFlag) { … … 157 158 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 158 159 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 161 161 // go through every range in xyz and get distance 162 162 for (Othern[0]=-ranges[0]; Othern[0] <= ranges[0]; Othern[0]++) 163 163 for (Othern[1]=-ranges[1]; Othern[1] <= ranges[1]; Othern[1]++) 164 164 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); 167 166 distance = checkX.distance(checkOtherX); 168 167 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; … … 176 175 } 177 176 } 178 delete[](FullMatrix);179 delete[](FullInverseMatrix);180 177 } 181 178 } … … 195 192 CorrelationToPointMap *outmap = NULL; 196 193 double distance = 0.; 197 double *cell_size= World::getInstance().getDomain();194 Box &domain = World::getInstance().getDomain(); 198 195 199 196 if (molecules->ListOfMolecules.empty()) { … … 211 208 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 212 209 if ((*type == NULL) || ((*iter)->type == *type)) { 213 distance = (*iter)->node->PeriodicDistance(*point, cell_size);210 distance = domain.periodicDistance(*(*iter)->node,*point); 214 211 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); 215 212 outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> ((*iter), point) ) ); … … 246 243 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 247 244 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(); 250 247 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 251 248 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 253 250 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 254 251 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 257 253 // go through every range in xyz and get distance 258 254 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 259 255 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 260 256 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); 263 258 distance = checkX.distance(*point); 264 259 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); … … 267 262 } 268 263 } 269 delete[](FullMatrix);270 delete[](FullInverseMatrix);271 264 } 272 265 … … 352 345 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 353 346 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(); 356 349 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 357 350 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 359 352 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 360 353 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 363 355 // go through every range in xyz and get distance 364 356 ShortestDistance = -1.; … … 366 358 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 367 359 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); 370 361 TriangleIntersectionList Intersections(&checkX,Surface,LC); 371 362 distance = Intersections.GetSmallestDistance(); … … 381 372 } 382 373 } 383 delete[](FullMatrix);384 delete[](FullInverseMatrix);385 374 } 386 375 -
src/analysis_correlation.hpp
r192f6e r4e10f5 26 26 27 27 #include "atom.hpp" 28 #include "verbose.hpp" 28 29 29 30 /****************************************** forward declarations *****************************/ -
src/analyzer.cpp
r192f6e r4e10f5 14 14 #include "datacreator.hpp" 15 15 #include "helpers.hpp" 16 #include "memoryallocator.hpp"17 16 #include "parser.hpp" 18 17 #include "periodentafel.hpp" 18 #include "verbose.hpp" 19 19 20 20 // include config.h -
src/atom.cpp
r192f6e r4e10f5 12 12 #include "element.hpp" 13 13 #include "lists.hpp" 14 #include "memoryallocator.hpp"15 14 #include "parser.hpp" 16 15 #include "vector.hpp" 17 16 #include "World.hpp" 18 17 #include "molecule.hpp" 18 #include "Shapes/Shape.hpp" 19 20 #include <iomanip> 19 21 20 22 /************************************* Functions for class atom *************************************/ … … 112 114 * \return true - is inside, false - is not 113 115 */ 114 bool atom::IsIn Parallelepiped(const Vector offset, const double *parallelepiped) const115 { 116 return (node->IsInParallelepiped(offset, parallelepiped));116 bool atom::IsInShape(const Shape& shape) const 117 { 118 return shape.isInside(*node); 117 119 }; 118 120 -
src/atom.hpp
r192f6e r4e10f5 18 18 #endif 19 19 20 #include <ios tream>20 #include <iosfwd> 21 21 #include <list> 22 22 #include <vector> … … 35 35 class World; 36 36 class molecule; 37 class Shape; 37 38 38 39 /********************************************** declarations *******************************/ … … 66 67 double DistanceToVector(const Vector &origin) const; 67 68 double DistanceSquaredToVector(const Vector &origin) const; 68 bool IsIn Parallelepiped(const Vector offset, const double *parallelepiped) const;69 bool IsInShape(const Shape&) const; 69 70 70 71 // getter and setter -
src/atom_graphnodeinfo.cpp
r192f6e r4e10f5 9 9 10 10 #include "atom_graphnodeinfo.hpp" 11 #include "memoryallocator.hpp"12 11 13 12 /** Constructor of class GraphNodeInfo. 14 13 */ 15 GraphNodeInfo::GraphNodeInfo() : GraphNr(-1), ComponentNr( NULL), LowpointNr(-1), SeparationVertex(false), IsCyclic(false), Ancestor(NULL) {};14 GraphNodeInfo::GraphNodeInfo() : GraphNr(-1), ComponentNr(0), LowpointNr(-1), SeparationVertex(false), IsCyclic(false), Ancestor(0) {}; 16 15 17 16 /** Destructor of class GraphNodeInfo. -
src/atom_particleinfo.cpp
r192f6e r4e10f5 9 9 10 10 #include "atom_particleinfo.hpp" 11 #include "memoryallocator.hpp" 11 12 #include <iostream> 12 13 13 14 /** Constructor of ParticleInfo. -
src/atom_particleinfo.hpp
r192f6e r4e10f5 18 18 #endif 19 19 20 #include <iostream> 20 #include <iosfwd> 21 #include <string> 21 22 22 23 /****************************************** forward declarations *****************************/ -
src/atom_trajectoryparticle.hpp
r192f6e r4e10f5 20 20 #include <fstream> 21 21 22 #include <gsl/gsl_inline.h> 22 23 #include <gsl/gsl_randist.h> 23 24 -
src/bond.cpp
r192f6e r4e10f5 7 7 #include "Helpers/MemDebug.hpp" 8 8 9 #include "verbose.hpp" 9 10 #include "atom.hpp" 10 11 #include "bond.hpp" -
src/bondgraph.cpp
r192f6e r4e10f5 15 15 #include "element.hpp" 16 16 #include "info.hpp" 17 #include "verbose.hpp" 17 18 #include "log.hpp" 18 19 #include "molecule.hpp" -
src/bondgraph.hpp
r192f6e r4e10f5 18 18 #endif 19 19 20 #include <ios tream>20 #include <iosfwd> 21 21 22 22 /*********************************************** defines ***********************************/ -
src/boundary.cpp
r192f6e r4e10f5 15 15 #include "info.hpp" 16 16 #include "linkedcell.hpp" 17 #include "verbose.hpp" 17 18 #include "log.hpp" 18 #include "memoryallocator.hpp"19 19 #include "molecule.hpp" 20 20 #include "tesselation.hpp" … … 22 22 #include "World.hpp" 23 23 #include "Plane.hpp" 24 #include "Matrix.hpp" 25 #include "Box.hpp" 26 27 #include <iostream> 28 #include <iomanip> 24 29 25 30 #include<gsl/gsl_poly.h> … … 769 774 int N[NDIM]; 770 775 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(); 774 779 Vector AtomTranslations; 775 780 Vector FillerTranslations; … … 804 809 805 810 // 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]); 808 812 for(int i=0;i<NDIM;i++) 809 813 N[i] = (int) ceil(1./FillerDistance[i]); … … 818 822 for (n[2] = 0; n[2] < N[2]; n[2]++) { 819 823 // 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]); 822 825 // create molecule random translation vector ... 823 826 for (int i=0;i<NDIM;i++) … … 840 843 } 841 844 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]) ); 851 854 } 852 855 … … 854 857 Inserter = (*iter)->x; 855 858 if (DoRandomRotation) 856 Inserter .MatrixMultiplication(Rotations);859 Inserter *= Rotations; 857 860 Inserter += AtomTranslations + FillerTranslations + CurrentPosition; 858 861 859 862 // check whether inserter is inside box 860 Inserter .MatrixMultiplication(MInverse);863 Inserter *= MInverse; 861 864 FillIt = true; 862 865 for (int i=0;i<NDIM;i++) 863 866 FillIt = FillIt && (Inserter[i] >= -MYEPSILON) && ((Inserter[i]-1.) <= MYEPSILON); 864 Inserter .MatrixMultiplication(M);867 Inserter *= M; 865 868 866 869 // Check whether point is in- or outside … … 901 904 delete TesselStruct[(*ListRunner)]; 902 905 } 903 delete[](M);904 delete[](MInverse);905 906 906 907 return Filling; -
src/boundary.hpp
r192f6e r4e10f5 12 12 13 13 #include <fstream> 14 #include <ios tream>14 #include <iosfwd> 15 15 16 16 // STL headers -
src/builder.cpp
r192f6e r4e10f5 60 60 #include "config.hpp" 61 61 #include "log.hpp" 62 #include "memoryusageobserver.hpp"63 62 #include "molecule.hpp" 64 63 #include "periodentafel.hpp" -
src/config.cpp
r192f6e r4e10f5 19 19 #include "info.hpp" 20 20 #include "lists.hpp" 21 #include "verbose.hpp" 21 22 #include "log.hpp" 22 23 #include "molecule.hpp" 23 #include "memoryallocator.hpp"24 24 #include "molecule.hpp" 25 25 #include "periodentafel.hpp" 26 26 #include "ThermoStatContainer.hpp" 27 27 #include "World.hpp" 28 #include "Matrix.hpp" 29 #include "Box.hpp" 28 30 29 31 /************************************* Functions for class config ***************************/ … … 679 681 // Unit cell and magnetic field 680 682 ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 681 double * c onst cell_size = World::getInstance().getDomain();683 double * cell_size = new double[6]; 682 684 cell_size[0] = BoxLength[0]; 683 685 cell_size[1] = BoxLength[3]; … … 686 688 cell_size[4] = BoxLength[7]; 687 689 cell_size[5] = BoxLength[8]; 690 World::getInstance().setDomain(cell_size); 691 delete cell_size; 688 692 //if (1) fprintf(stderr,"\n"); 689 693 … … 883 887 884 888 ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 885 double * c onst cell_size = World::getInstance().getDomain();889 double * cell_size = new double[6]; 886 890 cell_size[0] = BoxLength[0]; 887 891 cell_size[1] = BoxLength[3]; … … 890 894 cell_size[4] = BoxLength[7]; 891 895 cell_size[5] = BoxLength[8]; 896 World::getInstance().setDomain(cell_size); 897 delete[] cell_size; 892 898 if (1) fprintf(stderr,"\n"); 893 899 config::DoPerturbation = 0; … … 1027 1033 // bring MaxTypes up to date 1028 1034 mol->CountElements(); 1029 const double * const cell_size = World::getInstance().getDomain();1035 const Matrix &domain = World::getInstance().getDomain().getM(); 1030 1036 ofstream * const output = new ofstream(filename, ios::out); 1031 1037 if (output != NULL) { … … 1098 1104 *output << endl; 1099 1105 *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; 1103 1109 // FIXME 1104 1110 *output << endl; -
src/datacreator.cpp
r192f6e r4e10f5 12 12 #include "helpers.hpp" 13 13 #include "parser.hpp" 14 #include "verbose.hpp" 15 16 #include <iomanip> 14 17 15 18 //=========================== FUNCTIONS============================ -
src/datacreator.hpp
r192f6e r4e10f5 10 10 using namespace std; 11 11 12 #include <ios tream>12 #include <iosfwd> 13 13 14 14 /****************************************** forward declarations *****************************/ -
src/element.hpp
r192f6e r4e10f5 16 16 #endif 17 17 18 #include <ios tream>18 #include <iosfwd> 19 19 #include <string> 20 20 -
src/ellipsoid.cpp
r192f6e r4e10f5 21 21 #include "tesselation.hpp" 22 22 #include "vector.hpp" 23 #include "Matrix.hpp" 23 24 #include "verbose.hpp" 24 25 … … 34 35 Vector helper, RefPoint; 35 36 double distance = -1.; 36 double Matrix[NDIM*NDIM];37 Matrix Matrix; 37 38 double InverseLength[3]; 38 39 double psi,theta,phi; // euler angles in ZX'Z'' convention … … 51 52 theta = EllipsoidAngle[1]; 52 53 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; 63 64 helper.ScaleAll(InverseLength); 64 65 //Log() << Verbose(4) << "Transformed RefPoint is at " << helper << "." << endl; … … 73 74 phi = -EllipsoidAngle[2]; 74 75 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; 85 86 //Log() << Verbose(4) << "Intersection is at " << helper << "." << endl; 86 87 -
src/errorlogger.cpp
r192f6e r4e10f5 9 9 10 10 #include <fstream> 11 #include <iostream> 11 12 #include "errorlogger.hpp" 12 13 #include "verbose.hpp" -
src/errorlogger.hpp
r192f6e r4e10f5 9 9 #define ERRORLOGGER_HPP_ 10 10 11 #include <ios tream>11 #include <iosfwd> 12 12 13 13 #include "Patterns/Singleton.hpp" -
src/graph.cpp
r192f6e r4e10f5 13 13 #include "config.hpp" 14 14 #include "graph.hpp" 15 #include "verbose.hpp" 15 16 #include "log.hpp" 16 17 #include "molecule.hpp" -
src/graph.hpp
r192f6e r4e10f5 27 27 class molecule; 28 28 29 class Graph;30 29 class SubGraph; 31 30 class Node; … … 34 33 /********************************************** definitions *********************************/ 35 34 36 #define NodeMap pair < int, class Node* > 37 #define EdgeMap multimap < class Node*, class Edge* > 35 typedef std::pair < int, class Node* > NodeMap; 36 typedef std::multimap < class Node*, class Edge* > EdgeMap; 38 37 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> 38 typedef std::deque<int> KeyStack; 39 typedef std::set<int> KeySet; 40 typedef std::pair<int, double> NumberValuePair; 46 41 47 48 /******************************** Some small functions and/or structures **********************************/ 49 42 // needed for definition of Graph and GraphTestPair 50 43 struct KeyCompare 51 44 { 52 45 bool operator() (const KeySet SubgraphA, const KeySet SubgraphB) const; 53 46 }; 47 48 typedef std::map <KeySet, NumberValuePair, KeyCompare > Graph; 49 typedef std::pair <KeySet, NumberValuePair > GraphPair; 50 typedef std::pair<KeySet::iterator, bool> KeySetTestPair; 51 typedef std::pair<Graph::iterator, bool> GraphTestPair; 52 53 54 /******************************** Some small functions and/or structures **********************************/ 54 55 55 56 //bool operator < (KeySet SubgraphA, KeySet SubgraphB); //note: this declaration is important, otherwise normal < is used (producing wrong order) -
src/gslvector.cpp
r192f6e r4e10f5 10 10 #include <cassert> 11 11 #include <cmath> 12 #include <iostream> 12 13 13 14 #include "gslvector.hpp" 14 15 #include "defs.hpp" 15 16 #include "vector.hpp" 17 #include "VectorContent.hpp" 16 18 17 19 /** Constructor of class GSLVector. … … 69 71 */ 70 72 void GSLVector::SetFromVector(Vector &v){ 71 gsl_vector_memcpy (vector, v.get() );73 gsl_vector_memcpy (vector, v.get()->content); 72 74 } 73 75 -
src/gslvector.hpp
r192f6e r4e10f5 18 18 #endif 19 19 20 #include <ios tream>20 #include <iosfwd> 21 21 #include <gsl/gsl_vector.h> 22 22 -
src/helpers.cpp
r192f6e r4e10f5 8 8 #include "helpers.hpp" 9 9 #include "Helpers/fast_functions.hpp" 10 #include "verbose.hpp" 10 11 #include "log.hpp" 11 #include "memoryusageobserver.hpp" 12 13 #include <iostream> 12 14 13 15 /********************************************** helpful functions *********************************/ … … 117 119 }; 118 120 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 components121 * \return allocated NDIM*NDIM array with the symmetric matrix122 */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 array140 */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 B150 if (fabs(detA) > MYEPSILON) {; // RDET3(A) yields precisely zero if A irregular151 detAReci = 1./detA;152 B[0] = detAReci*RDET2(A[4],A[5],A[7],A[8]); // A_11153 B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]); // A_12154 B[2] = detAReci*RDET2(A[1],A[2],A[4],A[5]); // A_13155 B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]); // A_21156 B[4] = detAReci*RDET2(A[0],A[2],A[6],A[8]); // A_22157 B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]); // A_23158 B[6] = detAReci*RDET2(A[3],A[4],A[6],A[7]); // A_31159 B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]); // A_32160 B[8] = detAReci*RDET2(A[0],A[1],A[3],A[4]); // A_33161 }162 return B;163 };164 165 166 167 121 /** Comparison function for GSL heapsort on distances in two molecules. 168 122 * \param *a -
src/helpers.hpp
r192f6e r4e10f5 20 20 #include "defs.hpp" 21 21 #include "log.hpp" 22 #include "memoryallocator.hpp"23 22 24 23 /********************************************** definitions *********************************/ … … 52 51 bool IsValidNumber( const char *string); 53 52 int CompareDoubles (const void * a, const void * b); 54 double * ReturnFullMatrixforSymmetric(const double * const cell_size);55 double * InverseMatrix(const double * const A);56 53 void performCriticalExit(); 57 54 -
src/joiner.cpp
r192f6e r4e10f5 14 14 #include "datacreator.hpp" 15 15 #include "helpers.hpp" 16 #include "memoryallocator.hpp"17 16 #include "parser.hpp" 18 17 #include "periodentafel.hpp" 18 #include "verbose.hpp" 19 19 20 20 //============================== MAIN ============================= -
src/linkedcell.cpp
r192f6e r4e10f5 10 10 #include "helpers.hpp" 11 11 #include "linkedcell.hpp" 12 #include "verbose.hpp" 12 13 #include "log.hpp" 13 14 #include "molecule.hpp" -
src/logger.cpp
r192f6e r4e10f5 9 9 10 10 #include <fstream> 11 #include <iostream> 11 12 #include "logger.hpp" 12 13 #include "verbose.hpp" -
src/logger.hpp
r192f6e r4e10f5 9 9 #define LOGGER_HPP_ 10 10 11 #include <ios tream>11 #include <iosfwd> 12 12 13 13 #include "Patterns/Singleton.hpp" -
src/molecule.cpp
r192f6e r4e10f5 5 5 */ 6 6 7 #ifdef HAVE_CONFIG_H 8 #include <config.h> 9 #endif 10 7 11 #include "Helpers/MemDebug.hpp" 8 12 9 13 #include <cstring> 10 14 #include <boost/bind.hpp> 15 #include <boost/foreach.hpp> 16 17 #include <gsl/gsl_inline.h> 18 #include <gsl/gsl_heapsort.h> 11 19 12 20 #include "World.hpp" … … 22 30 #include "log.hpp" 23 31 #include "molecule.hpp" 24 #include "memoryallocator.hpp" 32 25 33 #include "periodentafel.hpp" 26 34 #include "stackclass.hpp" 27 35 #include "tesselation.hpp" 28 36 #include "vector.hpp" 37 #include "Matrix.hpp" 29 38 #include "World.hpp" 39 #include "Box.hpp" 30 40 #include "Plane.hpp" 31 41 #include "Exceptions/LinearDependenceException.hpp" … … 284 294 Vector Orthovector1, Orthovector2; // temporary vectors in coordination construction 285 295 Vector InBondvector; // vector in direction of *Bond 286 double *matrix = NULL;296 const Matrix &matrix = World::getInstance().getDomain().getM(); 287 297 bond *Binder = NULL; 288 double * const cell_size = World::getInstance().getDomain();289 298 290 299 // Log() << Verbose(3) << "Begin of AddHydrogenReplacementAtom." << endl; … … 307 316 } // (signs are correct, was tested!) 308 317 } 309 matrix = ReturnFullMatrixforSymmetric(cell_size); 310 Orthovector1.MatrixMultiplication(matrix); 318 Orthovector1 *= matrix; 311 319 InBondvector -= Orthovector1; // subtract just the additional translation 312 delete[](matrix);313 320 bondlength = InBondvector.Norm(); 314 321 // Log() << Verbose(4) << "Corrected InBondvector is now: "; … … 541 548 break; 542 549 } 543 delete[](matrix);544 550 545 551 // Log() << Verbose(3) << "End of AddHydrogenReplacementAtom." << endl; … … 660 666 * @param three vectors forming the matrix that defines the shape of the parallelpiped 661 667 */ 662 molecule* molecule::CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const {668 molecule* molecule::CopyMoleculeFromSubRegion(const Shape ®ion) const { 663 669 molecule *copy = World::getInstance().createMolecule(); 664 670 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 } 666 676 667 677 //TODO: copy->BuildInducedSubgraph(this); … … 750 760 void molecule::SetBoxDimension(Vector *dim) 751 761 { 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); 759 766 }; 760 767 … … 849 856 bool molecule::CheckBounds(const Vector *x) const 850 857 { 851 double * const cell_size = World::getInstance().getDomain();858 const Matrix &domain = World::getInstance().getDomain().getM(); 852 859 bool result = true; 853 int j =-1;854 860 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))); 857 862 } 858 863 //return result; -
src/molecule.hpp
r192f6e r4e10f5 7 7 #define MOLECULES_HPP_ 8 8 9 using namespace std;10 11 9 /*********************************************** includes ***********************************/ 12 10 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 21 14 22 15 //// STL headers … … 31 24 #include "types.hpp" 32 25 #include "graph.hpp" 33 #include "stackclass.hpp"34 26 #include "tesselation.hpp" 35 27 #include "Patterns/Observer.hpp" … … 53 45 class periodentafel; 54 46 class Vector; 47 class Shape; 48 template <class> class StackClass; 55 49 56 50 /******************************** Some definitions for easier reading **********************************/ … … 316 310 317 311 molecule *CopyMolecule(); 318 molecule* CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const;312 molecule* CopyMoleculeFromSubRegion(const Shape&) const; 319 313 320 314 /// Fragment molecule by two different approaches: -
src/molecule_dynamics.cpp
r192f6e r4e10f5 13 13 #include "element.hpp" 14 14 #include "info.hpp" 15 #include "verbose.hpp" 15 16 #include "log.hpp" 16 #include "memoryallocator.hpp"17 17 #include "molecule.hpp" 18 18 #include "parser.hpp" 19 19 #include "Plane.hpp" 20 20 #include "ThermoStatContainer.hpp" 21 22 #include <gsl/gsl_matrix.h> 23 #include <gsl/gsl_vector.h> 24 #include <gsl/gsl_linalg.h> 21 25 22 26 /************************************* Functions for class molecule *********************************/ -
src/molecule_fragmentation.cpp
r192f6e r4e10f5 17 17 #include "helpers.hpp" 18 18 #include "lists.hpp" 19 #include "verbose.hpp" 19 20 #include "log.hpp" 20 #include "memoryallocator.hpp"21 21 #include "molecule.hpp" 22 22 #include "periodentafel.hpp" 23 23 #include "World.hpp" 24 #include "Matrix.hpp" 25 #include "Box.hpp" 26 #include "stackclass.hpp" 24 27 25 28 /************************************* Functions for class molecule *********************************/ … … 1716 1719 atom *Walker = NULL; 1717 1720 atom *OtherWalker = NULL; 1718 double * const cell_size = World::getInstance().getDomain(); 1719 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 1721 Matrix matrix = World::getInstance().getDomain().getM(); 1720 1722 enum Shading *ColorList = NULL; 1721 1723 double tmp; … … 1757 1759 Translationvector[i] = (tmp < 0) ? +1. : -1.; 1758 1760 } 1759 Translationvector .MatrixMultiplication(matrix);1761 Translationvector *= matrix; 1760 1762 //Log() << Verbose(3) << "Translation vector is "; 1761 1763 Log() << Verbose(0) << Translationvector << endl; … … 1788 1790 delete(AtomStack); 1789 1791 delete[](ColorList); 1790 delete[](matrix);1791 1792 DoLog(2) && (Log() << Verbose(2) << "End of ScanForPeriodicCorrection." << endl); 1792 1793 }; -
src/molecule_geometry.cpp
r192f6e r4e10f5 5 5 * Author: heber 6 6 */ 7 8 #ifdef HAVE_CONFIG_H 9 #include <config.h> 10 #endif 7 11 8 12 #include "Helpers/MemDebug.hpp" … … 14 18 #include "helpers.hpp" 15 19 #include "leastsquaremin.hpp" 20 #include "verbose.hpp" 16 21 #include "log.hpp" 17 #include "memoryallocator.hpp"18 22 #include "molecule.hpp" 19 23 #include "World.hpp" 20 24 #include "Plane.hpp" 25 #include "Matrix.hpp" 26 #include "Box.hpp" 21 27 #include <boost/foreach.hpp> 28 29 #include <gsl/gsl_eigen.h> 30 #include <gsl/gsl_multimin.h> 22 31 23 32 … … 33 42 const Vector *Center = DetermineCenterOfAll(); 34 43 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(); 38 45 39 46 // go through all atoms 40 47 ActOnAllVectors( &Vector::SubtractVector, *Center); 41 48 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 46 53 delete(Center); 47 54 delete(CenterBox); … … 56 63 { 57 64 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(); 61 66 62 67 // 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 67 72 return status; 68 73 }; … … 153 158 { 154 159 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; 161 162 return a; 162 163 }; … … 244 245 void molecule::TranslatePeriodically(const Vector *trans) 245 246 { 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(); 249 248 250 249 // go through all atoms 251 250 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 256 255 }; 257 256 … … 264 263 OBSERVE; 265 264 Plane p(*n,0); 266 BOOST_FOREACH( 265 BOOST_FOREACH(atom* iter, atoms ){ 267 266 (*iter->node) = p.mirrorVector(*iter->node); 268 267 } … … 274 273 void molecule::DeterminePeriodicCenter(Vector ¢er) 275 274 { 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(); 279 277 double tmp; 280 278 bool flag; … … 288 286 if ((*iter)->type->Z != 1) { 289 287 #endif 290 Testvector = (*iter)->x; 291 Testvector.MatrixMultiplication(inversematrix); 288 Testvector = inversematrix * (*iter)->x; 292 289 Translationvector.Zero(); 293 290 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { … … 306 303 } 307 304 Testvector += Translationvector; 308 Testvector .MatrixMultiplication(matrix);305 Testvector *= matrix; 309 306 Center += Testvector; 310 307 Log() << Verbose(1) << "vector is: " << Testvector << endl; … … 313 310 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { 314 311 if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) { 315 Testvector = (*Runner)->GetOtherAtom((*iter))->x; 316 Testvector.MatrixMultiplication(inversematrix); 312 Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x; 317 313 Testvector += Translationvector; 318 Testvector .MatrixMultiplication(matrix);314 Testvector *= matrix; 319 315 Center += Testvector; 320 316 Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl; … … 325 321 } 326 322 } while (!flag); 327 delete[](matrix);328 delete[](inversematrix);329 323 330 324 Center.Scale(1./static_cast<double>(getAtomCount())); … … 388 382 DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... "); 389 383 // 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 } 391 388 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 392 389 -
src/molecule_graph.cpp
r192f6e r4e10f5 5 5 * Author: heber 6 6 */ 7 8 #ifdef HAVE_CONFIG_H 9 #include <config.h> 10 #endif 7 11 8 12 #include "Helpers/MemDebug.hpp" … … 18 22 #include "linkedcell.hpp" 19 23 #include "lists.hpp" 24 #include "verbose.hpp" 20 25 #include "log.hpp" 21 #include "memoryallocator.hpp"22 26 #include "molecule.hpp" 23 27 #include "World.hpp" 24 28 #include "Helpers/fast_functions.hpp" 25 29 #include "Helpers/Assert.hpp" 26 30 #include "Matrix.hpp" 31 #include "Box.hpp" 32 #include "stackclass.hpp" 27 33 28 34 struct BFSAccounting … … 121 127 LinkedCell *LC = NULL; 122 128 bool free_BG = false; 123 double * const cell_size= World::getInstance().getDomain();129 Box &domain = World::getInstance().getDomain(); 124 130 125 131 if (BG == NULL) { … … 178 184 //Log() << Verbose(1) << "Checking distance " << OtherWalker->x.PeriodicDistanceSquared(&(Walker->x), cell_size) << " against typical bond length of " << bonddistance*bonddistance << "." << endl; 179 185 (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); 181 187 const bool status = (distance <= MaxDistance * MaxDistance) && (distance >= MinDistance * MinDistance); 182 188 // Log() << Verbose(1) << "MinDistance is " << MinDistance << " and MaxDistance is " << MaxDistance << "." << endl; … … 579 585 // From OldGraphNr to CurrentGraphNr ranges an disconnected subgraph 580 586 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))); 582 588 DoLog(0) && (Log() << Verbose(0) << endl); 583 589 -
src/molecule_pointcloud.cpp
r192f6e r4e10f5 11 11 #include "config.hpp" 12 12 #include "info.hpp" 13 #include "memoryallocator.hpp"14 13 #include "molecule.hpp" 15 14 -
src/moleculelist.cpp
r192f6e r4e10f5 5 5 */ 6 6 7 #ifdef HAVE_CONFIG_H 8 #include <config.h> 9 #endif 10 7 11 #include "Helpers/MemDebug.hpp" 8 12 9 13 #include <cstring> 14 15 #include <gsl/gsl_inline.h> 16 #include <gsl/gsl_heapsort.h> 10 17 11 18 #include "World.hpp" … … 19 26 #include "linkedcell.hpp" 20 27 #include "lists.hpp" 28 #include "verbose.hpp" 21 29 #include "log.hpp" 22 30 #include "molecule.hpp" 23 #include "memoryallocator.hpp"24 31 #include "periodentafel.hpp" 25 32 #include "Helpers/Assert.hpp" 33 #include "Matrix.hpp" 34 #include "Box.hpp" 35 #include "stackclass.hpp" 26 36 27 37 #include "Helpers/Assert.hpp" … … 631 641 int FragmentCounter = 0; 632 642 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 639 646 // store the fragments as config and as xyz 640 647 for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) { … … 674 681 (*ListRunner)->CenterEdge(&BoxDimension); 675 682 (*ListRunner)->SetBoxDimension(&BoxDimension); // update Box of atoms by boundary 676 int j = -1;677 683 for (int k = 0; k < NDIM; k++) { 678 j += k + 1;679 684 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); 682 688 (*ListRunner)->Translate(&BoxDimension); 683 689 … … 725 731 726 732 // 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); 729 734 730 735 return result; … … 887 892 // center at set box dimensions 888 893 mol->CenterEdge(¢er); 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); 895 898 insert(mol); 896 899 } -
src/parser.cpp
r192f6e r4e10f5 12 12 13 13 #include "helpers.hpp" 14 #include "memoryallocator.hpp"15 14 #include "parser.hpp" 15 #include "verbose.hpp" 16 16 17 17 // include config.h -
src/periodentafel.hpp
r192f6e r4e10f5 9 9 #endif 10 10 11 #include <ios tream>11 #include <iosfwd> 12 12 #include <map> 13 #include <iterator>14 13 15 14 #include "unittests/periodentafelTest.hpp" -
src/stackclass.hpp
r192f6e r4e10f5 12 12 13 13 #include "verbose.hpp" 14 #include " memoryallocator.hpp"14 #include "log.hpp" 15 15 16 16 /****************************************** forward declarations *****************************/ -
src/tesselation.cpp
r192f6e r4e10f5 9 9 10 10 #include <fstream> 11 #include <iomanip> 11 12 12 13 #include "helpers.hpp" -
src/tesselationhelpers.cpp
r192f6e r4e10f5 21 21 #include "verbose.hpp" 22 22 #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" 53 24 54 25 void GetSphere(Vector * const center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS) 55 26 { 56 27 Info FunctionInfo(__func__); 57 gsl_matrix *A = gsl_matrix_calloc(3,3);28 Matrix mat; 58 29 double m11, m12, m13, m14; 59 30 60 31 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(); 66 37 67 38 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(); 73 44 74 45 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(); 80 51 81 52 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(); 87 58 88 59 if (fabs(m11) < MYEPSILON) … … 95 66 if (fabs(a.distance(*center) - RADIUS) > MYEPSILON) 96 67 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);99 68 }; 100 69 … … 248 217 Vector x3; 249 218 Vector x4; 250 };251 252 /**253 * Intersection calculation function.254 *255 * @param x to find the result for256 * @param function parameter257 */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 line284 * always goes through point 1 and point 2 and the second line is given by the285 * connection between point 4 and point 5.286 *287 * @param point 1 of line 1288 * @param point 2 of line 1289 * @param point 1 of line 2290 * @param point 2 of line 2291 *292 * @return true if there is an intersection between the given lines, false otherwise293 */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 *)∥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 not349 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 stuff378 gsl_vector_free(x);379 gsl_vector_free(ss);380 gsl_multimin_fminimizer_free(s);381 382 return result;383 219 }; 384 220 -
src/tesselationhelpers.hpp
r192f6e r4e10f5 20 20 #endif 21 21 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> 29 23 30 24 #include "defs.hpp" … … 47 41 /********************************************** declarations *******************************/ 48 42 49 double DetGet(gsl_matrix * const A, const int inPlace);50 43 void GetSphere(Vector * const Center, const Vector &a, const Vector &b, const Vector &c, const double RADIUS); 51 44 void 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); 52 45 void GetCenterofCircumcircle(Vector * const Center, const Vector &a, const Vector &b, const Vector &c); 53 46 double 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);56 47 double CalculateVolumeofGeneralTetraeder(const Vector &a, const Vector &b, const Vector &c, const Vector &d); 57 48 double CalculateAreaofGeneralTriangle(const Vector &A, const Vector &B, const Vector &C); -
src/triangleintersectionlist.cpp
r192f6e r4e10f5 18 18 #include "tesselation.hpp" 19 19 #include "vector.hpp" 20 #include "verbose.hpp" 20 21 21 22 /** Constructor for class TriangleIntersectionList. -
src/unittests/ActOnAllUnitTest.cpp
r192f6e r4e10f5 14 14 #include "../test/ActOnAlltest.hpp" 15 15 #include "ActOnAllUnitTest.hpp" 16 #include "memoryallocator.hpp"17 16 #include "vector.hpp" 18 17 -
src/unittests/LineUnittest.cpp
r192f6e r4e10f5 17 17 18 18 #include <iostream> 19 #include <cmath> 19 20 20 21 using namespace std; … … 352 353 CPPUNIT_ASSERT_EQUAL(fixture,zeroVec); 353 354 } 355 356 void LineUnittest::sphereIntersectionTest(){ 357 { 358 std::vector<Vector> res = la1->getSphereIntersections(); 359 CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2); 360 CPPUNIT_ASSERT(testDirection(res[0],e1)); 361 CPPUNIT_ASSERT(testDirection(res[1],e1)); 362 CPPUNIT_ASSERT(res[0]!=res[1]); 363 } 364 365 { 366 std::vector<Vector> res = la2->getSphereIntersections(); 367 CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2); 368 CPPUNIT_ASSERT(testDirection(res[0],e2)); 369 CPPUNIT_ASSERT(testDirection(res[1],e2)); 370 CPPUNIT_ASSERT(res[0]!=res[1]); 371 } 372 373 { 374 std::vector<Vector> res = la3->getSphereIntersections(); 375 CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2); 376 CPPUNIT_ASSERT(testDirection(res[0],e3)); 377 CPPUNIT_ASSERT(testDirection(res[1],e3)); 378 CPPUNIT_ASSERT(res[0]!=res[1]); 379 } 380 381 { 382 std::vector<Vector> res = lp1->getSphereIntersections(); 383 CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2); 384 CPPUNIT_ASSERT((res[0]==e1) || (res[0]==e2)); 385 CPPUNIT_ASSERT((res[1]==e1) || (res[1]==e2)); 386 CPPUNIT_ASSERT(res[0]!=res[1]); 387 } 388 389 { 390 std::vector<Vector> res = lp2->getSphereIntersections(); 391 CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2); 392 CPPUNIT_ASSERT((res[0]==e2) || (res[0]==e3)); 393 CPPUNIT_ASSERT((res[1]==e2) || (res[1]==e3)); 394 CPPUNIT_ASSERT(res[0]!=res[1]); 395 } 396 397 { 398 std::vector<Vector> res = lp3->getSphereIntersections(); 399 CPPUNIT_ASSERT_EQUAL(res.size(),(size_t)2); 400 CPPUNIT_ASSERT((res[0]==e3) || (res[0]==e1)); 401 CPPUNIT_ASSERT((res[1]==e3) || (res[1]==e1)); 402 CPPUNIT_ASSERT(res[0]!=res[1]); 403 } 404 } -
src/unittests/LineUnittest.hpp
r192f6e r4e10f5 22 22 CPPUNIT_TEST ( intersectionTest ); 23 23 CPPUNIT_TEST ( rotationTest ); 24 CPPUNIT_TEST ( sphereIntersectionTest ); 24 25 CPPUNIT_TEST_SUITE_END(); 25 26 … … 33 34 void intersectionTest(); 34 35 void rotationTest(); 36 void sphereIntersectionTest(); 35 37 36 38 private: -
src/unittests/Makefile.am
r192f6e r4e10f5 31 31 LogUnitTest \ 32 32 manipulateAtomsTest \ 33 MemoryUsageObserverUnitTest \ 34 MemoryAllocatorUnitTest \ 33 MatrixUnittest \ 35 34 MoleculeDescriptorTest \ 36 35 ObserverTest \ … … 38 37 periodentafelTest \ 39 38 PlaneUnittest \ 39 ShapeUnittest \ 40 40 SingletonTest \ 41 41 StackClassUnitTest \ … … 75 75 listofbondsunittest.cpp \ 76 76 logunittest.cpp \ 77 MatrixUnittest.cpp \ 77 78 manipulateAtomsTest.cpp \ 78 memoryallocatorunittest.cpp \79 memoryusageobserverunittest.cpp \80 79 MoleculeDescriptorTest.cpp \ 81 80 ObserverTest.cpp \ … … 83 82 periodentafelTest.cpp \ 84 83 PlaneUnittest.cpp \ 84 ShapeUnittest.cpp \ 85 85 SingletonTest.cpp \ 86 86 stackclassunittest.cpp \ … … 112 112 logunittest.hpp \ 113 113 manipulateAtomsTest.hpp \ 114 memoryallocatorunittest.hpp \ 115 memoryusageobserverunittest.hpp \ 114 MatrixUnittest.hpp \ 116 115 MoleculeDescriptorTest.hpp \ 117 116 periodentafelTest.hpp \ … … 189 188 manipulateAtomsTest_LDADD = ${ALLLIBS} 190 189 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} 190 MatrixUnittest_SOURCES = UnitTestMain.cpp MatrixUnittest.cpp MatrixUnittest.hpp 191 MatrixUnittest_LDADD = ${ALLLIBS} 196 192 197 193 MoleculeDescriptorTest_SOURCES = UnitTestMain.cpp MoleculeDescriptorTest.cpp MoleculeDescriptorTest.hpp … … 210 206 PlaneUnittest_LDADD = ${ALLLIBS} 211 207 208 ShapeUnittest_SOURCES = UnitTestMain.cpp ShapeUnittest.cpp ShapeUnittest.hpp 209 ShapeUnittest_LDADD = ${ALLLIBS} 210 212 211 SingletonTest_SOURCES = UnitTestMain.cpp SingletonTest.cpp SingletonTest.hpp 213 212 SingletonTest_LDADD = ${ALLLIBS} $(BOOST_LIB) ${BOOST_THREAD_LIB} … … 225 224 Tesselation_InOutsideUnitTest_LDADD = ${ALLLIBS} 226 225 227 TestRunner_SOURCES = TestRunnerMain.cpp ../memoryallocator.hpp ../memoryallocator.cpp ../memoryusageobserver.cpp ../memoryusageobserver.hpp$(TESTSOURCES) $(TESTHEADERS)226 TestRunner_SOURCES = TestRunnerMain.cpp $(TESTSOURCES) $(TESTHEADERS) 228 227 TestRunner_LDADD = ${ALLLIBS} 229 228 -
src/unittests/PlaneUnittest.cpp
r192f6e r4e10f5 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cmath> 13 15 14 16 #ifdef HAVE_TESTRUNNER -
src/unittests/linearsystemofequationsunittest.cpp
r192f6e r4e10f5 12 12 #include <cppunit/extensions/TestFactoryRegistry.h> 13 13 #include <cppunit/ui/text/TestRunner.h> 14 #include <cmath> 14 15 15 16 #include "linearsystemofequationsunittest.hpp" -
src/unittests/tesselation_insideoutsideunittest.cpp
r192f6e r4e10f5 17 17 #include "tesselation.hpp" 18 18 #include "tesselation_insideoutsideunittest.hpp" 19 #include "verbose.hpp" 19 20 20 21 #ifdef HAVE_TESTRUNNER -
src/unittests/vectorunittest.cpp
r192f6e r4e10f5 15 15 #include "defs.hpp" 16 16 #include "log.hpp" 17 #include "memoryusageobserver.hpp"18 17 #include "vector.hpp" 19 18 #include "vector_ops.hpp" … … 21 20 #include "Plane.hpp" 22 21 #include "Exceptions/LinearDependenceException.hpp" 22 #include "Matrix.hpp" 23 23 24 24 #ifdef HAVE_TESTRUNNER … … 214 214 CPPUNIT_ASSERT(testVector.ScalarProduct(three) < MYEPSILON); 215 215 } 216 217 218 /**219 * UnitTest for Vector::IsInParallelepiped().220 */221 void VectorTest::IsInParallelepipedTest()222 {223 double parallelepiped[NDIM*NDIM];224 parallelepiped[0] = 1;225 parallelepiped[1] = 0;226 parallelepiped[2] = 0;227 parallelepiped[3] = 0;228 parallelepiped[4] = 1;229 parallelepiped[5] = 0;230 parallelepiped[6] = 0;231 parallelepiped[7] = 0;232 parallelepiped[8] = 1;233 234 fixture = zero;235 CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );236 fixture = Vector(2.5,2.5,2.5);237 CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );238 fixture = Vector(1.,1.,1.);239 CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );240 fixture = Vector(3.5,3.5,3.5);241 CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );242 fixture = Vector(2.,2.,2.);243 CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );244 fixture = Vector(2.,3.,2.);245 CPPUNIT_ASSERT_EQUAL( true, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );246 fixture = Vector(-2.,2.,-1.);247 CPPUNIT_ASSERT_EQUAL( false, fixture.IsInParallelepiped(Vector(2.,2.,2.), parallelepiped) );248 }249 -
src/unittests/vectorunittest.hpp
r192f6e r4e10f5 27 27 CPPUNIT_TEST ( ProjectionTest ); 28 28 CPPUNIT_TEST ( NormalsTest ); 29 CPPUNIT_TEST ( IsInParallelepipedTest );30 29 CPPUNIT_TEST_SUITE_END(); 31 30 … … 45 44 void LineIntersectionTest(); 46 45 void VectorRotationTest(); 47 void IsInParallelepipedTest();48 46 49 47 private: -
src/vector.cpp
r192f6e r4e10f5 8 8 9 9 #include "vector.hpp" 10 #include "VectorContent.hpp" 10 11 #include "verbose.hpp" 11 12 #include "World.hpp" 12 13 #include "Helpers/Assert.hpp" 13 14 #include "Helpers/fast_functions.hpp" 15 #include "Exceptions/MathException.hpp" 14 16 15 17 #include <iostream> 18 #include <gsl/gsl_blas.h> 19 16 20 17 21 using namespace std; … … 24 28 Vector::Vector() 25 29 { 26 content = gsl_vector_calloc (NDIM);30 content = new VectorContent(); 27 31 }; 28 32 … … 33 37 Vector::Vector(const Vector& src) 34 38 { 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); 39 41 } 40 42 … … 43 45 Vector::Vector(const double x1, const double x2, const double x3) 44 46 { 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 53 Vector::Vector(VectorContent *_content) : 54 content(_content) 55 {} 50 56 51 57 /** … … 55 61 // check for self assignment 56 62 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); 60 64 } 61 65 return *this; … … 65 69 */ 66 70 Vector::~Vector() { 67 gsl_vector_free(content);71 delete content; 68 72 }; 69 73 … … 94 98 } 95 99 96 /** Calculates distance between this and another vector in a periodic cell.97 * \param *y array to second vector98 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell99 * \return \f$| x - y |\f$100 */101 double Vector::PeriodicDistance(const Vector &y, const double * const cell_size) const102 {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 cells116 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 vector120 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 with125 Shiftedy = y + TranslationVector;126 // get distance and compare with minimum so far127 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 vector135 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell136 * \return \f$| x - y |^2\f$137 */138 double Vector::PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const139 {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 cells153 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 vector157 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 with162 Shiftedy = y + TranslationVector;163 // get distance and compare with minimum so far164 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 messages172 * 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 periodically185 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 198 100 /** Calculates scalar product between this and another vector. 199 101 * \param *y array to second vector … … 203 105 { 204 106 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); 207 108 return (res); 208 109 }; … … 369 270 double& Vector::operator[](size_t i){ 370 271 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); 372 273 } 373 274 374 275 const double& Vector::operator[](size_t i) const{ 375 276 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); 377 278 } 378 279 … … 385 286 } 386 287 387 gsl_vector* Vector::get(){288 VectorContent* Vector::get(){ 388 289 return content; 389 290 } … … 504 405 }; 505 406 407 void Vector::ScaleAll(const Vector &factor){ 408 gsl_vector_mul(content->content, factor.content->content); 409 } 506 410 507 411 508 412 void Vector::Scale(const double factor) 509 413 { 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); 530 415 }; 531 416 … … 546 431 return make_pair(res,helper); 547 432 } 548 549 /** Do a matrix multiplication.550 * \param *matrix NDIM_NDIM array551 */552 void Vector::MatrixMultiplication(const double * const M)553 {554 Vector tmp;555 // do the matrix multiplication556 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 array564 */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 B572 if (fabs(detA) > MYEPSILON) {; // RDET3(A) yields precisely zero if A irregular573 detAReci = 1./detA;574 B[0] = detAReci*RDET2(A[4],A[5],A[7],A[8]); // A_11575 B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]); // A_12576 B[2] = detAReci*RDET2(A[1],A[2],A[4],A[5]); // A_13577 B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]); // A_21578 B[4] = detAReci*RDET2(A[0],A[2],A[6],A[8]); // A_22579 B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]); // A_23580 B[6] = detAReci*RDET2(A[3],A[4],A[6],A[7]); // A_31581 B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]); // A_32582 B[8] = detAReci*RDET2(A[0],A[1],A[3],A[4]); // A_33583 584 MatrixMultiplication(B);585 586 return true;587 } else {588 return false;589 }590 };591 592 433 593 434 /** Creates this vector as the b y *factors' components scaled linear combination of the given three. … … 679 520 void Vector::AddVector(const Vector &y) 680 521 { 681 for(int i=NDIM;i--;) 682 at(i) += y[i]; 522 gsl_vector_add(content->content, y.content->content); 683 523 } 684 524 … … 688 528 void Vector::SubtractVector(const Vector &y) 689 529 { 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); 711 531 } 712 532 -
src/vector.hpp
r192f6e r4e10f5 11 11 #endif 12 12 13 #include <iostream> 14 #include <gsl/gsl_vector.h> 15 #include <gsl/gsl_multimin.h> 13 #include <iosfwd> 16 14 17 15 #include <memory> … … 24 22 25 23 class Vector; 24 class Matrix; 25 struct VectorContent; 26 26 27 27 typedef std::vector<Vector> pointset; … … 31 31 */ 32 32 class Vector : public Space{ 33 friend Vector operator*(const Matrix&,const Vector&); 34 friend class Matrix; 33 35 public: 34 35 36 Vector(); 36 37 Vector(const double x1, const double x2, const double x3); … … 42 43 double DistanceSquared(const Vector &y) const; 43 44 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;46 45 double ScalarProduct(const Vector &y) const; 47 46 double Angle(const Vector &y) const; … … 58 57 Vector Projection(const Vector &y) const; 59 58 void ScaleAll(const double *factor); 59 void ScaleAll(const Vector &factor); 60 60 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);64 61 bool GetOneNormalVector(const Vector &x1); 65 62 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);68 63 std::pair<Vector,Vector> partition(const Vector&) const; 69 64 std::pair<pointset,Vector> partition(const pointset&) const; … … 79 74 80 75 // Access to internal structure 81 gsl_vector* get();76 VectorContent* get(); 82 77 83 78 // Methods that are derived directly from other methods … … 104 99 105 100 private: 106 gsl_vector *content; 101 Vector(VectorContent *); 102 VectorContent *content; 107 103 108 104 }; -
src/vector_ops.cpp
r192f6e r4e10f5 23 23 #include <gsl/gsl_permutation.h> 24 24 #include <gsl/gsl_vector.h> 25 #include <gsl/gsl_multimin.h> 25 26 26 27 /** -
src/verbose.cpp
r192f6e r4e10f5 5 5 #include "info.hpp" 6 6 #include "verbose.hpp" 7 #include <iostream> 7 8 8 9 /** Prints the tabs according to verbosity stored in the temporary constructed class. -
src/verbose.hpp
r192f6e r4e10f5 18 18 #endif 19 19 20 #include <ios tream>20 #include <iosfwd> 21 21 22 22 /************************************* Class Verbose & Binary *******************************/ -
tests/regression/Domain/4/post/test.conf
r192f6e r4e10f5 47 47 BoxLength # (Length of a unit cell) 48 48 1 49 0 049 0 1 50 50 0 0 2 51 51
Note:
See TracChangeset
for help on using the changeset viewer.