Line data Source code
1 : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 : Copyright (c) 2013-2019 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 303 : 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 : virtual void resize();
54 : /// Do the calcualtion
55 : virtual void calculate( const unsigned& current, MultiValue& myvals, std::vector<double>& buffer, std::vector<unsigned>& der_list ) const ;
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 : virtual void finish( const std::vector<double>& buffer );
60 : /// Finish with any transforms required
61 : virtual double finalTransform( const double& val, double& dv );
62 : };
63 :
64 : }
65 : }
66 : #endif
|