Changeset 8f822c for src/vector.cpp
- Timestamp:
- Jul 1, 2010, 1:55:08 PM (15 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, Candidate_v1.7.0, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- b5bf84
- Parents:
- 0d5dce (diff), 014475 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - File:
-
- 1 edited
-
src/vector.cpp (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/vector.cpp
r0d5dce r8f822c 8 8 9 9 #include "vector.hpp" 10 #include "Matrix.hpp" 10 11 #include "verbose.hpp" 11 12 #include "World.hpp" 12 13 #include "Helpers/Assert.hpp" 13 14 #include "Helpers/fast_functions.hpp" 15 #include "Exceptions/MathException.hpp" 14 16 15 17 #include <iostream> 18 #include <gsl/gsl_blas.h> 19 16 20 17 21 using namespace std; … … 34 38 { 35 39 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]); 40 gsl_vector_memcpy(content, src.content); 39 41 } 40 42 … … 49 51 }; 50 52 53 Vector::Vector(gsl_vector *_content) : 54 content(_content) 55 {} 56 51 57 /** 52 58 * Assignment operator … … 55 61 // check for self assignment 56 62 if(&src!=this){ 57 gsl_vector_set(content,0,src[0]); 58 gsl_vector_set(content,1,src[1]); 59 gsl_vector_set(content,2,src[2]); 63 gsl_vector_memcpy(content, src.content); 60 64 } 61 65 return *this; … … 94 98 } 95 99 96 /** Calculates distance between this and another vector in a periodic cell.97 * \param *y array to second vector98 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell99 * \return \f$| x - y |\f$100 */101 double Vector::PeriodicDistance(const Vector &y, const double * const cell_size) const102 {103 double res = distance(y), tmp, matrix[NDIM*NDIM];104 Vector Shiftedy, TranslationVector;105 int N[NDIM];106 matrix[0] = cell_size[0];107 matrix[1] = cell_size[1];108 matrix[2] = cell_size[3];109 matrix[3] = cell_size[1];110 matrix[4] = cell_size[2];111 matrix[5] = cell_size[4];112 matrix[6] = cell_size[3];113 matrix[7] = cell_size[4];114 matrix[8] = cell_size[5];115 // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells116 for (N[0]=-1;N[0]<=1;N[0]++)117 for (N[1]=-1;N[1]<=1;N[1]++)118 for (N[2]=-1;N[2]<=1;N[2]++) {119 // create the translation vector120 TranslationVector.Zero();121 for (int i=NDIM;i--;)122 TranslationVector[i] = (double)N[i];123 TranslationVector.MatrixMultiplication(matrix);124 // add onto the original vector to compare with125 Shiftedy = y + TranslationVector;126 // get distance and compare with minimum so far127 tmp = distance(Shiftedy);128 if (tmp < res) res = tmp;129 }130 return (res);131 };132 133 /** Calculates distance between this and another vector in a periodic cell.134 * \param *y array to second vector135 * \param *cell_size 6-dimensional array with (xx, xy, yy, xz, yz, zz) entries specifying the periodic cell136 * \return \f$| x - y |^2\f$137 */138 double Vector::PeriodicDistanceSquared(const Vector &y, const double * const cell_size) const139 {140 double res = DistanceSquared(y), tmp, matrix[NDIM*NDIM];141 Vector Shiftedy, TranslationVector;142 int N[NDIM];143 matrix[0] = cell_size[0];144 matrix[1] = cell_size[1];145 matrix[2] = cell_size[3];146 matrix[3] = cell_size[1];147 matrix[4] = cell_size[2];148 matrix[5] = cell_size[4];149 matrix[6] = cell_size[3];150 matrix[7] = cell_size[4];151 matrix[8] = cell_size[5];152 // in order to check the periodic distance, translate one of the vectors into each of the 27 neighbouring cells153 for (N[0]=-1;N[0]<=1;N[0]++)154 for (N[1]=-1;N[1]<=1;N[1]++)155 for (N[2]=-1;N[2]<=1;N[2]++) {156 // create the translation vector157 TranslationVector.Zero();158 for (int i=NDIM;i--;)159 TranslationVector[i] = (double)N[i];160 TranslationVector.MatrixMultiplication(matrix);161 // add onto the original vector to compare with162 Shiftedy = y + TranslationVector;163 // get distance and compare with minimum so far164 tmp = DistanceSquared(Shiftedy);165 if (tmp < res) res = tmp;166 }167 return (res);168 };169 170 /** Keeps the vector in a periodic cell, defined by the symmetric \a *matrix.171 * \param *out ofstream for debugging messages172 * Tries to translate a vector into each adjacent neighbouring cell.173 */174 void Vector::KeepPeriodic(const double * const matrix)175 {176 // int N[NDIM];177 // bool flag = false;178 //vector Shifted, TranslationVector;179 // Log() << Verbose(1) << "Begin of KeepPeriodic." << endl;180 // Log() << Verbose(2) << "Vector is: ";181 // Output(out);182 // Log() << Verbose(0) << endl;183 InverseMatrixMultiplication(matrix);184 for(int i=NDIM;i--;) { // correct periodically185 if (at(i) < 0) { // get every coefficient into the interval [0,1)186 at(i) += ceil(at(i));187 } else {188 at(i) -= floor(at(i));189 }190 }191 MatrixMultiplication(matrix);192 // Log() << Verbose(2) << "New corrected vector is: ";193 // Output(out);194 // Log() << Verbose(0) << endl;195 // Log() << Verbose(1) << "End of KeepPeriodic." << endl;196 };197 198 100 /** Calculates scalar product between this and another vector. 199 101 * \param *y array to second vector … … 203 105 { 204 106 double res = 0.; 205 for (int i=NDIM;i--;) 206 res += at(i)*y[i]; 107 gsl_blas_ddot(content, y.content, &res); 207 108 return (res); 208 109 }; … … 461 362 }; 462 363 364 Vector &Vector::operator*=(const Matrix &mat){ 365 (*this) = mat*(*this); 366 return *this; 367 } 368 369 Vector operator*(const Matrix &mat,const Vector &vec){ 370 gsl_vector *res = gsl_vector_calloc(NDIM); 371 gsl_blas_dgemv( CblasNoTrans, 1.0, mat.content, vec.content, 0.0, res); 372 return Vector(res); 373 } 374 375 463 376 /** Factors given vector \a a times \a m. 464 377 * \param a vector … … 508 421 void Vector::Scale(const double factor) 509 422 { 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); 423 gsl_vector_scale(content,factor); 530 424 }; 531 425 … … 546 440 return make_pair(res,helper); 547 441 } 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 442 593 443 /** Creates this vector as the b y *factors' components scaled linear combination of the given three. … … 679 529 void Vector::AddVector(const Vector &y) 680 530 { 681 for(int i=NDIM;i--;) 682 at(i) += y[i]; 531 gsl_vector_add(content, y.content); 683 532 } 684 533 … … 688 537 void Vector::SubtractVector(const Vector &y) 689 538 { 690 for(int i=NDIM;i--;) 691 at(i) -= y[i]; 539 gsl_vector_sub(content, y.content); 692 540 } 693 541 … … 699 547 * @param three vectors forming the matrix that defines the shape of the parallelpiped 700 548 */ 701 bool Vector::IsInParallelepiped(const Vector &offset, const double * constparallelepiped) const702 { 703 Vector a = (*this)-offset;704 a.InverseMatrixMultiplication(parallelepiped);549 bool Vector::IsInParallelepiped(const Vector &offset, const Matrix& _parallelepiped) const 550 { 551 Matrix parallelepiped = _parallelepiped.invert(); 552 Vector a = parallelepiped * ((*this)-offset); 705 553 bool isInside = true; 706 554
Note:
See TracChangeset
for help on using the changeset viewer.
