Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 : Copyright (c) 2015-2023 The plumed team 3 : (see the PEOPLE file at the root of the distribution for a list of names) 4 : 5 : See http://www.plumed.org for more information. 6 : 7 : This file is part of plumed, version 2. 8 : 9 : plumed is free software: you can redistribute it and/or modify 10 : it under the terms of the GNU Lesser General Public License as published by 11 : the Free Software Foundation, either version 3 of the License, or 12 : (at your option) any later version. 13 : 14 : plumed is distributed in the hope that it will be useful, 15 : but WITHOUT ANY WARRANTY; without even the implied warranty of 16 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 : GNU Lesser General Public License for more details. 18 : 19 : You should have received a copy of the GNU Lesser General Public License 20 : along with plumed. If not, see <http://www.gnu.org/licenses/>. 21 : +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ 22 : #ifndef __PLUMED_adjmat_AdjacencyMatrixBase_h 23 : #define __PLUMED_adjmat_AdjacencyMatrixBase_h 24 : 25 : #include "multicolvar/MultiColvarBase.h" 26 : #include "AdjacencyMatrixVessel.h" 27 : 28 : namespace PLMD { 29 : namespace adjmat { 30 : 31 : class AdjacencyMatrixBase : public multicolvar::MultiColvarBase { 32 : friend class AdjacencyMatrixVessel; 33 : friend class ActionWithInputMatrix; 34 : friend class MatrixColumnSums; 35 : friend class MatrixRowSums; 36 : private: 37 : /// Used for read in of multiple connection descriptors 38 : unsigned connect_id; 39 : /// Do we need to separate out the tasks for the third atoms 40 : bool no_third_dim_accum; 41 : /// This is the vessel that stores the adjacency matrix 42 : AdjacencyMatrixVessel* mat; 43 : /// This is used within AdjacencyMatrixVessel to recalculate matrix elements 44 : /// which is useful when we are operating with lowmem 45 : void recalculateMatrixElement( const unsigned& myelem, MultiValue& myvals ); 46 : /// Finish the setup of the matrix 47 : void finishMatrixSetup( const bool& symmetric, const std::vector<AtomNumber>& all_atoms ); 48 : protected: 49 : /// Read in a matrix involving a maximum of two species 50 : void readMaxTwoSpeciesMatrix( const std::string& key0, const std::string& key1, const std::string& key2, const bool& symmetric ); 51 : /// Read in a matrix involving a maximum of three species 52 : void readMaxThreeSpeciesMatrix( const std::string& key0, const std::string& key1, const std::string& key2, const std::string& keym, const bool& symmetric ); 53 : /// Get the dimensions of the matrix of types 54 : void retrieveTypeDimensions( unsigned& nrows, unsigned& ncols, unsigned& ntype ) const ; 55 : /// Retrieve the vessel that holds the adjacency matrix 56 : AdjacencyMatrixVessel* getAdjacencyVessel(); 57 : /// Put the indices of the matrix elements in current atoms 58 : void setMatrixIndexesForTask( const unsigned& ii ); 59 : /// Add derivatives to a matrix element 60 : void addDerivativesOnMatrixElement( const unsigned& ielem, const unsigned& jrow, const double& df, Matrix<double>& der ); 61 : /// Read in the information on the connectors 62 : void parseConnectionDescriptions( const std::string& key, const bool& multiple, const unsigned& nrow_t ); 63 : protected: 64 : /// Get the number of nodes of different types 65 : unsigned getNumberOfNodeTypes() const ; 66 : /// Get the size of the vectors that were stored in the base colvars 67 : unsigned getSizeOfInputVectors() const ; 68 : /// Return the group this atom is a part of 69 : unsigned getBaseColvarNumber( const unsigned& ) const ; 70 : public: 71 : static void registerKeywords( Keywords& keys ); 72 : explicit AdjacencyMatrixBase(const ActionOptions&); 73 : /// Create the connection object 74 : virtual void setupConnector( const unsigned& id, const unsigned& i, const unsigned& j, const std::vector<std::string>& desc ) = 0; 75 : /// None of these things are allowed 76 25 : bool isPeriodic() { return false; } 77 : Vector getCentralAtom() { plumed_merror("cannot find central atoms for adjacency matrix actions"); Vector dum; return dum; } 78 : /// Get the atom number 79 : AtomNumber getAbsoluteIndexOfCentralAtom( const unsigned& i ) const ; 80 : }; 81 : 82 : inline 83 : AdjacencyMatrixVessel* AdjacencyMatrixBase::getAdjacencyVessel() { 84 : return mat; 85 : } 86 : 87 : inline 88 : unsigned AdjacencyMatrixBase::getBaseColvarNumber( const unsigned& inum ) const { 89 224925223 : if( atom_lab[inum].first>0 ) return atom_lab[inum].first-1; 90 : return 0; 91 : } 92 : 93 : inline 94 504 : AtomNumber AdjacencyMatrixBase::getAbsoluteIndexOfCentralAtom( const unsigned& iatom ) const { 95 504 : if( atom_lab[iatom].first>0 ) { 96 156 : unsigned mmc=atom_lab[ iatom ].first - 1; 97 156 : return mybasemulticolvars[mmc]->getAbsoluteIndexOfCentralAtom( atom_lab[iatom].second ); 98 : } 99 348 : return ActionAtomistic::getAbsoluteIndex( atom_lab[iatom].second ); 100 : } 101 : 102 : } 103 : } 104 : 105 : #endif