Ignore:
Timestamp:
Dec 4, 2010, 11:54:32 PM (14 years ago)
Author:
Frederik Heber <heber@…>
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, 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:
cca9ef
Parents:
9eb7580
git-author:
Frederik Heber <heber@…> (11/15/10 12:36:18)
git-committer:
Frederik Heber <heber@…> (12/04/10 23:54:32)
Message:

Extended MatrixContent class.

  • MatrixContent formerly has been just a structure to contain the gsl_matrix due to forward declaration reasons.
  • now MatrixContent is a true wrapper to gsl_matrix, i.e. all functionality that is now specific to 3 dimensions has been shifted from Matrix over to MatrixContent.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/LinearAlgebra/Matrix.cpp

    r9eb7580 r3bc926  
    2626#include "Helpers/Assert.hpp"
    2727#include "LinearAlgebra/Vector.hpp"
    28 #include "VectorContent.hpp"
    29 #include "MatrixContent.hpp"
     28#include "LinearAlgebra/VectorContent.hpp"
     29#include "LinearAlgebra/MatrixContent.hpp"
    3030
    3131#include <gsl/gsl_blas.h>
     
    4141Matrix::Matrix()
    4242{
    43   content = new MatrixContent();
    44   content->content = gsl_matrix_calloc(NDIM, NDIM);
    45   createViews();
    46 }
    47 
    48 Matrix::Matrix(const double* src){
    49   content = new MatrixContent();
    50   content->content = gsl_matrix_alloc(NDIM, NDIM);
    51   set(0,0, src[0]);
    52   set(1,0, src[1]);
    53   set(2,0, src[2]);
    54 
    55   set(0,1, src[3]);
    56   set(1,1, src[4]);
    57   set(2,1, src[5]);
    58 
    59   set(0,2, src[6]);
    60   set(1,2, src[7]);
    61   set(2,2, src[8]);
    62   createViews();
    63 }
    64 
    65 Matrix::Matrix(const Matrix &src){
    66   content = new MatrixContent();
    67   content->content = gsl_matrix_alloc(NDIM, NDIM);
    68   gsl_matrix_memcpy(content->content,src.content->content);
    69   createViews();
    70 }
    71 
    72 Matrix::Matrix(MatrixContent* _content) :
    73   content(_content)
    74 {
     43  content = new MatrixContent(NDIM, NDIM);
     44  createViews();
     45}
     46
     47Matrix::Matrix(const double* src)
     48{
     49  content = new MatrixContent(NDIM, NDIM, src);
     50  createViews();
     51}
     52
     53Matrix::Matrix(const Matrix &src)
     54{
     55  content = new MatrixContent(src.content);
     56  createViews();
     57}
     58
     59Matrix::Matrix(const MatrixContent &src)
     60{
     61  content = new MatrixContent(src);
     62  createViews();
     63}
     64
     65Matrix::Matrix(MatrixContent* _content)
     66{
     67  content = new MatrixContent(_content);
    7568  createViews();
    7669}
     
    8679  }
    8780  delete diagonal_ptr;
    88   gsl_matrix_free(content->content);
    8981  delete content;
    9082}
     
    10799
    108100void Matrix::setIdentity(){
    109   for(int i=NDIM;i--;){
    110     for(int j=NDIM;j--;){
    111       set(i,j,i==j);
    112     }
    113   }
     101  content->setIdentity();
    114102}
    115103
    116104void Matrix::setZero(){
    117   for(int i=NDIM;i--;){
    118     for(int j=NDIM;j--;){
    119       set(i,j,0.);
    120     }
    121   }
     105  content->setZero();
    122106}
    123107
     
    135119}
    136120
    137 Matrix &Matrix::operator=(const Matrix &src){
    138   if(&src!=this){
    139     gsl_matrix_memcpy(content->content,src.content->content);
    140   }
    141   return *this;
    142 }
    143 
    144 const Matrix &Matrix::operator+=(const Matrix &rhs){
    145   gsl_matrix_add(content->content, rhs.content->content);
    146   return *this;
    147 }
    148 
    149 const Matrix &Matrix::operator-=(const Matrix &rhs){
    150   gsl_matrix_sub(content->content, rhs.content->content);
    151   return *this;
    152 }
    153 
    154 const Matrix &Matrix::operator*=(const Matrix &rhs){
    155   (*this) = (*this)*rhs;
    156   return *this;
    157 }
    158 
    159 const Matrix Matrix::operator+(const Matrix &rhs) const{
     121Matrix &Matrix::operator=(const Matrix &src)
     122{
     123  // MatrixContent checks for self-assignment
     124  *content = *(src.content);
     125  return *this;
     126}
     127
     128const Matrix &Matrix::operator+=(const Matrix &rhs)
     129{
     130  *content += *(rhs.content);
     131  return *this;
     132}
     133
     134const Matrix &Matrix::operator-=(const Matrix &rhs)
     135{
     136  *content -= *(rhs.content);
     137  return *this;
     138}
     139
     140const Matrix &Matrix::operator*=(const Matrix &rhs)
     141{
     142  (*content) *= (*rhs.content);
     143  return *this;
     144}
     145
     146const Matrix Matrix::operator+(const Matrix &rhs) const
     147{
    160148  Matrix tmp = *this;
    161149  tmp+=rhs;
     
    163151}
    164152
    165 const Matrix Matrix::operator-(const Matrix &rhs) const{
     153const Matrix Matrix::operator-(const Matrix &rhs) const
     154{
    166155  Matrix tmp = *this;
    167156  tmp-=rhs;
     
    169158}
    170159
    171 const Matrix Matrix::operator*(const Matrix &rhs) const{
    172   gsl_matrix *res = gsl_matrix_alloc(NDIM, NDIM);
    173   gsl_blas_dgemm(CblasNoTrans, CblasNoTrans, 1.0, content->content, rhs.content->content, 0.0, res);
    174   MatrixContent *content= new MatrixContent();
    175   content->content = res;
    176   return Matrix(content);
    177 }
    178 
    179 double &Matrix::at(size_t i, size_t j){
    180   ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    181   ASSERT(j>=0&&j<NDIM,"Index j for Matrix access out of range");
    182   return *gsl_matrix_ptr (content->content, i, j);
    183 }
    184 
    185 const double Matrix::at(size_t i, size_t j) const{
    186   ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    187   ASSERT(j>=0&&j<NDIM,"Index j for Matrix access out of range");
    188   return gsl_matrix_get(content->content, i, j);
    189 }
    190 
    191 Vector &Matrix::row(size_t i){
     160const Matrix Matrix::operator*(const Matrix &rhs) const
     161{
     162  Matrix tmp(content);
     163  tmp *= rhs;
     164  return tmp;
     165}
     166
     167double &Matrix::at(size_t i, size_t j)
     168{
     169  return content->at(i,j);
     170}
     171
     172const double Matrix::at(size_t i, size_t j) const
     173{
     174  return content->at(i,j);
     175}
     176
     177Vector &Matrix::row(size_t i)
     178{
    192179  ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    193180  return *rows_ptr[i];
    194181}
    195182
    196 const Vector &Matrix::row(size_t i) const{
     183const Vector &Matrix::row(size_t i) const
     184{
    197185  ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    198186  return *rows_ptr[i];
    199187}
    200188
    201 Vector &Matrix::column(size_t i){
     189Vector &Matrix::column(size_t i)
     190{
    202191  ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    203192  return *columns_ptr[i];
    204193}
    205194
    206 const Vector &Matrix::column(size_t i) const{
     195const Vector &Matrix::column(size_t i) const
     196{
    207197  ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    208198  return *columns_ptr[i];
    209199}
    210200
    211 Vector &Matrix::diagonal(){
     201Vector &Matrix::diagonal()
     202{
    212203  return *diagonal_ptr;
    213204}
    214205
    215 const Vector &Matrix::diagonal() const{
     206const Vector &Matrix::diagonal() const
     207{
    216208  return *diagonal_ptr;
    217209}
    218210
    219 void Matrix::set(size_t i, size_t j, const double value){
    220   ASSERT(i>=0&&i<NDIM,"Index i for Matrix access out of range");
    221   ASSERT(j>=0&&j<NDIM,"Index j for Matrix access out of range");
    222   gsl_matrix_set(content->content,i,j,value);
     211void Matrix::set(size_t i, size_t j, const double value)
     212{
     213  content->set(i,j, value);
    223214}
    224215
     
    253244}
    254245
    255 Matrix Matrix::transpose() const{
    256   MatrixContent *newContent = new MatrixContent();
    257   newContent->content = gsl_matrix_alloc(NDIM, NDIM);
    258   gsl_matrix_transpose_memcpy(newContent->content, content->content);
    259   Matrix res = Matrix(newContent);
     246Matrix Matrix::transpose() const
     247{
     248  std::cout << "const Matrix::transpose()." << std::endl;
     249  Matrix res = Matrix(const_cast<const MatrixContent *>(content)->transpose());
    260250  return res;
    261251}
     
    263253Matrix &Matrix::transpose()
    264254{
    265   double tmp;
    266   for (int i=0;i<NDIM;i++)
    267     for (int j=i+1;j<NDIM;j++) {
    268       tmp = at(j,i);
    269       at(j,i) = at(i,j);
    270       at(i,j) = tmp;
    271     }
    272   return *this;
    273 }
    274 
     255  std::cout << "Matrix::transpose()." << std::endl;
     256  content->transpose();
     257  return *this;
     258}
    275259
    276260Vector Matrix::transformToEigenbasis()
    277261{
    278   gsl_eigen_symmv_workspace *T = gsl_eigen_symmv_alloc(NDIM);
    279   gsl_vector *eval = gsl_vector_alloc(NDIM);
    280   gsl_matrix *evec = gsl_matrix_alloc(NDIM, NDIM);
    281   gsl_eigen_symmv(content->content, eval, evec, T);
    282   gsl_eigen_symmv_free(T);
    283   gsl_matrix_memcpy(content->content, evec);
    284   gsl_matrix_free(evec);
     262  gsl_vector *eval = content->transformToEigenbasis();
    285263  Vector evalues(gsl_vector_get(eval,0), gsl_vector_get(eval,1), gsl_vector_get(eval,2));
    286264  gsl_vector_free(eval);
     
    288266}
    289267
    290 const Matrix &Matrix::operator*=(const double factor){
    291   gsl_matrix_scale(content->content, factor);
    292   return *this;
    293 }
    294 
    295 const Matrix operator*(const double factor,const Matrix& mat){
     268const Matrix &Matrix::operator*=(const double factor)
     269    {
     270  *content *= factor;
     271  return *this;
     272}
     273
     274const Matrix operator*(const double factor,const Matrix& mat)
     275{
    296276  Matrix tmp = mat;
    297   tmp*=factor;
    298   return tmp;
    299 }
    300 
    301 const Matrix operator*(const Matrix &mat,const double factor){
     277  return tmp *= factor;
     278}
     279
     280const Matrix operator*(const Matrix &mat,const double factor)
     281{
    302282  return factor*mat;
    303283}
    304284
    305 bool Matrix::operator==(const Matrix &rhs) const{
    306   for(int i=NDIM;i--;){
    307     for(int j=NDIM;j--;){
    308       if(fabs(at(i,j)-rhs.at(i,j))>MYEPSILON){
    309         return false;
    310       }
    311     }
    312   }
    313   return true;
     285bool Matrix::operator==(const Matrix &rhs) const
     286{
     287  return (*content == *(rhs.content));
    314288}
    315289
     
    333307};
    334308
    335 ostream &operator<<(ostream &ost,const Matrix &mat){
     309ostream &operator<<(ostream &ost,const Matrix &mat)
     310{
    336311  for(int i = 0;i<NDIM;++i){
    337312    ost << "\n";
     
    345320}
    346321
    347 Vector operator*(const Matrix &mat,const Vector &vec){
    348   Vector res;
    349   gsl_blas_dgemv( CblasNoTrans, 1.0, mat.content->content, vec.content->content, 0.0, res.content->content);
    350   return res;
    351 }
    352 
    353 Vector &operator*=(Vector& lhs,const Matrix &mat){
     322Vector operator*(const Matrix &mat,const Vector &vec)
     323{
     324  return (*mat.content) * vec;
     325}
     326
     327Vector &operator*=(Vector& lhs,const Matrix &mat)
     328{
    354329  lhs = mat*lhs;
    355330  return lhs;
Note: See TracChangeset for help on using the changeset viewer.