Changes in / [56fb09:5ec8e3]
- Files:
-
- 17 added
- 51 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AnalysisAction/PairCorrelationAction.cpp
r56fb09 r5ec8e3 67 67 dialog = UIFactory::getInstance().makeDialog(); 68 68 if (type == "P") 69 dialog->queryVector("position", &Point, World::getInstance().getDomain(),false, MapOfActions::getInstance().getDescription("position"));69 dialog->queryVector("position", &Point, false, MapOfActions::getInstance().getDescription("position")); 70 70 if (type == "S") 71 71 dialog->queryMolecule("molecule-by-id", &Boundary, MapOfActions::getInstance().getDescription("molecule-by-id")); -
src/Actions/AtomAction/AddAction.cpp
r56fb09 r5ec8e3 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/MoleculeAction/FillWithMoleculeAction.cpp
r56fb09 r5ec8e3 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/TranslateAction.cpp
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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 -
src/Actions/WorldAction/CenterOnEdgeAction.cpp
r56fb09 r5ec8e3 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 } 65 cout << "new domain is: " << domain << endl; 66 World::getInstance().setDomain(domain); 67 67 // translate all atoms, such that Min is aty (0,0,0) 68 68 for (vector<atom*>::iterator AtomRunner = AllAtoms.begin(); AtomRunner != AllAtoms.end(); ++AtomRunner) -
src/Actions/WorldAction/ChangeBoxAction.cpp
r56fb09 r5ec8e3 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);42 DoLog(0) && (Log() << Verbose(0) << "Setting box domain to " << cell_size.getM() << endl); 41 43 delete dialog; 42 44 return Action::success; -
src/Actions/WorldAction/RemoveSphereOfAtomsAction.cpp
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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[(abs(axis+1) == 2) ? 2 : ((abs(axis+2) == 3) ? 5 : 0)] *= Repeater[axis];74 repMat.at(axis,axis) = Repeater[axis]; 72 75 } 76 newM *= repMat; 77 World::getInstance().setDomain(newM); 73 78 74 79 molecule *newmol = NULL; … … 98 103 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl); 99 104 x = y; 100 x .MatrixMultiplication(M);105 x *= M; 101 106 newmol = World::getInstance().createMolecule(); 102 107 molecules->insert(newmol); … … 118 123 } 119 124 } 120 delete(M);121 125 delete dialog; 122 126 return Action::success; -
src/Actions/WorldAction/ScaleBoxAction.cpp
r56fb09 r5ec8e3 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 } 59 M *= scale; 60 World::getInstance().setDomain(M); 57 61 58 62 delete dialog; -
src/Line.cpp
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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/PcpParser.cpp
r56fb09 r5ec8e3 20 20 #include "verbose.hpp" 21 21 #include "World.hpp" 22 #include "Matrix.hpp" 23 #include "Box.hpp" 22 24 23 25 /** Constructor of PcpParser. … … 210 212 // Unit cell and magnetic field 211 213 ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 212 double * const cell_size = World::getInstance().getDomain();214 double *cell_size = new double[6]; 213 215 cell_size[0] = BoxLength[0]; 214 216 cell_size[1] = BoxLength[3]; … … 217 219 cell_size[4] = BoxLength[7]; 218 220 cell_size[5] = BoxLength[8]; 221 World::getInstance().setDomain(cell_size); 222 delete[] cell_size; 219 223 //if (1) fprintf(stderr,"\n"); 220 224 … … 327 331 void PcpParser::save(std::ostream* file) 328 332 { 329 const double * const cell_size = World::getInstance().getDomain();333 const Matrix &domain = World::getInstance().getDomain().getM(); 330 334 class ThermoStatContainer *Thermostats = World::getInstance().getThermostats(); 331 335 if (!file->fail()) { … … 412 416 *file << endl; 413 417 *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;418 *file << domain.at(0,0) << "\t" << endl; 419 *file << domain.at(1,0) << "\t" << domain.at(1,1) << "\t" << endl; 420 *file << domain.at(2,0) << "\t" << domain.at(2,1) << "\t" << domain.at(2,2) << "\t" << endl; 417 421 // FIXME 418 422 *file << endl; -
src/UIElements/CommandLineUI/CommandLineDialog.cpp
r56fb09 r5ec8e3 27 27 #include "verbose.hpp" 28 28 #include "World.hpp" 29 #include "Box.hpp" 29 30 30 31 #include "atom.hpp" … … 73 74 } 74 75 75 void CommandLineDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check, string _description) {76 registerQuery(new VectorCommandLineQuery(title,target,c ellSize,check, _description));77 } 78 79 void CommandLineDialog::queryBox(const char* title, double ** constcellSize, string _description) {76 void CommandLineDialog::queryVector(const char* title, Vector *target, bool check, string _description) { 77 registerQuery(new VectorCommandLineQuery(title,target,check, _description)); 78 } 79 80 void CommandLineDialog::queryBox(const char* title, Box* cellSize, string _description) { 80 81 registerQuery(new BoxCommandLineQuery(title,cellSize,_description)); 81 82 } … … 202 203 } 203 204 204 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, const double *const _cellSize,bool _check, string _description) :205 Dialog::VectorQuery(title,_target,_c ellSize,_check, _description)205 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, bool _check, string _description) : 206 Dialog::VectorQuery(title,_target,_check, _description) 206 207 {} 207 208 … … 224 225 225 226 226 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, double ** const_cellSize, string _description) :227 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, Box* _cellSize, string _description) : 227 228 Dialog::BoxQuery(title,_cellSize, _description) 228 229 {} -
src/UIElements/CommandLineUI/CommandLineDialog.hpp
r56fb09 r5ec8e3 34 34 virtual void queryAtom(const char*,atom**, std::string = ""); 35 35 virtual void queryMolecule(const char*,molecule**,std::string = ""); 36 virtual void queryVector(const char*,Vector *, const double * const,bool, std::string = "");37 virtual void queryBox(const char*, double ** const, std::string = "");36 virtual void queryVector(const char*,Vector *,bool, std::string = ""); 37 virtual void queryBox(const char*,Box *, std::string = ""); 38 38 virtual void queryElement(const char*, std::vector<element *> *, std::string = ""); 39 39 … … 91 91 class VectorCommandLineQuery : public Dialog::VectorQuery { 92 92 public: 93 VectorCommandLineQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description = "");93 VectorCommandLineQuery(std::string title,Vector *_target,bool _check, std::string _description = ""); 94 94 virtual ~VectorCommandLineQuery(); 95 95 virtual bool handle(); … … 98 98 class BoxCommandLineQuery : public Dialog::BoxQuery { 99 99 public: 100 BoxCommandLineQuery(std::string title, double ** const_cellSize, std::string _description = "");100 BoxCommandLineQuery(std::string title,Box* _cellSize, std::string _description = ""); 101 101 virtual ~BoxCommandLineQuery(); 102 102 virtual bool handle(); -
src/UIElements/Dialog.cpp
r56fb09 r5ec8e3 14 14 #include "molecule.hpp" 15 15 #include "vector.hpp" 16 #include "Matrix.hpp" 17 #include "Box.hpp" 16 18 17 19 using namespace std; … … 173 175 // Vector Queries 174 176 175 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description) :177 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,bool _check, std::string _description) : 176 178 Query(title, _description), 177 cellSize(_cellSize),178 179 check(_check), 179 180 target(_target) … … 193 194 // Box Queries 194 195 195 Dialog::BoxQuery::BoxQuery(std::string title, double ** const_cellSize, std::string _description) :196 Dialog::BoxQuery::BoxQuery(std::string title, Box* _cellSize, std::string _description) : 196 197 Query(title, _description), 197 198 target(_cellSize) … … 206 207 207 208 void Dialog::BoxQuery::setResult() { 208 for (int i=0;i<6;i++) { 209 (*target)[i] = tmp[i]; 210 } 209 (*target)= ReturnFullMatrixforSymmetric(tmp); 211 210 } 212 211 -
src/UIElements/Dialog.hpp
r56fb09 r5ec8e3 14 14 15 15 class atom; 16 class Box; 16 17 class element; 17 18 class molecule; … … 42 43 virtual void queryAtom(const char*,atom**,std::string = "")=0; 43 44 virtual void queryMolecule(const char*,molecule**, std::string = "")=0; 44 virtual void queryVector(const char*,Vector *, const double *const,bool, std::string = "")=0;45 virtual void queryBox(const char*, double ** const, std::string = "")=0;45 virtual void queryVector(const char*,Vector *,bool, std::string = "")=0; 46 virtual void queryBox(const char*,Box*, std::string = "")=0; 46 47 virtual void queryElement(const char*, std::vector<element *> *, std::string = "")=0; 47 48 … … 162 163 class VectorQuery : public Query { 163 164 public: 164 VectorQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description = "");165 VectorQuery(std::string title,Vector *_target,bool _check, std::string _description = ""); 165 166 virtual ~VectorQuery(); 166 167 virtual bool handle()=0; … … 168 169 protected: 169 170 Vector *tmp; 170 const double *const cellSize;171 171 bool check; 172 172 private: … … 176 176 class BoxQuery : public Query { 177 177 public: 178 BoxQuery(std::string title, double ** const_cellSize, std::string _description = "");178 BoxQuery(std::string title,Box *_cellSize, std::string _description = ""); 179 179 virtual ~BoxQuery(); 180 180 virtual bool handle()=0; 181 181 virtual void setResult(); 182 182 protected: 183 double *tmp;183 double* tmp; 184 184 private: 185 double **target;185 Box* target; 186 186 }; 187 187 -
src/UIElements/QT4/QTDialog.cpp
r56fb09 r5ec8e3 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"); … … 118 120 } 119 121 120 void QTDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check,string) {121 registerQuery(new VectorQTQuery(title,target,c ellSize,check,inputLayout,this));122 void QTDialog::queryVector(const char* title, Vector *target, bool check,string) { 123 registerQuery(new VectorQTQuery(title,target,check,inputLayout,this)); 122 124 } 123 125 … … 248 250 } 249 251 250 QTDialog::VectorQTQuery::VectorQTQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check,QBoxLayout *_parent,QTDialog *_dialog) : 251 Dialog::VectorQuery(title,_target,_cellSize,_check), 252 parent(_parent) 253 { 254 // 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 255 int j = -1; 252 QTDialog::VectorQTQuery::VectorQTQuery(std::string title, Vector *_target, bool _check,QBoxLayout *_parent,QTDialog *_dialog) : 253 Dialog::VectorQuery(title,_target,_check), 254 parent(_parent) 255 { 256 const Matrix& M = World::getInstance().getDomain().getM(); 256 257 const char *coords[3] = {"x:","y:","z:"}; 257 258 mainLayout= new QHBoxLayout(); … … 261 262 mainLayout->addLayout(subLayout); 262 263 for(int i=0; i<3; i++) { 263 j+=i+1;264 264 coordLayout[i] = new QHBoxLayout(); 265 265 subLayout->addLayout(coordLayout[i]); … … 267 267 coordLayout[i]->addWidget(coordLabel[i]); 268 268 coordInput[i] = new QDoubleSpinBox(); 269 coordInput[i]->setRange(0, cellSize[j]);269 coordInput[i]->setRange(0,M.at(i,i)); 270 270 coordInput[i]->setDecimals(3); 271 271 coordLayout[i]->addWidget(coordInput[i]); -
src/UIElements/QT4/QTDialog.hpp
r56fb09 r5ec8e3 42 42 virtual void queryAtom(const char*,atom**,std::string = ""); 43 43 virtual void queryMolecule(const char*,molecule**,std::string = ""); 44 virtual void queryVector(const char*,Vector *, const double *const,bool,std::string = "");45 virtual void queryBox(const char*, double ** const, std::string = "");44 virtual void queryVector(const char*,Vector *,bool,std::string = ""); 45 virtual void queryBox(const char*,Box*, std::string = ""); 46 46 virtual void queryElement(const char*,std::vector<element *> *_target,std::string = ""); 47 47 … … 109 109 class VectorQTQuery : public Dialog::VectorQuery { 110 110 public: 111 VectorQTQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check,QBoxLayout *,QTDialog *);111 VectorQTQuery(std::string title,Vector *_target,bool _check,QBoxLayout *,QTDialog *); 112 112 virtual ~VectorQTQuery(); 113 113 virtual bool handle(); -
src/UIElements/TextUI/TextDialog.cpp
r56fb09 r5ec8e3 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; … … 66 68 } 67 69 68 void TextDialog::queryVector(const char* title, Vector *target, const double *const cellSize,bool check, string description) {69 registerQuery(new VectorTextQuery(title,target,c ellSize,check,description));70 } 71 72 void TextDialog::queryBox(const char* title, double ** constcellSize, string description) {70 void TextDialog::queryVector(const char* title, Vector *target, bool check, string description) { 71 registerQuery(new VectorTextQuery(title,target,check,description)); 72 } 73 74 void TextDialog::queryBox(const char* title,Box* cellSize, string description) { 73 75 registerQuery(new BoxTextQuery(title,cellSize,description)); 74 76 } … … 243 245 } 244 246 245 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize,bool _check, std::string _description) :246 Dialog::VectorQuery(title,_target,_c ellSize,_check,_description)247 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, bool _check, std::string _description) : 248 Dialog::VectorQuery(title,_target,_check,_description) 247 249 {} 248 250 … … 253 255 Log() << Verbose(0) << getTitle(); 254 256 257 const Matrix &M = World::getInstance().getDomain().getM(); 255 258 char coords[3] = {'x','y','z'}; 256 int j = -1;257 259 for (int i=0;i<3;i++) { 258 j += i+1;259 260 do { 260 Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j]<< "]: ";261 Log() << Verbose(0) << coords[i] << "[0.." << M.at(i,i) << "]: "; 261 262 cin >> (*tmp)[i]; 262 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= cellSize[j])) && (check));263 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= M.at(i,i))) && (check)); 263 264 } 264 265 return true; 265 266 } 266 267 267 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const_cellSize, std::string _description) :268 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, Box* _cellSize, std::string _description) : 268 269 Dialog::BoxQuery(title,_cellSize,_description) 269 270 {} -
src/UIElements/TextUI/TextDialog.hpp
r56fb09 r5ec8e3 31 31 virtual void queryAtom(const char*,atom**,std::string = ""); 32 32 virtual void queryMolecule(const char*,molecule**,std::string = ""); 33 virtual void queryVector(const char*,Vector *, const double * const,bool, std::string = "");34 virtual void queryBox(const char*, double ** const, std::string = "");33 virtual void queryVector(const char*,Vector *,bool, std::string = ""); 34 virtual void queryBox(const char*,Box*, std::string = ""); 35 35 virtual void queryElement(const char*, std::vector<element *> *, std::string = ""); 36 36 … … 88 88 class VectorTextQuery : public Dialog::VectorQuery { 89 89 public: 90 VectorTextQuery(std::string title,Vector *_target, const double *const _cellSize,bool _check, std::string _description = NULL);90 VectorTextQuery(std::string title,Vector *_target,bool _check, std::string _description = NULL); 91 91 virtual ~VectorTextQuery(); 92 92 virtual bool handle(); … … 95 95 class BoxTextQuery : public Dialog::BoxQuery { 96 96 public: 97 BoxTextQuery(std::string title, double ** const_cellSize, std::string _description = NULL);97 BoxTextQuery(std::string title,Box* _cellSize, std::string _description = NULL); 98 98 virtual ~BoxTextQuery(); 99 99 virtual bool handle(); -
src/VectorSet.hpp
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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 88 Matrix M = ReturnFullMatrixforSymmetric(matrix); 89 cell_size->setM(M); 83 90 } 84 91 … … 133 140 molecules.erase(id); 134 141 } 135 136 double *World::cell_size = NULL;137 142 138 143 atom *World::createAtom(){ … … 297 302 molecules_deprecated(new MoleculeListClass(this)) 298 303 { 299 cell_size = new double[6]; 300 cell_size[0] = 20.; 301 cell_size[1] = 0.; 302 cell_size[2] = 20.; 303 cell_size[3] = 0.; 304 cell_size[4] = 0.; 305 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); 306 310 defaultName = "none"; 307 311 molecules_deprecated->signOn(this); … … 311 315 { 312 316 molecules_deprecated->signOff(this); 313 delete []cell_size;317 delete cell_size; 314 318 delete molecules_deprecated; 315 319 delete periode; -
src/World.hpp
r56fb09 r5ec8e3 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_correlation.cpp
r56fb09 r5ec8e3 19 19 #include "triangleintersectionlist.hpp" 20 20 #include "vector.hpp" 21 #include "Matrix.hpp" 21 22 #include "verbose.hpp" 22 23 #include "World.hpp" 24 #include "Box.hpp" 23 25 24 26 … … 34 36 PairCorrelationMap *outmap = NULL; 35 37 double distance = 0.; 36 double *domain = World::getInstance().getDomain();38 Box &domain = World::getInstance().getDomain(); 37 39 38 40 if (molecules->ListOfMolecules.empty()) { … … 75 77 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 76 78 if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) { 77 distance = (*iter)->node->PeriodicDistance(*(*runner)->node, domain);79 distance = domain.periodicDistance(*(*iter)->node,*(*runner)->node); 78 80 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; 79 81 outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> ((*iter), (*runner)) ) ); … … 135 137 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++){ 136 138 if ((*MolWalker)->ActiveFlag) { 137 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());138 double * FullInverseMatrix = InverseMatrix(FullMatrix);139 Matrix FullMatrix = World::getInstance().getDomain().getM(); 140 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv(); 139 141 DoeLog(2) && (eLog()<< Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 140 142 eLog() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl; 141 143 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { 142 144 DoLog(3) && (Log() << Verbose(3) << "Current atom is " << **iter << "." << endl); 143 periodicX = *(*iter)->node; 144 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 145 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 145 146 // go through every range in xyz and get distance 146 147 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 147 148 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 148 149 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); 150 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 151 151 for (MoleculeList::const_iterator MolOtherWalker = MolWalker; MolOtherWalker != molecules->ListOfMolecules.end(); MolOtherWalker++){ 152 152 if ((*MolOtherWalker)->ActiveFlag) { … … 157 157 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 158 158 if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) { 159 periodicOtherX = *(*runner)->node; 160 periodicOtherX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 159 periodicOtherX = FullInverseMatrix * (*(*runner)->node); // x now in [0,1)^3 161 160 // go through every range in xyz and get distance 162 161 for (Othern[0]=-ranges[0]; Othern[0] <= ranges[0]; Othern[0]++) 163 162 for (Othern[1]=-ranges[1]; Othern[1] <= ranges[1]; Othern[1]++) 164 163 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); 164 checkOtherX = FullMatrix * (Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX); 167 165 distance = checkX.distance(checkOtherX); 168 166 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; … … 176 174 } 177 175 } 178 delete[](FullMatrix);179 delete[](FullInverseMatrix);180 176 } 181 177 } … … 195 191 CorrelationToPointMap *outmap = NULL; 196 192 double distance = 0.; 197 double *cell_size= World::getInstance().getDomain();193 Box &domain = World::getInstance().getDomain(); 198 194 199 195 if (molecules->ListOfMolecules.empty()) { … … 211 207 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 212 208 if ((*type == NULL) || ((*iter)->type == *type)) { 213 distance = (*iter)->node->PeriodicDistance(*point, cell_size);209 distance = domain.periodicDistance(*(*iter)->node,*point); 214 210 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); 215 211 outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> ((*iter), point) ) ); … … 246 242 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 247 243 if ((*MolWalker)->ActiveFlag) { 248 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());249 double * FullInverseMatrix = InverseMatrix(FullMatrix);244 Matrix FullMatrix = World::getInstance().getDomain().getM(); 245 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv(); 250 246 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 251 247 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 253 249 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 254 250 if ((*type == NULL) || ((*iter)->type == *type)) { 255 periodicX = *(*iter)->node; 256 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 251 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 257 252 // go through every range in xyz and get distance 258 253 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 259 254 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 260 255 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); 256 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 263 257 distance = checkX.distance(*point); 264 258 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); … … 267 261 } 268 262 } 269 delete[](FullMatrix);270 delete[](FullInverseMatrix);271 263 } 272 264 … … 352 344 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 353 345 if ((*MolWalker)->ActiveFlag) { 354 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());355 double * FullInverseMatrix = InverseMatrix(FullMatrix);346 Matrix FullMatrix = World::getInstance().getDomain().getM(); 347 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv(); 356 348 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 357 349 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 359 351 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 360 352 if ((*type == NULL) || ((*iter)->type == *type)) { 361 periodicX = *(*iter)->node; 362 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 353 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 363 354 // go through every range in xyz and get distance 364 355 ShortestDistance = -1.; … … 366 357 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 367 358 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); 359 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 370 360 TriangleIntersectionList Intersections(&checkX,Surface,LC); 371 361 distance = Intersections.GetSmallestDistance(); … … 381 371 } 382 372 } 383 delete[](FullMatrix);384 delete[](FullInverseMatrix);385 373 } 386 374 -
src/atom.cpp
r56fb09 r5ec8e3 17 17 #include "World.hpp" 18 18 #include "molecule.hpp" 19 #include "Shapes/Shape.hpp" 19 20 20 21 /************************************* Functions for class atom *************************************/ … … 112 113 * \return true - is inside, false - is not 113 114 */ 114 bool atom::IsIn Parallelepiped(const Vector offset, const double *parallelepiped) const115 { 116 return (node->IsInParallelepiped(offset, parallelepiped));115 bool atom::IsInShape(const Shape& shape) const 116 { 117 return shape.isInside(*node); 117 118 }; 118 119 -
src/atom.hpp
r56fb09 r5ec8e3 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/boundary.cpp
r56fb09 r5ec8e3 22 22 #include "World.hpp" 23 23 #include "Plane.hpp" 24 #include "Matrix.hpp" 25 #include "Box.hpp" 24 26 25 27 #include<gsl/gsl_poly.h> … … 764 766 int N[NDIM]; 765 767 int n[NDIM]; 766 double *M = ReturnFullMatrixforSymmetric(World::getInstance().getDomain());767 double Rotations[NDIM*NDIM];768 double *MInverse = InverseMatrix(M);768 const Matrix &M = World::getInstance().getDomain().getM(); 769 Matrix Rotations; 770 const Matrix &MInverse = World::getInstance().getDomain().getMinv(); 769 771 Vector AtomTranslations; 770 772 Vector FillerTranslations; … … 799 801 800 802 // calculate filler grid in [0,1]^3 801 FillerDistance = Vector(distance[0], distance[1], distance[2]); 802 FillerDistance.InverseMatrixMultiplication(M); 803 FillerDistance = MInverse * Vector(distance[0], distance[1], distance[2]); 803 804 for(int i=0;i<NDIM;i++) 804 805 N[i] = (int) ceil(1./FillerDistance[i]); … … 813 814 for (n[2] = 0; n[2] < N[2]; n[2]++) { 814 815 // calculate position of current grid vector in untransformed box 815 CurrentPosition = Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]); 816 CurrentPosition.MatrixMultiplication(M); 816 CurrentPosition = M * Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]); 817 817 // create molecule random translation vector ... 818 818 for (int i=0;i<NDIM;i++) … … 835 835 } 836 836 837 Rotations [0] = cos(phi[0]) *cos(phi[2]) + (sin(phi[0])*sin(phi[1])*sin(phi[2]));838 Rotations [3] = sin(phi[0]) *cos(phi[2]) - (cos(phi[0])*sin(phi[1])*sin(phi[2]));839 Rotations [6] = cos(phi[1])*sin(phi[2]);840 Rotations [1] = - sin(phi[0])*cos(phi[1]);841 Rotations [4] = cos(phi[0])*cos(phi[1]);842 Rotations [7] = sin(phi[1]);843 Rotations [3] = - cos(phi[0]) *sin(phi[2]) + (sin(phi[0])*sin(phi[1])*cos(phi[2]));844 Rotations [5] = - sin(phi[0]) *sin(phi[2]) - (cos(phi[0])*sin(phi[1])*cos(phi[2]));845 Rotations [8] = cos(phi[1])*cos(phi[2]);837 Rotations.set(0,0, cos(phi[0]) *cos(phi[2]) + (sin(phi[0])*sin(phi[1])*sin(phi[2]))); 838 Rotations.set(0,1, sin(phi[0]) *cos(phi[2]) - (cos(phi[0])*sin(phi[1])*sin(phi[2]))); 839 Rotations.set(0,2, cos(phi[1])*sin(phi[2]) ); 840 Rotations.set(1,0, -sin(phi[0])*cos(phi[1]) ); 841 Rotations.set(1,1, cos(phi[0])*cos(phi[1]) ); 842 Rotations.set(1,2, sin(phi[1]) ); 843 Rotations.set(2,0, -cos(phi[0]) *sin(phi[2]) + (sin(phi[0])*sin(phi[1])*cos(phi[2]))); 844 Rotations.set(2,1, -sin(phi[0]) *sin(phi[2]) - (cos(phi[0])*sin(phi[1])*cos(phi[2]))); 845 Rotations.set(2,2, cos(phi[1])*cos(phi[2]) ); 846 846 } 847 847 … … 849 849 Inserter = (*iter)->x; 850 850 if (DoRandomRotation) 851 Inserter .MatrixMultiplication(Rotations);851 Inserter *= Rotations; 852 852 Inserter += AtomTranslations + FillerTranslations + CurrentPosition; 853 853 854 854 // check whether inserter is inside box 855 Inserter .MatrixMultiplication(MInverse);855 Inserter *= MInverse; 856 856 FillIt = true; 857 857 for (int i=0;i<NDIM;i++) 858 858 FillIt = FillIt && (Inserter[i] >= -MYEPSILON) && ((Inserter[i]-1.) <= MYEPSILON); 859 Inserter .MatrixMultiplication(M);859 Inserter *= M; 860 860 861 861 // Check whether point is in- or outside … … 892 892 } 893 893 } 894 delete[](M);895 delete[](MInverse);896 894 897 895 return Filling; -
src/config.cpp
r56fb09 r5ec8e3 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/ellipsoid.cpp
r56fb09 r5ec8e3 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/helpers.cpp
r56fb09 r5ec8e3 117 117 }; 118 118 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 119 /** Comparison function for GSL heapsort on distances in two molecules. 168 120 * \param *a -
src/helpers.hpp
r56fb09 r5ec8e3 52 52 bool IsValidNumber( const char *string); 53 53 int CompareDoubles (const void * a, const void * b); 54 double * ReturnFullMatrixforSymmetric(const double * const cell_size);55 double * InverseMatrix(const double * const A);56 54 void performCriticalExit(); 57 55 -
src/molecule.cpp
r56fb09 r5ec8e3 9 9 #include <cstring> 10 10 #include <boost/bind.hpp> 11 #include <boost/foreach.hpp> 11 12 12 13 #include "World.hpp" … … 27 28 #include "tesselation.hpp" 28 29 #include "vector.hpp" 30 #include "Matrix.hpp" 29 31 #include "World.hpp" 32 #include "Box.hpp" 30 33 #include "Plane.hpp" 31 34 #include "Exceptions/LinearDependenceException.hpp" … … 284 287 Vector Orthovector1, Orthovector2; // temporary vectors in coordination construction 285 288 Vector InBondvector; // vector in direction of *Bond 286 double *matrix = NULL;289 const Matrix &matrix = World::getInstance().getDomain().getM(); 287 290 bond *Binder = NULL; 288 double * const cell_size = World::getInstance().getDomain();289 291 290 292 // Log() << Verbose(3) << "Begin of AddHydrogenReplacementAtom." << endl; … … 307 309 } // (signs are correct, was tested!) 308 310 } 309 matrix = ReturnFullMatrixforSymmetric(cell_size); 310 Orthovector1.MatrixMultiplication(matrix); 311 Orthovector1 *= matrix; 311 312 InBondvector -= Orthovector1; // subtract just the additional translation 312 delete[](matrix);313 313 bondlength = InBondvector.Norm(); 314 314 // Log() << Verbose(4) << "Corrected InBondvector is now: "; … … 541 541 break; 542 542 } 543 delete[](matrix);544 543 545 544 // Log() << Verbose(3) << "End of AddHydrogenReplacementAtom." << endl; … … 660 659 * @param three vectors forming the matrix that defines the shape of the parallelpiped 661 660 */ 662 molecule* molecule::CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const {661 molecule* molecule::CopyMoleculeFromSubRegion(const Shape ®ion) const { 663 662 molecule *copy = World::getInstance().createMolecule(); 664 663 665 ActOnCopyWithEachAtomIfTrue ( &molecule::AddCopyAtom, copy, &atom::IsInParallelepiped, offset, parallelepiped ); 664 BOOST_FOREACH(atom *iter,atoms){ 665 if(iter->IsInShape(region)){ 666 copy->AddCopyAtom(iter); 667 } 668 } 666 669 667 670 //TODO: copy->BuildInducedSubgraph(this); … … 750 753 void molecule::SetBoxDimension(Vector *dim) 751 754 { 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); 755 Matrix domain; 756 for(int i =0; i<NDIM;++i) 757 domain.at(i,i) = dim->at(i); 758 World::getInstance().setDomain(domain); 759 759 }; 760 760 … … 849 849 bool molecule::CheckBounds(const Vector *x) const 850 850 { 851 double * const cell_size = World::getInstance().getDomain();851 const Matrix &domain = World::getInstance().getDomain().getM(); 852 852 bool result = true; 853 int j =-1;854 853 for (int i=0;i<NDIM;i++) { 855 j += i+1; 856 result = result && ((x->at(i) >= 0) && (x->at(i) < cell_size[j])); 854 result = result && ((x->at(i) >= 0) && (x->at(i) < domain.at(i,i))); 857 855 } 858 856 //return result; -
src/molecule.hpp
r56fb09 r5ec8e3 53 53 class periodentafel; 54 54 class Vector; 55 class Shape; 55 56 56 57 /******************************** Some definitions for easier reading **********************************/ … … 316 317 317 318 molecule *CopyMolecule(); 318 molecule* CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const;319 molecule* CopyMoleculeFromSubRegion(const Shape&) const; 319 320 320 321 /// Fragment molecule by two different approaches: -
src/molecule_fragmentation.cpp
r56fb09 r5ec8e3 22 22 #include "periodentafel.hpp" 23 23 #include "World.hpp" 24 #include "Matrix.hpp" 25 #include "Box.hpp" 24 26 25 27 /************************************* Functions for class molecule *********************************/ … … 1708 1710 atom *Walker = NULL; 1709 1711 atom *OtherWalker = NULL; 1710 double * const cell_size = World::getInstance().getDomain(); 1711 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 1712 Matrix matrix = World::getInstance().getDomain().getM(); 1712 1713 enum Shading *ColorList = NULL; 1713 1714 double tmp; … … 1749 1750 Translationvector[i] = (tmp < 0) ? +1. : -1.; 1750 1751 } 1751 Translationvector .MatrixMultiplication(matrix);1752 Translationvector *= matrix; 1752 1753 //Log() << Verbose(3) << "Translation vector is "; 1753 1754 Log() << Verbose(0) << Translationvector << endl; … … 1780 1781 delete(AtomStack); 1781 1782 delete[](ColorList); 1782 delete[](matrix);1783 1783 DoLog(2) && (Log() << Verbose(2) << "End of ScanForPeriodicCorrection." << endl); 1784 1784 }; -
src/molecule_geometry.cpp
r56fb09 r5ec8e3 19 19 #include "World.hpp" 20 20 #include "Plane.hpp" 21 #include "Matrix.hpp" 22 #include "Box.hpp" 21 23 #include <boost/foreach.hpp> 22 24 … … 33 35 const Vector *Center = DetermineCenterOfAll(); 34 36 const Vector *CenterBox = DetermineCenterOfBox(); 35 double * const cell_size = World::getInstance().getDomain(); 36 double *M = ReturnFullMatrixforSymmetric(cell_size); 37 double *Minv = InverseMatrix(M); 37 Box &domain = World::getInstance().getDomain(); 38 38 39 39 // go through all atoms 40 40 ActOnAllVectors( &Vector::SubtractVector, *Center); 41 41 ActOnAllVectors( &Vector::SubtractVector, *CenterBox); 42 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);43 44 delete[](M);45 delete[](Minv); 42 BOOST_FOREACH(atom* iter, atoms){ 43 *iter->node = domain.WrapPeriodically(*iter->node); 44 } 45 46 46 delete(Center); 47 47 delete(CenterBox); … … 56 56 { 57 57 bool status = true; 58 double * const cell_size = World::getInstance().getDomain(); 59 double *M = ReturnFullMatrixforSymmetric(cell_size); 60 double *Minv = InverseMatrix(M); 58 Box &domain = World::getInstance().getDomain(); 61 59 62 60 // go through all atoms 63 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);64 65 delete[](M);66 delete[](Minv); 61 BOOST_FOREACH(atom* iter, atoms){ 62 *iter->node = domain.WrapPeriodically(*iter->node); 63 } 64 67 65 return status; 68 66 }; … … 153 151 { 154 152 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 153 const Matrix &M = World::getInstance().getDomain().getM(); 154 (*a) *= M; 161 155 return a; 162 156 }; … … 244 238 void molecule::TranslatePeriodically(const Vector *trans) 245 239 { 246 double * const cell_size = World::getInstance().getDomain(); 247 double *M = ReturnFullMatrixforSymmetric(cell_size); 248 double *Minv = InverseMatrix(M); 240 Box &domain = World::getInstance().getDomain(); 249 241 250 242 // go through all atoms 251 243 ActOnAllVectors( &Vector::AddVector, *trans); 252 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv);253 254 delete[](M);255 delete[](Minv); 244 BOOST_FOREACH(atom* iter, atoms){ 245 *iter->node = domain.WrapPeriodically(*iter->node); 246 } 247 256 248 }; 257 249 … … 264 256 OBSERVE; 265 257 Plane p(*n,0); 266 BOOST_FOREACH( 258 BOOST_FOREACH(atom* iter, atoms ){ 267 259 (*iter->node) = p.mirrorVector(*iter->node); 268 260 } … … 274 266 void molecule::DeterminePeriodicCenter(Vector ¢er) 275 267 { 276 double * const cell_size = World::getInstance().getDomain(); 277 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 278 double *inversematrix = InverseMatrix(matrix); 268 const Matrix &matrix = World::getInstance().getDomain().getM(); 269 const Matrix &inversematrix = World::getInstance().getDomain().getM(); 279 270 double tmp; 280 271 bool flag; … … 288 279 if ((*iter)->type->Z != 1) { 289 280 #endif 290 Testvector = (*iter)->x; 291 Testvector.MatrixMultiplication(inversematrix); 281 Testvector = inversematrix * (*iter)->x; 292 282 Translationvector.Zero(); 293 283 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { … … 306 296 } 307 297 Testvector += Translationvector; 308 Testvector .MatrixMultiplication(matrix);298 Testvector *= matrix; 309 299 Center += Testvector; 310 300 Log() << Verbose(1) << "vector is: " << Testvector << endl; … … 313 303 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { 314 304 if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) { 315 Testvector = (*Runner)->GetOtherAtom((*iter))->x; 316 Testvector.MatrixMultiplication(inversematrix); 305 Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x; 317 306 Testvector += Translationvector; 318 Testvector .MatrixMultiplication(matrix);307 Testvector *= matrix; 319 308 Center += Testvector; 320 309 Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl; … … 325 314 } 326 315 } while (!flag); 327 delete[](matrix);328 delete[](inversematrix);329 316 330 317 Center.Scale(1./static_cast<double>(getAtomCount())); … … 388 375 DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... "); 389 376 // the eigenvectors specify the transformation matrix 390 ActOnAllVectors( &Vector::MatrixMultiplication, (const double *) evec->data ); 377 Matrix M = Matrix(evec->data); 378 BOOST_FOREACH(atom* iter, atoms){ 379 (*iter->node) *= M; 380 } 391 381 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 392 382 -
src/molecule_graph.cpp
r56fb09 r5ec8e3 24 24 #include "Helpers/fast_functions.hpp" 25 25 #include "Helpers/Assert.hpp" 26 #include "Matrix.hpp" 27 #include "Box.hpp" 26 28 27 29 … … 121 123 LinkedCell *LC = NULL; 122 124 bool free_BG = false; 123 double * const cell_size= World::getInstance().getDomain();125 Box &domain = World::getInstance().getDomain(); 124 126 125 127 if (BG == NULL) { … … 178 180 //Log() << Verbose(1) << "Checking distance " << OtherWalker->x.PeriodicDistanceSquared(&(Walker->x), cell_size) << " against typical bond length of " << bonddistance*bonddistance << "." << endl; 179 181 (BG->*minmaxdistance)(Walker, OtherWalker, MinDistance, MaxDistance, IsAngstroem); 180 const double distance = OtherWalker->x.PeriodicDistanceSquared(Walker->x,cell_size);182 const double distance = domain.periodicDistanceSquared(OtherWalker->x,Walker->x); 181 183 const bool status = (distance <= MaxDistance * MaxDistance) && (distance >= MinDistance * MinDistance); 182 184 // Log() << Verbose(1) << "MinDistance is " << MinDistance << " and MaxDistance is " << MaxDistance << "." << endl; -
src/moleculelist.cpp
r56fb09 r5ec8e3 24 24 #include "periodentafel.hpp" 25 25 #include "Helpers/Assert.hpp" 26 #include "Matrix.hpp" 27 #include "Box.hpp" 26 28 27 29 #include "Helpers/Assert.hpp" … … 631 633 int FragmentCounter = 0; 632 634 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]; 635 Matrix cell_size = World::getInstance().getDomain().getM(); 636 Matrix cell_size_backup = cell_size; 637 639 638 // store the fragments as config and as xyz 640 639 for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) { … … 674 673 (*ListRunner)->CenterEdge(&BoxDimension); 675 674 (*ListRunner)->SetBoxDimension(&BoxDimension); // update Box of atoms by boundary 676 int j = -1;677 675 for (int k = 0; k < NDIM; k++) { 678 j += k + 1;679 676 BoxDimension[k] = 2.5 * (World::getInstance().getConfig()->GetIsAngstroem() ? 1. : 1. / AtomicLengthToAngstroem); 680 cell_size[j] = BoxDimension[k] * 2.; 681 } 677 cell_size.at(k,k) = BoxDimension[k] * 2.; 678 } 679 World::getInstance().setDomain(cell_size); 682 680 (*ListRunner)->Translate(&BoxDimension); 683 681 … … 725 723 726 724 // restore cell_size 727 for (int i=0;i<6;i++) 728 cell_size[i] = cell_size_backup[i]; 725 World::getInstance().setDomain(cell_size_backup); 729 726 730 727 return result; … … 887 884 // center at set box dimensions 888 885 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]; 886 Matrix domain; 887 for(int i =0;i<NDIM;++i) 888 domain.at(i,i) = center[i]; 889 World::getInstance().setDomain(domain); 895 890 insert(mol); 896 891 } -
src/unittests/LineUnittest.cpp
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 38 38 periodentafelTest \ 39 39 PlaneUnittest \ 40 ShapeUnittest \ 40 41 SingletonTest \ 41 42 StackClassUnitTest \ … … 83 84 periodentafelTest.cpp \ 84 85 PlaneUnittest.cpp \ 86 ShapeUnittest.cpp \ 85 87 SingletonTest.cpp \ 86 88 stackclassunittest.cpp \ … … 210 212 PlaneUnittest_LDADD = ${ALLLIBS} 211 213 214 ShapeUnittest_SOURCES = UnitTestMain.cpp ShapeUnittest.cpp ShapeUnittest.hpp 215 ShapeUnittest_LDADD = ${ALLLIBS} 216 212 217 SingletonTest_SOURCES = UnitTestMain.cpp SingletonTest.cpp SingletonTest.hpp 213 218 SingletonTest_LDADD = ${ALLLIBS} $(BOOST_LIB) ${BOOST_THREAD_LIB} -
src/unittests/PlaneUnittest.cpp
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 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/vectorunittest.cpp
r56fb09 r5ec8e3 21 21 #include "Plane.hpp" 22 22 #include "Exceptions/LinearDependenceException.hpp" 23 #include "Matrix.hpp" 23 24 24 25 #ifdef HAVE_TESTRUNNER … … 214 215 CPPUNIT_ASSERT(testVector.ScalarProduct(three) < MYEPSILON); 215 216 } 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
r56fb09 r5ec8e3 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
r56fb09 r5ec8e3 12 12 #include "Helpers/Assert.hpp" 13 13 #include "Helpers/fast_functions.hpp" 14 #include "Exceptions/MathException.hpp" 14 15 15 16 #include <iostream> 17 #include <gsl/gsl_blas.h> 18 16 19 17 20 using namespace std; … … 34 37 { 35 38 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 gsl_vector_memcpy(content, src.content); 39 40 } 40 41 … … 49 50 }; 50 51 52 Vector::Vector(gsl_vector *_content) : 53 content(_content) 54 {} 55 51 56 /** 52 57 * Assignment operator … … 55 60 // check for self assignment 56 61 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]); 62 gsl_vector_memcpy(content, src.content); 60 63 } 61 64 return *this; … … 94 97 } 95 98 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 99 /** Calculates scalar product between this and another vector. 199 100 * \param *y array to second vector … … 203 104 { 204 105 double res = 0.; 205 for (int i=NDIM;i--;) 206 res += at(i)*y[i]; 106 gsl_blas_ddot(content, y.content, &res); 207 107 return (res); 208 108 }; … … 504 404 }; 505 405 406 void Vector::ScaleAll(const Vector &factor){ 407 gsl_vector_mul(content, factor.content); 408 } 506 409 507 410 508 411 void Vector::Scale(const double factor) 509 412 { 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); 413 gsl_vector_scale(content,factor); 530 414 }; 531 415 … … 546 430 return make_pair(res,helper); 547 431 } 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 432 593 433 /** Creates this vector as the b y *factors' components scaled linear combination of the given three. … … 679 519 void Vector::AddVector(const Vector &y) 680 520 { 681 for(int i=NDIM;i--;) 682 at(i) += y[i]; 521 gsl_vector_add(content, y.content); 683 522 } 684 523 … … 688 527 void Vector::SubtractVector(const Vector &y) 689 528 { 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; 529 gsl_vector_sub(content, y.content); 711 530 } 712 531 -
src/vector.hpp
r56fb09 r5ec8e3 13 13 #include <iostream> 14 14 #include <gsl/gsl_vector.h> 15 #include <gsl/gsl_multimin.h>16 15 17 16 #include <memory> … … 24 23 25 24 class Vector; 25 class Matrix; 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&); 33 34 public: 34 35 35 Vector(); 36 36 Vector(const double x1, const double x2, const double x3); … … 42 42 double DistanceSquared(const Vector &y) const; 43 43 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 44 double ScalarProduct(const Vector &y) const; 47 45 double Angle(const Vector &y) const; … … 58 56 Vector Projection(const Vector &y) const; 59 57 void ScaleAll(const double *factor); 58 void ScaleAll(const Vector &factor); 60 59 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 60 bool GetOneNormalVector(const Vector &x1); 65 61 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 62 std::pair<Vector,Vector> partition(const Vector&) const; 69 63 std::pair<pointset,Vector> partition(const pointset&) const; … … 104 98 105 99 private: 100 Vector(gsl_vector *); 106 101 gsl_vector *content; 107 102 -
src/vector_ops.cpp
r56fb09 r5ec8e3 23 23 #include <gsl/gsl_permutation.h> 24 24 #include <gsl/gsl_vector.h> 25 #include <gsl/gsl_multimin.h> 25 26 26 27 /** -
tests/regression/Domain/4/post/test.conf
r56fb09 r5ec8e3 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.