diff --git a/CHANGES/v2.3.txt b/CHANGES/v2.3.txt index d5aa9352d26b82e48f3bb88ad164a50f43d49a5e..b2586b9e3053fa92aa0801743ce246c9b56aa394 100644 --- a/CHANGES/v2.3.txt +++ b/CHANGES/v2.3.txt @@ -160,6 +160,7 @@ See branch \branch{v2.3} on git repository. - Prevented users from causing segfaults by storing derivatives without LOWMEM flag. In these caess PLUMED crashes with meaningful errors. - Fixed bug in \ref HISTOGRAM that causes nans when using KERNEL=DISCRETE option - Fixed a bug in the parser related to braces, see \issue{229} +- Fixed a bug that appeared when using \ref Q3, \ref Q4 and \ref Q6 with LOWEST or HIGHEST flag For developers: - plumedcheck validation has been made stricter. All the checks are now described in the developer manual. diff --git a/regtest/crystallization/rt-q6/colv.reference b/regtest/crystallization/rt-q6/colv.reference index 8d69c80ee2192c76108352c9c7255dee723a579b..320d6162236a8580640400b282a440620d62fb12 100644 --- a/regtest/crystallization/rt-q6/colv.reference +++ b/regtest/crystallization/rt-q6/colv.reference @@ -1,2 +1,2 @@ -#! FIELDS time q6.mean - 0.000000 0.245096 +#! FIELDS time q6.mean q6.lowest + 0.000000 0.245096 0.150123 diff --git a/regtest/crystallization/rt-q6/plumed.dat b/regtest/crystallization/rt-q6/plumed.dat index f09db50863178d3da093fdb70496de4401793b76..d107217876b4cb22783e894547bae7bb623d4e55 100644 --- a/regtest/crystallization/rt-q6/plumed.dat +++ b/regtest/crystallization/rt-q6/plumed.dat @@ -3,10 +3,10 @@ COORDINATIONNUMBER SPECIES=1-64 SWITCH={RATIONAL D_0=3.0 R_0=1.5} MEAN LABEL=c PRINT ARG=c.* FILE=colv2 DUMPDERIVATIVES ARG=c.* FILE=deriv2 FMT=%8.4f -Q6 SPECIES=1-64 D_0=3.0 R_0=1.5 MEAN LABEL=q6 +Q6 SPECIES=1-64 D_0=3.0 R_0=1.5 MEAN LOWEST LABEL=q6 # Q6 SPECIES=1-64 D_0=3.0 R_0=1.5 MEAN NUMERICAL_DERIVATIVES LABEL=q6n PRINT ARG=q6.* FILE=colv -DUMPDERIVATIVES ARG=q6.* FILE=deriv FMT=%8.4f +DUMPDERIVATIVES ARG=q6.mean FILE=deriv FMT=%8.4f Q4 SPECIES=1-64 D_0=3.0 R_0=1.5 MEAN LABEL=q4 # Q4 SPECIES=1-64 D_0=3.0 R_0=1.5 MEAN NUMERICAL_DERIVATIVES LABEL=q4n diff --git a/src/vesselbase/StoreDataVessel.cpp b/src/vesselbase/StoreDataVessel.cpp index 447299dc6db2587f5928a7fb7147ccc0ec1cb39f..d33efc15a4bc1f1ff66cdb555167311ea3e11c27 100644 --- a/src/vesselbase/StoreDataVessel.cpp +++ b/src/vesselbase/StoreDataVessel.cpp @@ -37,8 +37,6 @@ StoreDataVessel::StoreDataVessel( const VesselOptions& da ): ActionWithValue* myval=dynamic_cast<ActionWithValue*>( getAction() ); if( !myval ) hasderiv=false; else hasderiv=!myval->doNotCalculateDerivatives(); - - vecsize=getAction()->getNumberOfQuantities(); } void StoreDataVessel::addActionThatUses( ActionWithVessel* actionThatUses ) { @@ -46,8 +44,6 @@ void StoreDataVessel::addActionThatUses( ActionWithVessel* actionThatUses ) { } void StoreDataVessel::resize() { - plumed_dbg_assert( vecsize>0 ); - if( getAction()->lowmem || !getAction()->derivativesAreRequired() ) { nspace = 1; active_der.resize( max_lowmem_stash * ( 1 + getAction()->getNumberOfDerivatives() ) ); @@ -58,6 +54,7 @@ void StoreDataVessel::resize() { nspace = 1 + getAction()->maxderivatives; active_der.resize( getNumberOfStoredValues() * ( 1 + getAction()->maxderivatives ) ); } + vecsize=getAction()->getNumberOfQuantities(); resizeBuffer( getNumberOfStoredValues()*vecsize*nspace ); local_buffer.resize( getNumberOfStoredValues()*vecsize*nspace ); } @@ -102,14 +99,14 @@ void StoreDataVessel::storeDerivatives( const unsigned& myelem, MultiValue& myva } void StoreDataVessel::retrieveSequentialValue( const unsigned& jelem, const bool& normed, std::vector<double>& values ) const { - plumed_assert( values.size()==vecsize ); + plumed_dbg_assert( values.size()==vecsize ); unsigned ibuf = jelem * vecsize * nspace; for(unsigned i=0; i<vecsize; ++i) { values[i]=local_buffer[ibuf]; ibuf+=nspace; } if( normed && values.size()>2 ) getAction()->normalizeVector( values ); } void StoreDataVessel::retrieveValueWithIndex( const unsigned& myelem, const bool& normed, std::vector<double>& values ) const { - plumed_assert( values.size()==vecsize ); + plumed_dbg_assert( values.size()==vecsize ); unsigned jelem = getStoreIndex( myelem ); retrieveSequentialValue( jelem, normed, values ); }