Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 : Copyright (c) 2016-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_vesselbase_AveragingVessel_h 23 : #define __PLUMED_vesselbase_AveragingVessel_h 24 : 25 : #include "Vessel.h" 26 : 27 : namespace PLMD { 28 : namespace vesselbase { 29 : 30 : class AveragingVessel : public Vessel { 31 : private: 32 : /// The grid was recently cleared and bounds can be set 33 : bool wascleared; 34 : /// Are we outputting unormalised data 35 : bool unormalised; 36 : /// The data that is being averaged 37 : std::vector<double> data; 38 : protected: 39 : /// Set the size of the data vector 40 : void setDataSize( const unsigned& size ); 41 : /// Set an element of the data array 42 : void setDataElement( const unsigned& myelem, const double& value ); 43 : /// Add some value to an element of the data array 44 : void addDataElement( const unsigned& myelem, const double& value ); 45 : /// Get the value of one of the data element 46 : double getDataElement( const unsigned& myelem ) const ; 47 : /// Are we averaging the data 48 361722 : bool noAverage() const { return unormalised; } 49 : public: 50 : /// keywords 51 : static void registerKeywords( Keywords& keys ); 52 : /// Constructor 53 : explicit AveragingVessel( const vesselbase::VesselOptions& ); 54 : /// Copy data from an accumulated buffer into the grid 55 : void finish( const std::vector<double>& ) override; 56 : /// Was the grid cleared on the last step 57 : bool wasreset() const ; 58 : /// Clear all the data stored on the grid 59 : virtual void clear(); 60 : /// Reset the grid so that it is cleared at start of next time it is calculated 61 : virtual void reset(); 62 : /// Functions for dealing with normalisation constant 63 : void setNorm( const double& snorm ); 64 : double getNorm() const ; 65 0 : bool applyForce( std::vector<double>& forces ) override { return false; } 66 : }; 67 : 68 : inline 69 : void AveragingVessel::setDataElement( const unsigned& myelem, const double& value ) { 70 : plumed_dbg_assert( myelem<1+data.size() ); 71 154208 : wascleared=false; data[1+myelem]=value; 72 : } 73 : 74 : inline 75 : void AveragingVessel::addDataElement( const unsigned& myelem, const double& value ) { 76 : plumed_dbg_assert( myelem<1+data.size() ); 77 58119 : wascleared=false; data[1+myelem]+=value; 78 : } 79 : 80 : inline 81 7999099 : double AveragingVessel::getDataElement( const unsigned& myelem ) const { 82 : plumed_dbg_assert( myelem<data.size()-1 ); 83 7999099 : if( unormalised ) return data[1+myelem]; 84 1851211 : return data[1+myelem] / data[0]; 85 : } 86 : 87 : inline 88 : void AveragingVessel::setNorm( const double& snorm ) { 89 : plumed_dbg_assert( data.size()>0 ); 90 1389 : data[0]=snorm; 91 27 : } 92 : 93 : inline 94 : double AveragingVessel::getNorm() const { 95 : plumed_dbg_assert( data.size()>0 ); 96 104745 : return data[0]; 97 : } 98 : 99 : } 100 : } 101 : #endif