Changes in / [5ec8e3:56fb09]
- Files:
-
- 17 deleted
- 51 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Actions/AnalysisAction/PairCorrelationAction.cpp
r5ec8e3 r56fb09 67 67 dialog = UIFactory::getInstance().makeDialog(); 68 68 if (type == "P") 69 dialog->queryVector("position", &Point, false, MapOfActions::getInstance().getDescription("position"));69 dialog->queryVector("position", &Point, World::getInstance().getDomain(), 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
r5ec8e3 r56fb09 41 41 42 42 dialog->queryElement(NAME, &elements, MapOfActions::getInstance().getDescription(NAME)); 43 dialog->queryVector("position", &position, true, MapOfActions::getInstance().getDescription("position"));43 dialog->queryVector("position", &position, World::getInstance().getDomain(), true, MapOfActions::getInstance().getDescription("position")); 44 44 cout << "pre-dialog" << endl; 45 45 -
src/Actions/MoleculeAction/FillWithMoleculeAction.cpp
r5ec8e3 r56fb09 62 62 63 63 dialog->queryString(NAME, &filename, MapOfActions::getInstance().getDescription(NAME)); 64 dialog->queryVector("distances", &distances, false, MapOfActions::getInstance().getDescription("distances"));65 dialog->queryVector("lengths", &lengths, false, MapOfActions::getInstance().getDescription("lengths"));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")); 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
r5ec8e3 r56fb09 55 55 bool periodic = false; 56 56 57 dialog->queryVector(NAME, &x, false, MapOfActions::getInstance().getDescription(NAME));57 dialog->queryVector(NAME, &x, World::getInstance().getDomain(), 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
r5ec8e3 r56fb09 41 41 int j=0; 42 42 43 dialog->queryVector(NAME, &boundary, false, MapOfActions::getInstance().getDescription(NAME));43 dialog->queryVector(NAME, &boundary, World::getInstance().getDomain(), 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 = new double[6];61 double * const cell_size = World::getInstance().getDomain(); 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;71 69 // translate all atoms, such that Min is aty (0,0,0) 72 70 AtomRunner = AllAtoms.begin(); -
src/Actions/WorldAction/CenterInBoxAction.cpp
r5ec8e3 r56fb09 34 34 Dialog *dialog = UIFactory::getInstance().makeDialog(); 35 35 36 Box&cell_size = World::getInstance().getDomain();36 double * cell_size = World::getInstance().getDomain(); 37 37 dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME)); 38 38 -
src/Actions/WorldAction/CenterOnEdgeAction.cpp
r5ec8e3 r56fb09 13 13 #include "vector.hpp" 14 14 #include "World.hpp" 15 #include "Matrix.hpp"16 15 17 16 #include <iostream> … … 38 37 Vector Min; 39 38 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 Matrix domain; 59 double * const cell_size = World::getInstance().getDomain(); 60 for (j=0;j<6;j++) 61 cell_size[j] = 0.; 62 j=-1; 60 63 for (int i=0;i<NDIM;i++) { 61 double tmp = Max[i]-Min[i]; 62 tmp = fabs(tmp)>=1. ? tmp : 1.0; 63 domain.at(i,i) = tmp; 64 j += i+1; 65 cell_size[j] = (Max[i]-Min[i]); 64 66 } 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
r5ec8e3 r56fb09 12 12 #include "verbose.hpp" 13 13 #include "World.hpp" 14 #include "Box.hpp"15 #include "Matrix.hpp"16 14 17 15 #include <iostream> … … 36 34 Dialog *dialog = UIFactory::getInstance().makeDialog(); 37 35 38 Box&cell_size = World::getInstance().getDomain();36 double * cell_size = World::getInstance().getDomain(); 39 37 dialog->queryBox(NAME, &cell_size, MapOfActions::getInstance().getDescription(NAME)); 40 38 41 39 if(dialog->display()) { 42 DoLog(0) && (Log() << Verbose(0) << "Setting box domain to " << cell_size .getM()<< endl);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); 43 41 delete dialog; 44 42 return Action::success; -
src/Actions/WorldAction/RemoveSphereOfAtomsAction.cpp
r5ec8e3 r56fb09 41 41 42 42 dialog->queryDouble(NAME, &radius, MapOfActions::getInstance().getDescription(NAME)); 43 dialog->queryVector("position", &point, false, MapOfActions::getInstance().getDescription("position"));43 dialog->queryVector("position", &point, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription("position")); 44 44 45 45 if(dialog->display()) { -
src/Actions/WorldAction/RepeatBoxAction.cpp
r5ec8e3 r56fb09 13 13 #include "molecule.hpp" 14 14 #include "vector.hpp" 15 #include "Matrix.hpp"16 15 #include "verbose.hpp" 17 16 #include "World.hpp" 18 #include "Box.hpp"19 17 20 18 #include <iostream> … … 48 46 MoleculeListClass *molecules = World::getInstance().getMolecules(); 49 47 50 dialog->queryVector(NAME, &Repeater, false, MapOfActions::getInstance().getDescription(NAME));48 dialog->queryVector(NAME, &Repeater, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription(NAME)); 51 49 //dialog->queryMolecule("molecule-by-id", &mol,MapOfActions::getInstance().getDescription("molecule-by-id")); 52 50 vector<molecule *> AllMolecules; … … 61 59 if(dialog->display()) { 62 60 (cout << "Repeating box " << Repeater << " times for (x,y,z) axis." << endl); 63 Matrix M = World::getInstance().getDomain().getM();64 Matrix newM = M;61 double * const cell_size = World::getInstance().getDomain(); 62 double *M = ReturnFullMatrixforSymmetric(cell_size); 65 63 Vector x,y; 66 64 int n[NDIM]; 67 Matrix repMat;68 65 for (int axis = 0; axis < NDIM; axis++) { 69 66 Repeater[axis] = floor(Repeater[axis]); … … 72 69 Repeater[axis] = 1; 73 70 } 74 repMat.at(axis,axis)= Repeater[axis];71 cell_size[(abs(axis+1) == 2) ? 2 : ((abs(axis+2) == 3) ? 5 : 0)] *= Repeater[axis]; 75 72 } 76 newM *= repMat;77 World::getInstance().setDomain(newM);78 73 79 74 molecule *newmol = NULL; … … 103 98 DoeLog(1) && (eLog()<< Verbose(1) << "AtomCount " << count << " is not equal to number of atoms in molecule " << j << "!" << endl); 104 99 x = y; 105 x *= M;100 x.MatrixMultiplication(M); 106 101 newmol = World::getInstance().createMolecule(); 107 102 molecules->insert(newmol); … … 123 118 } 124 119 } 120 delete(M); 125 121 delete dialog; 126 122 return Action::success; -
src/Actions/WorldAction/ScaleBoxAction.cpp
r5ec8e3 r56fb09 14 14 #include "verbose.hpp" 15 15 #include "World.hpp" 16 #include "Box.hpp"17 #include "Matrix.hpp"18 16 19 17 #include <iostream> … … 39 37 Vector Scaler; 40 38 double x[NDIM]; 39 int j=0; 41 40 42 dialog->queryVector(NAME, &Scaler, false, MapOfActions::getInstance().getDescription(NAME));41 dialog->queryVector(NAME, &Scaler, World::getInstance().getDomain(), false, MapOfActions::getInstance().getDescription(NAME)); 43 42 44 43 if(dialog->display()) { … … 50 49 (*AtomRunner)->x.ScaleAll(x); 51 50 } 52 53 Matrix M = World::getInstance().getDomain().getM(); 54 Matrix scale; 55 51 j = -1; 52 double * const cell_size = World::getInstance().getDomain(); 56 53 for (int i=0;i<NDIM;i++) { 57 scale.at(i,i) = x[i]; 54 j += i+1; 55 cell_size[j]*=x[i]; 58 56 } 59 M *= scale;60 World::getInstance().setDomain(M);61 57 62 58 delete dialog; -
src/Line.cpp
r5ec8e3 r56fb09 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 calculations221 double discriminant = 1-origin->NormSquared();222 // we might have 2, 1 or 0 solutions, depending on discriminant223 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 236 217 Line makeLineThrough(const Vector &x1, const Vector &x2){ 237 218 if(x1==x2){ -
src/Line.hpp
r5ec8e3 r56fb09 38 38 Plane getOrthogonalPlane(const Vector &origin) const; 39 39 40 std::vector<Vector> getSphereIntersections() const;41 42 40 private: 43 41 std::auto_ptr<Vector> origin; -
src/Makefile.am
r5ec8e3 r56fb09 38 38 vector.cpp 39 39 40 LINALGHEADER = \ 41 gslmatrix.hpp \ 40 LINALGHEADER = gslmatrix.hpp \ 42 41 gslvector.hpp \ 43 42 linearsystemofequations.hpp \ … … 76 75 Actions/MethodAction.hpp \ 77 76 Actions/Process.hpp 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 77 92 78 93 79 PARSERSOURCE = \ … … 115 101 Patterns/Observer.hpp \ 116 102 Patterns/Singleton.hpp 117 118 SHAPESOURCE = \119 Shapes/BaseShapes.cpp \120 Shapes/Shape.cpp \121 Shapes/ShapeOps.cpp122 SHAPEHEADER = \123 Shapes/BaseShapes.hpp \124 Shapes/Shape.hpp \125 Shapes/ShapeOps.hpp126 127 103 128 104 QTUIMOC_HEADER = UIElements/QT4/QTDialog.hpp \ … … 158 134 Descriptors/MoleculeNameDescriptor.hpp \ 159 135 Descriptors/MoleculePtrDescriptor.hpp 136 137 EXCEPTIONSOURCE = Exceptions/CustomException.cpp \ 138 Exceptions/LinearDependenceException.cpp \ 139 Exceptions/MathException.cpp \ 140 Exceptions/SkewException.cpp \ 141 Exceptions/ZeroVectorException.cpp 142 143 EXCEPTIONHEADER = Exceptions/CustomException.hpp \ 144 Exceptions/LinearDependenceException.hpp \ 145 Exceptions/MathException.hpp \ 146 Exceptions/SkewException.hpp \ 147 Exceptions/ZeroVectorException.hpp 160 148 161 149 QTUISOURCE = ${QTUIMOC_TARGETS} \ … … 177 165 ${ACTIONSSOURCE} \ 178 166 ${ATOMSOURCE} \ 179 ${EXCEPTIONSOURCE} \180 167 ${PATTERNSOURCE} \ 181 168 ${PARSERSOURCE} \ 182 ${SHAPESOURCE} \183 169 ${DESCRIPTORSOURCE} \ 184 170 ${HELPERSOURCE} \ 171 ${EXCEPTIONSOURCE} \ 185 172 bond.cpp \ 186 173 bondgraph.cpp \ 187 174 boundary.cpp \ 188 Box.cpp \189 175 CommandLineParser.cpp \ 190 176 config.cpp \ … … 202 188 log.cpp \ 203 189 logger.cpp \ 204 Matrix.cpp \205 190 moleculelist.cpp \ 206 191 molecule.cpp \ … … 227 212 ${ACTIONSHEADER} \ 228 213 ${ATOMHEADER} \ 229 ${EXCEPTIONHEADER} \230 214 ${PARSERHEADER} \ 231 215 ${PATTERNHEADER} \ 232 ${SHAPEHEADER} \233 216 ${DESCRIPTORHEADER} \ 217 ${EXCEPTIONHEADER} \ 234 218 bond.hpp \ 235 219 bondgraph.hpp \ 236 220 boundary.hpp \ 237 Box.hpp \238 221 CommandLineParser.hpp \ 239 222 config.hpp \ … … 253 236 log.hpp \ 254 237 logger.hpp \ 255 Matrix.hpp \256 238 molecule.hpp \ 257 239 molecule_template.hpp \ -
src/Parser/PcpParser.cpp
r5ec8e3 r56fb09 20 20 #include "verbose.hpp" 21 21 #include "World.hpp" 22 #include "Matrix.hpp"23 #include "Box.hpp"24 22 25 23 /** Constructor of PcpParser. … … 212 210 // Unit cell and magnetic field 213 211 ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 214 double * cell_size = new double[6];212 double * const cell_size = World::getInstance().getDomain(); 215 213 cell_size[0] = BoxLength[0]; 216 214 cell_size[1] = BoxLength[3]; … … 219 217 cell_size[4] = BoxLength[7]; 220 218 cell_size[5] = BoxLength[8]; 221 World::getInstance().setDomain(cell_size);222 delete[] cell_size;223 219 //if (1) fprintf(stderr,"\n"); 224 220 … … 331 327 void PcpParser::save(std::ostream* file) 332 328 { 333 const Matrix &domain = World::getInstance().getDomain().getM();329 const double * const cell_size = World::getInstance().getDomain(); 334 330 class ThermoStatContainer *Thermostats = World::getInstance().getThermostats(); 335 331 if (!file->fail()) { … … 416 412 *file << endl; 417 413 *file << "BoxLength\t\t\t# (Length of a unit cell)" << 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;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; 421 417 // FIXME 422 418 *file << endl; -
src/UIElements/CommandLineUI/CommandLineDialog.cpp
r5ec8e3 r56fb09 27 27 #include "verbose.hpp" 28 28 #include "World.hpp" 29 #include "Box.hpp"30 29 31 30 #include "atom.hpp" … … 74 73 } 75 74 76 void CommandLineDialog::queryVector(const char* title, Vector *target, bool check, string _description) {77 registerQuery(new VectorCommandLineQuery(title,target,c heck, _description));78 } 79 80 void CommandLineDialog::queryBox(const char* title, Box*cellSize, string _description) {75 void CommandLineDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check, string _description) { 76 registerQuery(new VectorCommandLineQuery(title,target,cellSize,check, _description)); 77 } 78 79 void CommandLineDialog::queryBox(const char* title, double ** const cellSize, string _description) { 81 80 registerQuery(new BoxCommandLineQuery(title,cellSize,_description)); 82 81 } … … 203 202 } 204 203 205 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, bool _check, string _description) :206 Dialog::VectorQuery(title,_target,_c heck, _description)204 CommandLineDialog::VectorCommandLineQuery::VectorCommandLineQuery(string title, Vector *_target, const double *const _cellSize, bool _check, string _description) : 205 Dialog::VectorQuery(title,_target,_cellSize,_check, _description) 207 206 {} 208 207 … … 225 224 226 225 227 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, Box*_cellSize, string _description) :226 CommandLineDialog::BoxCommandLineQuery::BoxCommandLineQuery(string title, double ** const _cellSize, string _description) : 228 227 Dialog::BoxQuery(title,_cellSize, _description) 229 228 {} -
src/UIElements/CommandLineUI/CommandLineDialog.hpp
r5ec8e3 r56fb09 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 *, bool, std::string = "");37 virtual void queryBox(const char*, Box *, 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 = ""); 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, bool _check, std::string _description = "");93 VectorCommandLineQuery(std::string title,Vector *_target,const double *const _cellSize,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, Box*_cellSize, std::string _description = "");100 BoxCommandLineQuery(std::string title,double ** const _cellSize, std::string _description = ""); 101 101 virtual ~BoxCommandLineQuery(); 102 102 virtual bool handle(); -
src/UIElements/Dialog.cpp
r5ec8e3 r56fb09 14 14 #include "molecule.hpp" 15 15 #include "vector.hpp" 16 #include "Matrix.hpp"17 #include "Box.hpp"18 16 19 17 using namespace std; … … 175 173 // Vector Queries 176 174 177 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target, bool _check, std::string _description) :175 Dialog::VectorQuery::VectorQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check, std::string _description) : 178 176 Query(title, _description), 177 cellSize(_cellSize), 179 178 check(_check), 180 179 target(_target) … … 194 193 // Box Queries 195 194 196 Dialog::BoxQuery::BoxQuery(std::string title, Box*_cellSize, std::string _description) :195 Dialog::BoxQuery::BoxQuery(std::string title, double ** const _cellSize, std::string _description) : 197 196 Query(title, _description), 198 197 target(_cellSize) … … 207 206 208 207 void Dialog::BoxQuery::setResult() { 209 (*target)= ReturnFullMatrixforSymmetric(tmp); 208 for (int i=0;i<6;i++) { 209 (*target)[i] = tmp[i]; 210 } 210 211 } 211 212 -
src/UIElements/Dialog.hpp
r5ec8e3 r56fb09 14 14 15 15 class atom; 16 class Box;17 16 class element; 18 17 class molecule; … … 43 42 virtual void queryAtom(const char*,atom**,std::string = "")=0; 44 43 virtual void queryMolecule(const char*,molecule**, std::string = "")=0; 45 virtual void queryVector(const char*,Vector *, bool, std::string = "")=0;46 virtual void queryBox(const char*, Box*, 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; 47 46 virtual void queryElement(const char*, std::vector<element *> *, std::string = "")=0; 48 47 … … 163 162 class VectorQuery : public Query { 164 163 public: 165 VectorQuery(std::string title,Vector *_target, bool _check, std::string _description = "");164 VectorQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check, std::string _description = ""); 166 165 virtual ~VectorQuery(); 167 166 virtual bool handle()=0; … … 169 168 protected: 170 169 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, Box *_cellSize, std::string _description = "");178 BoxQuery(std::string title,double ** const _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 Box*target;185 double **target; 186 186 }; 187 187 -
src/UIElements/QT4/QTDialog.cpp
r5ec8e3 r56fb09 29 29 #include "molecule.hpp" 30 30 #include "Descriptors/MoleculeIdDescriptor.hpp" 31 #include "Matrix.hpp"32 #include "Box.hpp"33 31 34 32 … … 95 93 } 96 94 97 void QTDialog::queryBox(char const*, Box*, string){95 void QTDialog::queryBox(char const*, double**, string){ 98 96 // TODO 99 97 ASSERT(false, "Not implemented yet"); … … 120 118 } 121 119 122 void QTDialog::queryVector(const char* title, Vector *target, bool check,string) {123 registerQuery(new VectorQTQuery(title,target,c heck,inputLayout,this));120 void QTDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check,string) { 121 registerQuery(new VectorQTQuery(title,target,cellSize,check,inputLayout,this)); 124 122 } 125 123 … … 250 248 } 251 249 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(); 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; 257 256 const char *coords[3] = {"x:","y:","z:"}; 258 257 mainLayout= new QHBoxLayout(); … … 262 261 mainLayout->addLayout(subLayout); 263 262 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, M.at(i,i));269 coordInput[i]->setRange(0,cellSize[j]); 270 270 coordInput[i]->setDecimals(3); 271 271 coordLayout[i]->addWidget(coordInput[i]); -
src/UIElements/QT4/QTDialog.hpp
r5ec8e3 r56fb09 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 *, bool,std::string = "");45 virtual void queryBox(const char*, Box*, 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 = ""); 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, bool _check,QBoxLayout *,QTDialog *);111 VectorQTQuery(std::string title,Vector *_target,const double *const _cellSize,bool _check,QBoxLayout *,QTDialog *); 112 112 virtual ~VectorQTQuery(); 113 113 virtual bool handle(); -
src/UIElements/TextUI/TextDialog.cpp
r5ec8e3 r56fb09 25 25 #include "molecule.hpp" 26 26 #include "vector.hpp" 27 #include "Matrix.hpp"28 #include "Box.hpp"29 27 30 28 using namespace std; … … 68 66 } 69 67 70 void TextDialog::queryVector(const char* title, Vector *target, bool check, string description) {71 registerQuery(new VectorTextQuery(title,target,c heck,description));72 } 73 74 void TextDialog::queryBox(const char* title, Box*cellSize, string description) {68 void TextDialog::queryVector(const char* title, Vector *target,const double *const cellSize, bool check, string description) { 69 registerQuery(new VectorTextQuery(title,target,cellSize,check,description)); 70 } 71 72 void TextDialog::queryBox(const char* title,double ** const cellSize, string description) { 75 73 registerQuery(new BoxTextQuery(title,cellSize,description)); 76 74 } … … 245 243 } 246 244 247 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, bool _check, std::string _description) :248 Dialog::VectorQuery(title,_target,_c heck,_description)245 TextDialog::VectorTextQuery::VectorTextQuery(std::string title, Vector *_target, const double *const _cellSize, bool _check, std::string _description) : 246 Dialog::VectorQuery(title,_target,_cellSize,_check,_description) 249 247 {} 250 248 … … 255 253 Log() << Verbose(0) << getTitle(); 256 254 257 const Matrix &M = World::getInstance().getDomain().getM();258 255 char coords[3] = {'x','y','z'}; 256 int j = -1; 259 257 for (int i=0;i<3;i++) { 258 j += i+1; 260 259 do { 261 Log() << Verbose(0) << coords[i] << "[0.." << M.at(i,i)<< "]: ";260 Log() << Verbose(0) << coords[i] << "[0.." << cellSize[j] << "]: "; 262 261 cin >> (*tmp)[i]; 263 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= M.at(i,i))) && (check));262 } while ((((*tmp)[i] < 0) || ((*tmp)[i] >= cellSize[j])) && (check)); 264 263 } 265 264 return true; 266 265 } 267 266 268 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, Box*_cellSize, std::string _description) :267 TextDialog::BoxTextQuery::BoxTextQuery(std::string title, double ** const _cellSize, std::string _description) : 269 268 Dialog::BoxQuery(title,_cellSize,_description) 270 269 {} -
src/UIElements/TextUI/TextDialog.hpp
r5ec8e3 r56fb09 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 *, bool, std::string = "");34 virtual void queryBox(const char*, Box*, 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 = ""); 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, bool _check, std::string _description = NULL);90 VectorTextQuery(std::string title,Vector *_target,const double *const _cellSize,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, Box*_cellSize, std::string _description = NULL);97 BoxTextQuery(std::string title,double ** const _cellSize, std::string _description = NULL); 98 98 virtual ~BoxTextQuery(); 99 99 virtual bool handle(); -
src/VectorSet.hpp
r5ec8e3 r56fb09 12 12 #include <functional> 13 13 #include <algorithm> 14 #include <limits>15 14 16 15 /** … … 20 19 */ 21 20 22 #include "vector.hpp" 23 #include <list> 21 class Vector; 24 22 25 23 // this tests, whether we actually have a Vector … … 50 48 void translate(const Vector &translater){ 51 49 // this is needed to allow template lookup 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()); 50 transform(this->begin(),this->end(),this->begin(),bind1st(plus<Vector>(),translater)); 64 51 } 65 52 }; 66 53 67 // allows simpler definition of VectorSets68 #define VECTORSET(container_type) VectorSet<container_type<Vector> >69 70 54 #endif /* VECTORSET_HPP_ */ -
src/World.cpp
r5ec8e3 r56fb09 22 22 #include "Actions/ManipulateAtomsProcess.hpp" 23 23 #include "Helpers/Assert.hpp" 24 #include "Box.hpp"25 #include "Matrix.hpp"26 24 27 25 #include "Patterns/Singleton_impl.hpp" … … 76 74 // system 77 75 78 Box& World::getDomain() { 79 return *cell_size; 80 } 81 82 void World::setDomain(const Matrix &mat){ 83 *cell_size = mat; 76 double * World::getDomain() { 77 return cell_size; 84 78 } 85 79 86 80 void World::setDomain(double * matrix) 87 81 { 88 Matrix M = ReturnFullMatrixforSymmetric(matrix); 89 cell_size->setM(M); 82 90 83 } 91 84 … … 140 133 molecules.erase(id); 141 134 } 135 136 double *World::cell_size = NULL; 142 137 143 138 atom *World::createAtom(){ … … 302 297 molecules_deprecated(new MoleculeListClass(this)) 303 298 { 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); 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.; 310 306 defaultName = "none"; 311 307 molecules_deprecated->signOn(this); … … 315 311 { 316 312 molecules_deprecated->signOff(this); 317 delete cell_size;313 delete[] cell_size; 318 314 delete molecules_deprecated; 319 315 delete periode; -
src/World.hpp
r5ec8e3 r56fb09 34 34 class AtomDescriptor_impl; 35 35 template<typename T> class AtomsCalculation; 36 class Box;37 36 class config; 38 37 class ManipulateAtomsProcess; 39 class Matrix;40 38 class molecule; 41 39 class MoleculeDescriptor; … … 127 125 * get the domain size as a symmetric matrix (6 components) 128 126 */ 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); 127 double * getDomain(); 137 128 138 129 /** … … 266 257 periodentafel *periode; 267 258 config *configuration; 268 Box*cell_size;259 static double *cell_size; 269 260 std::string defaultName; 270 261 class ThermoStatContainer *Thermostats; -
src/analysis_correlation.cpp
r5ec8e3 r56fb09 19 19 #include "triangleintersectionlist.hpp" 20 20 #include "vector.hpp" 21 #include "Matrix.hpp"22 21 #include "verbose.hpp" 23 22 #include "World.hpp" 24 #include "Box.hpp"25 23 26 24 … … 36 34 PairCorrelationMap *outmap = NULL; 37 35 double distance = 0.; 38 Box &domain = World::getInstance().getDomain();36 double *domain = World::getInstance().getDomain(); 39 37 40 38 if (molecules->ListOfMolecules.empty()) { … … 77 75 for (set <pair<element *, element *> >::iterator PairRunner = PairsOfElements.begin(); PairRunner != PairsOfElements.end(); ++PairRunner) 78 76 if ((PairRunner->first == (**iter).type) && (PairRunner->second == (**runner).type)) { 79 distance = domain.periodicDistance(*(*iter)->node,*(*runner)->node);77 distance = (*iter)->node->PeriodicDistance(*(*runner)->node, domain); 80 78 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; 81 79 outmap->insert ( pair<double, pair <atom *, atom*> > (distance, pair<atom *, atom*> ((*iter), (*runner)) ) ); … … 137 135 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++){ 138 136 if ((*MolWalker)->ActiveFlag) { 139 Matrix FullMatrix = World::getInstance().getDomain().getM();140 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv();137 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain()); 138 double * FullInverseMatrix = InverseMatrix(FullMatrix); 141 139 DoeLog(2) && (eLog()<< Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 142 140 eLog() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl; 143 141 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { 144 142 DoLog(3) && (Log() << Verbose(3) << "Current atom is " << **iter << "." << endl); 145 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 143 periodicX = *(*iter)->node; 144 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 146 145 // go through every range in xyz and get distance 147 146 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 148 147 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 149 148 for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) { 150 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 149 checkX = Vector(n[0], n[1], n[2]) + periodicX; 150 checkX.MatrixMultiplication(FullMatrix); 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 = FullInverseMatrix * (*(*runner)->node); // x now in [0,1)^3 159 periodicOtherX = *(*runner)->node; 160 periodicOtherX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 160 161 // go through every range in xyz and get distance 161 162 for (Othern[0]=-ranges[0]; Othern[0] <= ranges[0]; Othern[0]++) 162 163 for (Othern[1]=-ranges[1]; Othern[1] <= ranges[1]; Othern[1]++) 163 164 for (Othern[2]=-ranges[2]; Othern[2] <= ranges[2]; Othern[2]++) { 164 checkOtherX = FullMatrix * (Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX); 165 checkOtherX = Vector(Othern[0], Othern[1], Othern[2]) + periodicOtherX; 166 checkOtherX.MatrixMultiplication(FullMatrix); 165 167 distance = checkX.distance(checkOtherX); 166 168 //Log() << Verbose(1) <<"Inserting " << *(*iter) << " and " << *(*runner) << endl; … … 174 176 } 175 177 } 178 delete[](FullMatrix); 179 delete[](FullInverseMatrix); 176 180 } 177 181 } … … 191 195 CorrelationToPointMap *outmap = NULL; 192 196 double distance = 0.; 193 Box &domain= World::getInstance().getDomain();197 double *cell_size = World::getInstance().getDomain(); 194 198 195 199 if (molecules->ListOfMolecules.empty()) { … … 207 211 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 208 212 if ((*type == NULL) || ((*iter)->type == *type)) { 209 distance = domain.periodicDistance(*(*iter)->node,*point);213 distance = (*iter)->node->PeriodicDistance(*point, cell_size); 210 214 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); 211 215 outmap->insert ( pair<double, pair<atom *, const Vector*> >(distance, pair<atom *, const Vector*> ((*iter), point) ) ); … … 242 246 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 243 247 if ((*MolWalker)->ActiveFlag) { 244 Matrix FullMatrix = World::getInstance().getDomain().getM();245 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv();248 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain()); 249 double * FullInverseMatrix = InverseMatrix(FullMatrix); 246 250 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 247 251 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 249 253 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 250 254 if ((*type == NULL) || ((*iter)->type == *type)) { 251 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 255 periodicX = *(*iter)->node; 256 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 252 257 // go through every range in xyz and get distance 253 258 for (n[0]=-ranges[0]; n[0] <= ranges[0]; n[0]++) 254 259 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 255 260 for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) { 256 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 261 checkX = Vector(n[0], n[1], n[2]) + periodicX; 262 checkX.MatrixMultiplication(FullMatrix); 257 263 distance = checkX.distance(*point); 258 264 DoLog(4) && (Log() << Verbose(4) << "Current distance is " << distance << "." << endl); … … 261 267 } 262 268 } 269 delete[](FullMatrix); 270 delete[](FullInverseMatrix); 263 271 } 264 272 … … 344 352 for (MoleculeList::const_iterator MolWalker = molecules->ListOfMolecules.begin(); MolWalker != molecules->ListOfMolecules.end(); MolWalker++) 345 353 if ((*MolWalker)->ActiveFlag) { 346 Matrix FullMatrix = World::getInstance().getDomain().getM();347 Matrix FullInverseMatrix = World::getInstance().getDomain().getMinv();354 double * FullMatrix = ReturnFullMatrixforSymmetric(World::getInstance().getDomain()); 355 double * FullInverseMatrix = InverseMatrix(FullMatrix); 348 356 DoLog(2) && (Log() << Verbose(2) << "Current molecule is " << *MolWalker << "." << endl); 349 357 for (molecule::const_iterator iter = (*MolWalker)->begin(); iter != (*MolWalker)->end(); ++iter) { … … 351 359 for (vector<element *>::const_iterator type = elements.begin(); type != elements.end(); ++type) 352 360 if ((*type == NULL) || ((*iter)->type == *type)) { 353 periodicX = FullInverseMatrix * (*(*iter)->node); // x now in [0,1)^3 361 periodicX = *(*iter)->node; 362 periodicX.MatrixMultiplication(FullInverseMatrix); // x now in [0,1)^3 354 363 // go through every range in xyz and get distance 355 364 ShortestDistance = -1.; … … 357 366 for (n[1]=-ranges[1]; n[1] <= ranges[1]; n[1]++) 358 367 for (n[2]=-ranges[2]; n[2] <= ranges[2]; n[2]++) { 359 checkX = FullMatrix * (Vector(n[0], n[1], n[2]) + periodicX); 368 checkX = Vector(n[0], n[1], n[2]) + periodicX; 369 checkX.MatrixMultiplication(FullMatrix); 360 370 TriangleIntersectionList Intersections(&checkX,Surface,LC); 361 371 distance = Intersections.GetSmallestDistance(); … … 371 381 } 372 382 } 383 delete[](FullMatrix); 384 delete[](FullInverseMatrix); 373 385 } 374 386 -
src/atom.cpp
r5ec8e3 r56fb09 17 17 #include "World.hpp" 18 18 #include "molecule.hpp" 19 #include "Shapes/Shape.hpp"20 19 21 20 /************************************* Functions for class atom *************************************/ … … 113 112 * \return true - is inside, false - is not 114 113 */ 115 bool atom::IsIn Shape(const Shape& shape) const116 { 117 return shape.isInside(*node);114 bool atom::IsInParallelepiped(const Vector offset, const double *parallelepiped) const 115 { 116 return (node->IsInParallelepiped(offset, parallelepiped)); 118 117 }; 119 118 -
src/atom.hpp
r5ec8e3 r56fb09 35 35 class World; 36 36 class molecule; 37 class Shape;38 37 39 38 /********************************************** declarations *******************************/ … … 67 66 double DistanceToVector(const Vector &origin) const; 68 67 double DistanceSquaredToVector(const Vector &origin) const; 69 bool IsIn Shape(const Shape&) const;68 bool IsInParallelepiped(const Vector offset, const double *parallelepiped) const; 70 69 71 70 // getter and setter -
src/boundary.cpp
r5ec8e3 r56fb09 22 22 #include "World.hpp" 23 23 #include "Plane.hpp" 24 #include "Matrix.hpp"25 #include "Box.hpp"26 24 27 25 #include<gsl/gsl_poly.h> … … 766 764 int N[NDIM]; 767 765 int n[NDIM]; 768 const Matrix &M = World::getInstance().getDomain().getM();769 Matrix Rotations;770 const Matrix &MInverse = World::getInstance().getDomain().getMinv();766 double *M = ReturnFullMatrixforSymmetric(World::getInstance().getDomain()); 767 double Rotations[NDIM*NDIM]; 768 double *MInverse = InverseMatrix(M); 771 769 Vector AtomTranslations; 772 770 Vector FillerTranslations; … … 801 799 802 800 // calculate filler grid in [0,1]^3 803 FillerDistance = MInverse * Vector(distance[0], distance[1], distance[2]); 801 FillerDistance = Vector(distance[0], distance[1], distance[2]); 802 FillerDistance.InverseMatrixMultiplication(M); 804 803 for(int i=0;i<NDIM;i++) 805 804 N[i] = (int) ceil(1./FillerDistance[i]); … … 814 813 for (n[2] = 0; n[2] < N[2]; n[2]++) { 815 814 // calculate position of current grid vector in untransformed box 816 CurrentPosition = M * Vector((double)n[0]/(double)N[0], (double)n[1]/(double)N[1], (double)n[2]/(double)N[2]); 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); 817 817 // create molecule random translation vector ... 818 818 for (int i=0;i<NDIM;i++) … … 835 835 } 836 836 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]) );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]) ; 846 846 } 847 847 … … 849 849 Inserter = (*iter)->x; 850 850 if (DoRandomRotation) 851 Inserter *= Rotations;851 Inserter.MatrixMultiplication(Rotations); 852 852 Inserter += AtomTranslations + FillerTranslations + CurrentPosition; 853 853 854 854 // check whether inserter is inside box 855 Inserter *= MInverse;855 Inserter.MatrixMultiplication(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 *= M;859 Inserter.MatrixMultiplication(M); 860 860 861 861 // Check whether point is in- or outside … … 892 892 } 893 893 } 894 delete[](M); 895 delete[](MInverse); 894 896 895 897 return Filling; -
src/config.cpp
r5ec8e3 r56fb09 26 26 #include "ThermoStatContainer.hpp" 27 27 #include "World.hpp" 28 #include "Matrix.hpp"29 #include "Box.hpp"30 28 31 29 /************************************* Functions for class config ***************************/ … … 681 679 // Unit cell and magnetic field 682 680 ParseForParameter(verbose,FileBuffer, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 683 double * c ell_size = new double[6];681 double * const cell_size = World::getInstance().getDomain(); 684 682 cell_size[0] = BoxLength[0]; 685 683 cell_size[1] = BoxLength[3]; … … 688 686 cell_size[4] = BoxLength[7]; 689 687 cell_size[5] = BoxLength[8]; 690 World::getInstance().setDomain(cell_size);691 delete cell_size;692 688 //if (1) fprintf(stderr,"\n"); 693 689 … … 887 883 888 884 ParseForParameter(verbose,file, "BoxLength", 0, 3, 3, lower_trigrid, BoxLength, 1, critical); /* Lattice->RealBasis */ 889 double * c ell_size = new double[6];885 double * const cell_size = World::getInstance().getDomain(); 890 886 cell_size[0] = BoxLength[0]; 891 887 cell_size[1] = BoxLength[3]; … … 894 890 cell_size[4] = BoxLength[7]; 895 891 cell_size[5] = BoxLength[8]; 896 World::getInstance().setDomain(cell_size);897 delete[] cell_size;898 892 if (1) fprintf(stderr,"\n"); 899 893 config::DoPerturbation = 0; … … 1033 1027 // bring MaxTypes up to date 1034 1028 mol->CountElements(); 1035 const Matrix &domain = World::getInstance().getDomain().getM();1029 const double * const cell_size = World::getInstance().getDomain(); 1036 1030 ofstream * const output = new ofstream(filename, ios::out); 1037 1031 if (output != NULL) { … … 1104 1098 *output << endl; 1105 1099 *output << "BoxLength\t\t\t# (Length of a unit cell)" << 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;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; 1109 1103 // FIXME 1110 1104 *output << endl; -
src/ellipsoid.cpp
r5ec8e3 r56fb09 21 21 #include "tesselation.hpp" 22 22 #include "vector.hpp" 23 #include "Matrix.hpp"24 23 #include "verbose.hpp" 25 24 … … 35 34 Vector helper, RefPoint; 36 35 double distance = -1.; 37 Matrix Matrix;36 double Matrix[NDIM*NDIM]; 38 37 double InverseLength[3]; 39 38 double psi,theta,phi; // euler angles in ZX'Z'' convention … … 52 51 theta = EllipsoidAngle[1]; 53 52 phi = EllipsoidAngle[2]; 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;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); 64 63 helper.ScaleAll(InverseLength); 65 64 //Log() << Verbose(4) << "Transformed RefPoint is at " << helper << "." << endl; … … 74 73 phi = -EllipsoidAngle[2]; 75 74 helper.ScaleAll(EllipsoidLength); 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;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); 86 85 //Log() << Verbose(4) << "Intersection is at " << helper << "." << endl; 87 86 -
src/helpers.cpp
r5ec8e3 r56fb09 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 components 121 * \return allocated NDIM*NDIM array with the symmetric matrix 122 */ 123 double * ReturnFullMatrixforSymmetric(const double * const symm) 124 { 125 double *matrix = new double[NDIM * NDIM]; 126 matrix[0] = symm[0]; 127 matrix[1] = symm[1]; 128 matrix[2] = symm[3]; 129 matrix[3] = symm[1]; 130 matrix[4] = symm[2]; 131 matrix[5] = symm[4]; 132 matrix[6] = symm[3]; 133 matrix[7] = symm[4]; 134 matrix[8] = symm[5]; 135 return matrix; 136 }; 137 138 /** Calculate the inverse of a 3x3 matrix. 139 * \param *matrix NDIM_NDIM array 140 */ 141 double * InverseMatrix( const double * const A) 142 { 143 double *B = new double[NDIM * NDIM]; 144 double detA = RDET3(A); 145 double detAReci; 146 147 for (int i=0;i<NDIM*NDIM;++i) 148 B[i] = 0.; 149 // calculate the inverse B 150 if (fabs(detA) > MYEPSILON) {; // RDET3(A) yields precisely zero if A irregular 151 detAReci = 1./detA; 152 B[0] = detAReci*RDET2(A[4],A[5],A[7],A[8]); // A_11 153 B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]); // A_12 154 B[2] = detAReci*RDET2(A[1],A[2],A[4],A[5]); // A_13 155 B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]); // A_21 156 B[4] = detAReci*RDET2(A[0],A[2],A[6],A[8]); // A_22 157 B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]); // A_23 158 B[6] = detAReci*RDET2(A[3],A[4],A[6],A[7]); // A_31 159 B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]); // A_32 160 B[8] = detAReci*RDET2(A[0],A[1],A[3],A[4]); // A_33 161 } 162 return B; 163 }; 164 165 166 119 167 /** Comparison function for GSL heapsort on distances in two molecules. 120 168 * \param *a -
src/helpers.hpp
r5ec8e3 r56fb09 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); 54 56 void performCriticalExit(); 55 57 -
src/molecule.cpp
r5ec8e3 r56fb09 9 9 #include <cstring> 10 10 #include <boost/bind.hpp> 11 #include <boost/foreach.hpp>12 11 13 12 #include "World.hpp" … … 28 27 #include "tesselation.hpp" 29 28 #include "vector.hpp" 30 #include "Matrix.hpp"31 29 #include "World.hpp" 32 #include "Box.hpp"33 30 #include "Plane.hpp" 34 31 #include "Exceptions/LinearDependenceException.hpp" … … 287 284 Vector Orthovector1, Orthovector2; // temporary vectors in coordination construction 288 285 Vector InBondvector; // vector in direction of *Bond 289 const Matrix &matrix = World::getInstance().getDomain().getM();286 double *matrix = NULL; 290 287 bond *Binder = NULL; 288 double * const cell_size = World::getInstance().getDomain(); 291 289 292 290 // Log() << Verbose(3) << "Begin of AddHydrogenReplacementAtom." << endl; … … 309 307 } // (signs are correct, was tested!) 310 308 } 311 Orthovector1 *= matrix; 309 matrix = ReturnFullMatrixforSymmetric(cell_size); 310 Orthovector1.MatrixMultiplication(matrix); 312 311 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); 543 544 544 545 // Log() << Verbose(3) << "End of AddHydrogenReplacementAtom." << endl; … … 659 660 * @param three vectors forming the matrix that defines the shape of the parallelpiped 660 661 */ 661 molecule* molecule::CopyMoleculeFromSubRegion(const Shape ®ion) const {662 molecule* molecule::CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const { 662 663 molecule *copy = World::getInstance().createMolecule(); 663 664 664 BOOST_FOREACH(atom *iter,atoms){ 665 if(iter->IsInShape(region)){ 666 copy->AddCopyAtom(iter); 667 } 668 } 665 ActOnCopyWithEachAtomIfTrue ( &molecule::AddCopyAtom, copy, &atom::IsInParallelepiped, offset, parallelepiped ); 669 666 670 667 //TODO: copy->BuildInducedSubgraph(this); … … 753 750 void molecule::SetBoxDimension(Vector *dim) 754 751 { 755 Matrix domain; 756 for(int i =0; i<NDIM;++i) 757 domain.at(i,i) = dim->at(i); 758 World::getInstance().setDomain(domain); 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); 759 759 }; 760 760 … … 849 849 bool molecule::CheckBounds(const Vector *x) const 850 850 { 851 const Matrix &domain = World::getInstance().getDomain().getM();851 double * const cell_size = World::getInstance().getDomain(); 852 852 bool result = true; 853 int j =-1; 853 854 for (int i=0;i<NDIM;i++) { 854 result = result && ((x->at(i) >= 0) && (x->at(i) < domain.at(i,i))); 855 j += i+1; 856 result = result && ((x->at(i) >= 0) && (x->at(i) < cell_size[j])); 855 857 } 856 858 //return result; -
src/molecule.hpp
r5ec8e3 r56fb09 53 53 class periodentafel; 54 54 class Vector; 55 class Shape;56 55 57 56 /******************************** Some definitions for easier reading **********************************/ … … 317 316 318 317 molecule *CopyMolecule(); 319 molecule* CopyMoleculeFromSubRegion(const Shape&) const;318 molecule* CopyMoleculeFromSubRegion(const Vector offset, const double *parallelepiped) const; 320 319 321 320 /// Fragment molecule by two different approaches: -
src/molecule_fragmentation.cpp
r5ec8e3 r56fb09 22 22 #include "periodentafel.hpp" 23 23 #include "World.hpp" 24 #include "Matrix.hpp"25 #include "Box.hpp"26 24 27 25 /************************************* Functions for class molecule *********************************/ … … 1710 1708 atom *Walker = NULL; 1711 1709 atom *OtherWalker = NULL; 1712 Matrix matrix = World::getInstance().getDomain().getM(); 1710 double * const cell_size = World::getInstance().getDomain(); 1711 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 1713 1712 enum Shading *ColorList = NULL; 1714 1713 double tmp; … … 1750 1749 Translationvector[i] = (tmp < 0) ? +1. : -1.; 1751 1750 } 1752 Translationvector *= matrix;1751 Translationvector.MatrixMultiplication(matrix); 1753 1752 //Log() << Verbose(3) << "Translation vector is "; 1754 1753 Log() << Verbose(0) << Translationvector << endl; … … 1781 1780 delete(AtomStack); 1782 1781 delete[](ColorList); 1782 delete[](matrix); 1783 1783 DoLog(2) && (Log() << Verbose(2) << "End of ScanForPeriodicCorrection." << endl); 1784 1784 }; -
src/molecule_geometry.cpp
r5ec8e3 r56fb09 19 19 #include "World.hpp" 20 20 #include "Plane.hpp" 21 #include "Matrix.hpp"22 #include "Box.hpp"23 21 #include <boost/foreach.hpp> 24 22 … … 35 33 const Vector *Center = DetermineCenterOfAll(); 36 34 const Vector *CenterBox = DetermineCenterOfBox(); 37 Box &domain = World::getInstance().getDomain(); 35 double * const cell_size = World::getInstance().getDomain(); 36 double *M = ReturnFullMatrixforSymmetric(cell_size); 37 double *Minv = InverseMatrix(M); 38 38 39 39 // go through all atoms 40 40 ActOnAllVectors( &Vector::SubtractVector, *Center); 41 41 ActOnAllVectors( &Vector::SubtractVector, *CenterBox); 42 BOOST_FOREACH(atom* iter, atoms){43 *iter->node = domain.WrapPeriodically(*iter->node); 44 }45 42 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv); 43 44 delete[](M); 45 delete[](Minv); 46 46 delete(Center); 47 47 delete(CenterBox); … … 56 56 { 57 57 bool status = true; 58 Box &domain = World::getInstance().getDomain(); 58 double * const cell_size = World::getInstance().getDomain(); 59 double *M = ReturnFullMatrixforSymmetric(cell_size); 60 double *Minv = InverseMatrix(M); 59 61 60 62 // go through all atoms 61 BOOST_FOREACH(atom* iter, atoms){62 *iter->node = domain.WrapPeriodically(*iter->node); 63 }64 63 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv); 64 65 delete[](M); 66 delete[](Minv); 65 67 return status; 66 68 }; … … 151 153 { 152 154 Vector *a = new Vector(0.5,0.5,0.5); 153 const Matrix &M = World::getInstance().getDomain().getM(); 154 (*a) *= M; 155 156 const double *cell_size = World::getInstance().getDomain(); 157 double *M = ReturnFullMatrixforSymmetric(cell_size); 158 a->MatrixMultiplication(M); 159 delete[](M); 160 155 161 return a; 156 162 }; … … 238 244 void molecule::TranslatePeriodically(const Vector *trans) 239 245 { 240 Box &domain = World::getInstance().getDomain(); 246 double * const cell_size = World::getInstance().getDomain(); 247 double *M = ReturnFullMatrixforSymmetric(cell_size); 248 double *Minv = InverseMatrix(M); 241 249 242 250 // go through all atoms 243 251 ActOnAllVectors( &Vector::AddVector, *trans); 244 BOOST_FOREACH(atom* iter, atoms){245 *iter->node = domain.WrapPeriodically(*iter->node); 246 }247 252 ActOnAllVectors( &Vector::WrapPeriodically, (const double *)M, (const double *)Minv); 253 254 delete[](M); 255 delete[](Minv); 248 256 }; 249 257 … … 256 264 OBSERVE; 257 265 Plane p(*n,0); 258 BOOST_FOREACH( atom* iter, atoms ){266 BOOST_FOREACH( atom* iter, atoms ){ 259 267 (*iter->node) = p.mirrorVector(*iter->node); 260 268 } … … 266 274 void molecule::DeterminePeriodicCenter(Vector ¢er) 267 275 { 268 const Matrix &matrix = World::getInstance().getDomain().getM(); 269 const Matrix &inversematrix = World::getInstance().getDomain().getM(); 276 double * const cell_size = World::getInstance().getDomain(); 277 double *matrix = ReturnFullMatrixforSymmetric(cell_size); 278 double *inversematrix = InverseMatrix(matrix); 270 279 double tmp; 271 280 bool flag; … … 279 288 if ((*iter)->type->Z != 1) { 280 289 #endif 281 Testvector = inversematrix * (*iter)->x; 290 Testvector = (*iter)->x; 291 Testvector.MatrixMultiplication(inversematrix); 282 292 Translationvector.Zero(); 283 293 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { … … 296 306 } 297 307 Testvector += Translationvector; 298 Testvector *= matrix;308 Testvector.MatrixMultiplication(matrix); 299 309 Center += Testvector; 300 310 Log() << Verbose(1) << "vector is: " << Testvector << endl; … … 303 313 for (BondList::const_iterator Runner = (*iter)->ListOfBonds.begin(); Runner != (*iter)->ListOfBonds.end(); (++Runner)) { 304 314 if ((*Runner)->GetOtherAtom((*iter))->type->Z == 1) { 305 Testvector = inversematrix * (*Runner)->GetOtherAtom((*iter))->x; 315 Testvector = (*Runner)->GetOtherAtom((*iter))->x; 316 Testvector.MatrixMultiplication(inversematrix); 306 317 Testvector += Translationvector; 307 Testvector *= matrix;318 Testvector.MatrixMultiplication(matrix); 308 319 Center += Testvector; 309 320 Log() << Verbose(1) << "Hydrogen vector is: " << Testvector << endl; … … 314 325 } 315 326 } while (!flag); 327 delete[](matrix); 328 delete[](inversematrix); 316 329 317 330 Center.Scale(1./static_cast<double>(getAtomCount())); … … 375 388 DoLog(1) && (Log() << Verbose(1) << "Transforming molecule into PAS ... "); 376 389 // the eigenvectors specify the transformation matrix 377 Matrix M = Matrix(evec->data); 378 BOOST_FOREACH(atom* iter, atoms){ 379 (*iter->node) *= M; 380 } 390 ActOnAllVectors( &Vector::MatrixMultiplication, (const double *) evec->data ); 381 391 DoLog(0) && (Log() << Verbose(0) << "done." << endl); 382 392 -
src/molecule_graph.cpp
r5ec8e3 r56fb09 24 24 #include "Helpers/fast_functions.hpp" 25 25 #include "Helpers/Assert.hpp" 26 #include "Matrix.hpp"27 #include "Box.hpp"28 26 29 27 … … 123 121 LinkedCell *LC = NULL; 124 122 bool free_BG = false; 125 Box &domain= World::getInstance().getDomain();123 double * const cell_size = World::getInstance().getDomain(); 126 124 127 125 if (BG == NULL) { … … 180 178 //Log() << Verbose(1) << "Checking distance " << OtherWalker->x.PeriodicDistanceSquared(&(Walker->x), cell_size) << " against typical bond length of " << bonddistance*bonddistance << "." << endl; 181 179 (BG->*minmaxdistance)(Walker, OtherWalker, MinDistance, MaxDistance, IsAngstroem); 182 const double distance = domain.periodicDistanceSquared(OtherWalker->x,Walker->x);180 const double distance = OtherWalker->x.PeriodicDistanceSquared(Walker->x,cell_size); 183 181 const bool status = (distance <= MaxDistance * MaxDistance) && (distance >= MinDistance * MinDistance); 184 182 // Log() << Verbose(1) << "MinDistance is " << MinDistance << " and MaxDistance is " << MaxDistance << "." << endl; -
src/moleculelist.cpp
r5ec8e3 r56fb09 24 24 #include "periodentafel.hpp" 25 25 #include "Helpers/Assert.hpp" 26 #include "Matrix.hpp"27 #include "Box.hpp"28 26 29 27 #include "Helpers/Assert.hpp" … … 633 631 int FragmentCounter = 0; 634 632 ofstream output; 635 Matrix cell_size = World::getInstance().getDomain().getM(); 636 Matrix cell_size_backup = cell_size; 637 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]; 638 639 // store the fragments as config and as xyz 639 640 for (MoleculeList::iterator ListRunner = ListOfMolecules.begin(); ListRunner != ListOfMolecules.end(); ListRunner++) { … … 673 674 (*ListRunner)->CenterEdge(&BoxDimension); 674 675 (*ListRunner)->SetBoxDimension(&BoxDimension); // update Box of atoms by boundary 676 int j = -1; 675 677 for (int k = 0; k < NDIM; k++) { 678 j += k + 1; 676 679 BoxDimension[k] = 2.5 * (World::getInstance().getConfig()->GetIsAngstroem() ? 1. : 1. / AtomicLengthToAngstroem); 677 cell_size.at(k,k) = BoxDimension[k] * 2.; 678 } 679 World::getInstance().setDomain(cell_size); 680 cell_size[j] = BoxDimension[k] * 2.; 681 } 680 682 (*ListRunner)->Translate(&BoxDimension); 681 683 … … 723 725 724 726 // restore cell_size 725 World::getInstance().setDomain(cell_size_backup); 727 for (int i=0;i<6;i++) 728 cell_size[i] = cell_size_backup[i]; 726 729 727 730 return result; … … 884 887 // center at set box dimensions 885 888 mol->CenterEdge(¢er); 886 Matrix domain; 887 for(int i =0;i<NDIM;++i) 888 domain.at(i,i) = center[i]; 889 World::getInstance().setDomain(domain); 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]; 890 895 insert(mol); 891 896 } -
src/unittests/LineUnittest.cpp
r5ec8e3 r56fb09 17 17 18 18 #include <iostream> 19 #include <cmath>20 19 21 20 using namespace std; … … 353 352 CPPUNIT_ASSERT_EQUAL(fixture,zeroVec); 354 353 } 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
r5ec8e3 r56fb09 22 22 CPPUNIT_TEST ( intersectionTest ); 23 23 CPPUNIT_TEST ( rotationTest ); 24 CPPUNIT_TEST ( sphereIntersectionTest );25 24 CPPUNIT_TEST_SUITE_END(); 26 25 … … 34 33 void intersectionTest(); 35 34 void rotationTest(); 36 void sphereIntersectionTest();37 35 38 36 private: -
src/unittests/Makefile.am
r5ec8e3 r56fb09 38 38 periodentafelTest \ 39 39 PlaneUnittest \ 40 ShapeUnittest \41 40 SingletonTest \ 42 41 StackClassUnitTest \ … … 84 83 periodentafelTest.cpp \ 85 84 PlaneUnittest.cpp \ 86 ShapeUnittest.cpp \87 85 SingletonTest.cpp \ 88 86 stackclassunittest.cpp \ … … 212 210 PlaneUnittest_LDADD = ${ALLLIBS} 213 211 214 ShapeUnittest_SOURCES = UnitTestMain.cpp ShapeUnittest.cpp ShapeUnittest.hpp215 ShapeUnittest_LDADD = ${ALLLIBS}216 217 212 SingletonTest_SOURCES = UnitTestMain.cpp SingletonTest.cpp SingletonTest.hpp 218 213 SingletonTest_LDADD = ${ALLLIBS} $(BOOST_LIB) ${BOOST_THREAD_LIB} -
src/unittests/PlaneUnittest.cpp
r5ec8e3 r56fb09 11 11 #include <cppunit/extensions/TestFactoryRegistry.h> 12 12 #include <cppunit/ui/text/TestRunner.h> 13 14 #include <cmath>15 13 16 14 #ifdef HAVE_TESTRUNNER -
src/unittests/linearsystemofequationsunittest.cpp
r5ec8e3 r56fb09 12 12 #include <cppunit/extensions/TestFactoryRegistry.h> 13 13 #include <cppunit/ui/text/TestRunner.h> 14 #include <cmath>15 14 16 15 #include "linearsystemofequationsunittest.hpp" -
src/unittests/vectorunittest.cpp
r5ec8e3 r56fb09 21 21 #include "Plane.hpp" 22 22 #include "Exceptions/LinearDependenceException.hpp" 23 #include "Matrix.hpp"24 23 25 24 #ifdef HAVE_TESTRUNNER … … 215 214 CPPUNIT_ASSERT(testVector.ScalarProduct(three) < MYEPSILON); 216 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
r5ec8e3 r56fb09 27 27 CPPUNIT_TEST ( ProjectionTest ); 28 28 CPPUNIT_TEST ( NormalsTest ); 29 CPPUNIT_TEST ( IsInParallelepipedTest ); 29 30 CPPUNIT_TEST_SUITE_END(); 30 31 … … 44 45 void LineIntersectionTest(); 45 46 void VectorRotationTest(); 47 void IsInParallelepipedTest(); 46 48 47 49 private: -
src/vector.cpp
r5ec8e3 r56fb09 12 12 #include "Helpers/Assert.hpp" 13 13 #include "Helpers/fast_functions.hpp" 14 #include "Exceptions/MathException.hpp"15 14 16 15 #include <iostream> 17 #include <gsl/gsl_blas.h>18 19 16 20 17 using namespace std; … … 37 34 { 38 35 content = gsl_vector_alloc(NDIM); 39 gsl_vector_memcpy(content, src.content); 36 gsl_vector_set(content,0,src[0]); 37 gsl_vector_set(content,1,src[1]); 38 gsl_vector_set(content,2,src[2]); 40 39 } 41 40 … … 50 49 }; 51 50 52 Vector::Vector(gsl_vector *_content) :53 content(_content)54 {}55 56 51 /** 57 52 * Assignment operator … … 60 55 // check for self assignment 61 56 if(&src!=this){ 62 gsl_vector_memcpy(content, src.content); 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 60 } 64 61 return *this; … … 97 94 } 98 95 96 /** Calculates distance between this and another vector in a periodic cell. 97 * \param *y array to second vector 98 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell 99 * \return \f$| x - y |\f$ 100 */ 101 double Vector::PeriodicDistance(const Vector &y, const double * const cell_size) const 102 { 103 double res = distance(y), tmp, matrix[NDIM*NDIM]; 104 Vector Shiftedy, TranslationVector; 105 int N[NDIM]; 106 matrix[0] = cell_size[0]; 107 matrix[1] = cell_size[1]; 108 matrix[2] = cell_size[3]; 109 matrix[3] = cell_size[1]; 110 matrix[4] = cell_size[2]; 111 matrix[5] = cell_size[4]; 112 matrix[6] = cell_size[3]; 113 matrix[7] = cell_size[4]; 114 matrix[8] = cell_size[5]; 115 // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells 116 for (N[0]=-1;N[0]<=1;N[0]++) 117 for (N[1]=-1;N[1]<=1;N[1]++) 118 for (N[2]=-1;N[2]<=1;N[2]++) { 119 // create the translation vector 120 TranslationVector.Zero(); 121 for (int i=NDIM;i--;) 122 TranslationVector[i] = (double)N[i]; 123 TranslationVector.MatrixMultiplication(matrix); 124 // add onto the original vector to compare with 125 Shiftedy = y + TranslationVector; 126 // get distance and compare with minimum so far 127 tmp = distance(Shiftedy); 128 if (tmp < res) res = tmp; 129 } 130 return (res); 131 }; 132 133 /** Calculates distance between this and another vector in a periodic cell. 134 * \param *y array to second vector 135 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell 136 * \return \f$| x - y |^2\f$ 137 */ 138 double Vector::PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const 139 { 140 double res = DistanceSquared(y), tmp, matrix[NDIM*NDIM]; 141 Vector Shiftedy, TranslationVector; 142 int N[NDIM]; 143 matrix[0] = cell_size[0]; 144 matrix[1] = cell_size[1]; 145 matrix[2] = cell_size[3]; 146 matrix[3] = cell_size[1]; 147 matrix[4] = cell_size[2]; 148 matrix[5] = cell_size[4]; 149 matrix[6] = cell_size[3]; 150 matrix[7] = cell_size[4]; 151 matrix[8] = cell_size[5]; 152 // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells 153 for (N[0]=-1;N[0]<=1;N[0]++) 154 for (N[1]=-1;N[1]<=1;N[1]++) 155 for (N[2]=-1;N[2]<=1;N[2]++) { 156 // create the translation vector 157 TranslationVector.Zero(); 158 for (int i=NDIM;i--;) 159 TranslationVector[i] = (double)N[i]; 160 TranslationVector.MatrixMultiplication(matrix); 161 // add onto the original vector to compare with 162 Shiftedy = y + TranslationVector; 163 // get distance and compare with minimum so far 164 tmp = DistanceSquared(Shiftedy); 165 if (tmp < res) res = tmp; 166 } 167 return (res); 168 }; 169 170 /** Keeps the vector in a periodic cell, defined by the symmetric \a *matrix. 171 * \param *out ofstream for debugging messages 172 * Tries to translate a vector into each adjacent neighbouring cell. 173 */ 174 void Vector::KeepPeriodic(const double * const matrix) 175 { 176 // int N[NDIM]; 177 // bool flag = false; 178 //vector Shifted, TranslationVector; 179 // Log() << Verbose(1) << "Begin of KeepPeriodic." << endl; 180 // Log() << Verbose(2) << "Vector is: "; 181 // Output(out); 182 // Log() << Verbose(0) << endl; 183 InverseMatrixMultiplication(matrix); 184 for(int i=NDIM;i--;) { // correct periodically 185 if (at(i) < 0) { // get every coefficient into the interval [0,1) 186 at(i) += ceil(at(i)); 187 } else { 188 at(i) -= floor(at(i)); 189 } 190 } 191 MatrixMultiplication(matrix); 192 // Log() << Verbose(2) << "New corrected vector is: "; 193 // Output(out); 194 // Log() << Verbose(0) << endl; 195 // Log() << Verbose(1) << "End of KeepPeriodic." << endl; 196 }; 197 99 198 /** Calculates scalar product between this and another vector. 100 199 * \param *y array to second vector … … 104 203 { 105 204 double res = 0.; 106 gsl_blas_ddot(content, y.content, &res); 205 for (int i=NDIM;i--;) 206 res += at(i)*y[i]; 107 207 return (res); 108 208 }; … … 404 504 }; 405 505 406 void Vector::ScaleAll(const Vector &factor){407 gsl_vector_mul(content, factor.content);408 }409 506 410 507 411 508 void Vector::Scale(const double factor) 412 509 { 413 gsl_vector_scale(content,factor); 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 530 }; 415 531 … … 430 546 return make_pair(res,helper); 431 547 } 548 549 /** Do a matrix multiplication. 550 * \param *matrix NDIM_NDIM array 551 */ 552 void Vector::MatrixMultiplication(const double * const M) 553 { 554 Vector tmp; 555 // do the matrix multiplication 556 for(int i=NDIM;i--;) 557 tmp[i] = M[i]*at(0)+M[i+3]*at(1)+M[i+6]*at(2); 558 559 (*this) = tmp; 560 }; 561 562 /** Do a matrix multiplication with the \a *A' inverse. 563 * \param *matrix NDIM_NDIM array 564 */ 565 bool Vector::InverseMatrixMultiplication(const double * const A) 566 { 567 double B[NDIM*NDIM]; 568 double detA = RDET3(A); 569 double detAReci; 570 571 // calculate the inverse B 572 if (fabs(detA) > MYEPSILON) {; // RDET3(A) yields precisely zero if A irregular 573 detAReci = 1./detA; 574 B[0] = detAReci*RDET2(A[4],A[5],A[7],A[8]); // A_11 575 B[1] = -detAReci*RDET2(A[1],A[2],A[7],A[8]); // A_12 576 B[2] = detAReci*RDET2(A[1],A[2],A[4],A[5]); // A_13 577 B[3] = -detAReci*RDET2(A[3],A[5],A[6],A[8]); // A_21 578 B[4] = detAReci*RDET2(A[0],A[2],A[6],A[8]); // A_22 579 B[5] = -detAReci*RDET2(A[0],A[2],A[3],A[5]); // A_23 580 B[6] = detAReci*RDET2(A[3],A[4],A[6],A[7]); // A_31 581 B[7] = -detAReci*RDET2(A[0],A[1],A[6],A[7]); // A_32 582 B[8] = detAReci*RDET2(A[0],A[1],A[3],A[4]); // A_33 583 584 MatrixMultiplication(B); 585 586 return true; 587 } else { 588 return false; 589 } 590 }; 591 432 592 433 593 /** Creates this vector as the b y *factors' components scaled linear combination of the given three. … … 519 679 void Vector::AddVector(const Vector &y) 520 680 { 521 gsl_vector_add(content, y.content); 681 for(int i=NDIM;i--;) 682 at(i) += y[i]; 522 683 } 523 684 … … 527 688 void Vector::SubtractVector(const Vector &y) 528 689 { 529 gsl_vector_sub(content, y.content); 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 711 } 531 712 -
src/vector.hpp
r5ec8e3 r56fb09 13 13 #include <iostream> 14 14 #include <gsl/gsl_vector.h> 15 #include <gsl/gsl_multimin.h> 15 16 16 17 #include <memory> … … 23 24 24 25 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&);34 33 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; 44 46 double ScalarProduct(const Vector &y) const; 45 47 double Angle(const Vector &y) const; … … 56 58 Vector Projection(const Vector &y) const; 57 59 void ScaleAll(const double *factor); 58 void ScaleAll(const Vector &factor);59 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); 60 64 bool GetOneNormalVector(const Vector &x1); 61 65 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); 62 68 std::pair<Vector,Vector> partition(const Vector&) const; 63 69 std::pair<pointset,Vector> partition(const pointset&) const; … … 98 104 99 105 private: 100 Vector(gsl_vector *);101 106 gsl_vector *content; 102 107 -
src/vector_ops.cpp
r5ec8e3 r56fb09 23 23 #include <gsl/gsl_permutation.h> 24 24 #include <gsl/gsl_vector.h> 25 #include <gsl/gsl_multimin.h>26 25 27 26 /** -
tests/regression/Domain/4/post/test.conf
r5ec8e3 r56fb09 47 47 BoxLength # (Length of a unit cell) 48 48 1 49 0 149 0 0 50 50 0 0 2 51 51
Note:
See TracChangeset
for help on using the changeset viewer.