Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 : Copyright (c) 2013-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_FunctionVessel_h 23 : #define __PLUMED_vesselbase_FunctionVessel_h 24 : 25 : #include <string> 26 : #include <cstring> 27 : #include <vector> 28 : #include "ValueVessel.h" 29 : #include "core/Value.h" 30 : 31 : namespace PLMD { 32 : namespace vesselbase { 33 : 34 : /** 35 : \ingroup TOOLBOX 36 : Objects that inherit from FunctionVessel can be used (in tandem with PLMD::vesselbase::ActionWithVessel) to calculate 37 : functions of the form \f$\prod_k H_k[ \sum_j \prod_i g_i(x) ]\f$. They should take in a series of values 38 : and return one single value. 39 : */ 40 : 41 0 : class FunctionVessel : public ValueVessel { 42 : protected: 43 : /// Are the derivatives differentiable 44 : bool diffweight; 45 : /// Are we normalising by the weight 46 : bool norm; 47 : /// Are we using the tolerance 48 : bool usetol; 49 : public: 50 : static void registerKeywords( Keywords& keys ); 51 : explicit FunctionVessel( const VesselOptions& ); 52 : /// This does the resizing of the buffer 53 : void resize() override; 54 : /// Do the calcualtion 55 : void calculate( const unsigned& current, MultiValue& myvals, std::vector<double>& buffer, std::vector<unsigned>& der_list ) const override; 56 : /// Do any transformations of the value that are required 57 : virtual double calcTransform( const double& val, double& df ) const ; 58 : /// Finish the calculation of the quantity 59 : void finish( const std::vector<double>& buffer ) override; 60 : /// Finish with any transforms required 61 : virtual double finalTransform( const double& val, double& dv ); 62 : }; 63 : 64 : } 65 : } 66 : #endif