LCOV - code coverage report
Current view: top level - vesselbase - ActionWithInputVessel.cpp (source / functions) Hit Total Coverage
Test: plumed test coverage Lines: 32 37 86.5 %
Date: 2024-10-11 08:09:47 Functions: 4 6 66.7 %

          Line data    Source code
       1             : /* +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
       2             :    Copyright (c) 2014-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             : #include "ActionWithInputVessel.h"
      23             : #include "StoreDataVessel.h"
      24             : #include "BridgeVessel.h"
      25             : #include "core/PlumedMain.h"
      26             : #include "core/ActionSet.h"
      27             : 
      28             : namespace PLMD {
      29             : namespace vesselbase {
      30             : 
      31          27 : void ActionWithInputVessel::registerKeywords(Keywords& keys) {
      32          54 :   keys.add("compulsory","DATA","certain actions in plumed work by calculating a list of variables and summing over them. "
      33             :            "This particular action can be used to calculate functions of these base variables or prints "
      34             :            "them to a file. This keyword thus takes the label of one of those such variables as input.");
      35          54 :   keys.reserve("compulsory","GRID","the action that creates the input grid you would like to use");
      36          27 : }
      37             : 
      38          24 : ActionWithInputVessel::ActionWithInputVessel(const ActionOptions&ao):
      39             :   Action(ao),
      40          24 :   arguments(NULL),
      41          24 :   myBridgeVessel(NULL)
      42             : {
      43          24 : }
      44             : 
      45          24 : void ActionWithInputVessel::readArgument( const std::string& type ) {
      46             :   std::string mlab;
      47          96 :   if( keywords.exists("DATA") && type!="grid" ) parse("DATA",mlab);
      48          24 :   ActionWithVessel* mves= plumed.getActionSet().selectWithLabel<ActionWithVessel*>(mlab);
      49          24 :   if(!mves) error("action labelled " +  mlab + " does not exist or does not have vessels");
      50          24 :   addDependency(mves);
      51             : 
      52          24 :   ActionWithValue* aval=dynamic_cast<ActionWithValue*>( this );
      53          24 :   if(aval) {
      54           2 :     if( aval->checkNumericalDerivatives() ) {
      55           1 :       ActionWithValue* aval2=dynamic_cast<ActionWithValue*>( mves );
      56           1 :       plumed_assert( aval2 ); aval2->useNumericalDerivatives();
      57             :     }
      58             :   }
      59             : 
      60          24 :   if( type=="bridge" ) {
      61           2 :     ActionWithVessel* aves=dynamic_cast<ActionWithVessel*>( this );
      62           2 :     plumed_assert(aves); myBridgeVessel = mves->addBridgingVessel( aves );
      63           2 :     arguments = dynamic_cast<Vessel*>( myBridgeVessel );
      64          22 :   } else  if( type=="store" ) {
      65          22 :     arguments = dynamic_cast<Vessel*>( mves->buildDataStashes( NULL ) );
      66             :   } else {
      67           0 :     plumed_error();
      68             :   }
      69          24 : }
      70             : 
      71           5 : void ActionWithInputVessel::calculateNumericalDerivatives( ActionWithValue* a ) {
      72           5 :   if(!a) {
      73           5 :     a=dynamic_cast<ActionWithValue*>(this);
      74           5 :     plumed_massert(a,"cannot compute numerical derivatives for an action without values");
      75             :   }
      76           5 :   if( myBridgeVessel ) {
      77           5 :     myBridgeVessel->completeNumericalDerivatives();
      78             :   } else {
      79           0 :     error("numerical derivatives are not implemented");
      80             :   }
      81           5 : }
      82             : 
      83           0 : void ActionWithInputVessel::applyBridgeForces( const std::vector<double>& bb ) {
      84           0 :   plumed_dbg_assert( myBridgeVessel ); addBridgeForces( bb );
      85           0 : }
      86             : 
      87             : }
      88             : }

Generated by: LCOV version 1.15