Skip to content

Commit

Permalink
Small speedup when calculating matrices without using derivatives
Browse files Browse the repository at this point in the history
Derivatives do not need to be cleared in these cases so we avoid clearing them now.
  • Loading branch information
Gareth Aneurin Tribello authored and Gareth Aneurin Tribello committed Jul 11, 2024
1 parent 22853c0 commit 6ceb747
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 4 deletions.
5 changes: 3 additions & 2 deletions src/adjmat/AdjacencyMatrixBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ AdjacencyMatrixBase::AdjacencyMatrixBase(const ActionOptions& ao):
neighbour_list_updated(false),
linkcells(comm),
threecells(comm),
maxcol(0),
natoms_per_list(0)
{
std::vector<unsigned> shape(2); std::vector<AtomNumber> t; parseAtomList("GROUP", t );
Expand Down Expand Up @@ -291,9 +292,9 @@ void AdjacencyMatrixBase::setupForTask( const unsigned& current, std::vector<uns
void AdjacencyMatrixBase::performTask( const std::string& controller, const unsigned& index1, const unsigned& index2, MultiValue& myvals ) const {
Vector zero; zero.zero(); plumed_dbg_assert( index2<myvals.getAtomVector().size() );
double weight = calculateWeight( zero, myvals.getAtomVector()[index2], myvals.getNumberOfIndices()-myvals.getSplitIndex(), myvals );
if( fabs(weight)<epsilon ) return;

unsigned w_ind = getConstPntrToComponent(0)->getPositionInStream(); myvals.setValue( w_ind, weight );
if( fabs(weight)<epsilon ) { myvals.setValue( w_ind, 0 ); return; }

if( !doNotCalculateDerivatives() ) {
// Update dynamic list indices for central atom
myvals.updateIndex( w_ind, 3*index1+0 ); myvals.updateIndex( w_ind, 3*index1+1 ); myvals.updateIndex( w_ind, 3*index1+2 );
Expand Down
13 changes: 11 additions & 2 deletions src/core/ActionWithMatrix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ ActionWithMatrix::ActionWithMatrix(const ActionOptions&ao):
ActionWithVector(ao),
next_action_in_chain(NULL),
matrix_to_do_before(NULL),
matrix_to_do_after(NULL)
matrix_to_do_after(NULL),
clearOnEachCycle(true)
{
}

Expand Down Expand Up @@ -62,6 +63,14 @@ void ActionWithMatrix::setupStreamedComponents( const std::string& headstr, unsi
myval->setMatrixBookeepingStart(nbookeeping);
nbookeeping += myval->getShape()[0]*( 1 + myval->getNumberOfColumns() );
}
// Turn off clearning of derivatives after each matrix run if there are no matrices in the output of this action
clearOnEachCycle = false;
for(int i=0; i<getNumberOfComponents(); ++i) {
const Value* myval=getConstPntrToComponent(i);
if( myval->getRank()==2 && !myval->hasDerivatives() ) { clearOnEachCycle = true; break; }
}
// Turn off clearing of derivatives if we have only the values of adjacency matrices
if( doNotCalculateDerivatives() && isAdjacencyMatrix() ) clearOnEachCycle = false;
}

void ActionWithMatrix::finishChainBuild( ActionWithVector* act ) {
Expand Down Expand Up @@ -222,7 +231,7 @@ void ActionWithMatrix::gatherForcesOnStoredValue( const Value* myval, const unsi
}

void ActionWithMatrix::clearMatrixElements( MultiValue& myvals ) const {
if( isActive() ) {
if( isActive() && clearOnEachCycle ) {
for(int i=0; i<getNumberOfComponents(); ++i) {
const Value* myval=getConstPntrToComponent(i);
if( myval->getRank()==2 && !myval->hasDerivatives() ) myvals.clearDerivatives( myval->getPositionInStream() );
Expand Down
2 changes: 2 additions & 0 deletions src/core/ActionWithMatrix.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class ActionWithMatrix : public ActionWithVector {
/// This does the calculation of a particular matrix element
void runTask( const std::string& controller, const unsigned& current, const unsigned colno, MultiValue& myvals ) const ;
protected:
/// This turns off derivative clearing for contact matrix if we are not storing derivatives
bool clearOnEachCycle;
/// Does the matrix chain continue on from this action
bool matrixChainContinues() const ;
/// This returns the jelem th element of argument ic
Expand Down

1 comment on commit 6ceb747

@PlumedBot
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Found broken examples in automatic/ANGLES.tmp
Found broken examples in automatic/ANN.tmp
Found broken examples in automatic/CAVITY.tmp
Found broken examples in automatic/CLASSICAL_MDS.tmp
Found broken examples in automatic/CLUSTER_DIAMETER.tmp
Found broken examples in automatic/CLUSTER_DISTRIBUTION.tmp
Found broken examples in automatic/CLUSTER_PROPERTIES.tmp
Found broken examples in automatic/CONSTANT.tmp
Found broken examples in automatic/CONTACT_MATRIX.tmp
Found broken examples in automatic/CONTACT_MATRIX_PROPER.tmp
Found broken examples in automatic/COORDINATIONNUMBER.tmp
Found broken examples in automatic/DFSCLUSTERING.tmp
Found broken examples in automatic/DISTANCE_FROM_CONTOUR.tmp
Found broken examples in automatic/EDS.tmp
Found broken examples in automatic/EMMI.tmp
Found broken examples in automatic/ENVIRONMENTSIMILARITY.tmp
Found broken examples in automatic/FIND_CONTOUR.tmp
Found broken examples in automatic/FIND_CONTOUR_SURFACE.tmp
Found broken examples in automatic/FIND_SPHERICAL_CONTOUR.tmp
Found broken examples in automatic/FOURIER_TRANSFORM.tmp
Found broken examples in automatic/FUNCPATHGENERAL.tmp
Found broken examples in automatic/FUNCPATHMSD.tmp
Found broken examples in automatic/FUNNEL.tmp
Found broken examples in automatic/FUNNEL_PS.tmp
Found broken examples in automatic/GHBFIX.tmp
Found broken examples in automatic/GPROPERTYMAP.tmp
Found broken examples in automatic/HBOND_MATRIX.tmp
Found broken examples in automatic/INCLUDE.tmp
Found broken examples in automatic/INCYLINDER.tmp
Found broken examples in automatic/INENVELOPE.tmp
Found broken examples in automatic/INTERPOLATE_GRID.tmp
Found broken examples in automatic/LOCAL_AVERAGE.tmp
Found broken examples in automatic/MAZE_OPTIMIZER_BIAS.tmp
Found broken examples in automatic/MAZE_RANDOM_ACCELERATION_MD.tmp
Found broken examples in automatic/MAZE_SIMULATED_ANNEALING.tmp
Found broken examples in automatic/MAZE_STEERED_MD.tmp
Found broken examples in automatic/METATENSOR.tmp
Found broken examples in automatic/MULTICOLVARDENS.tmp
Found broken examples in automatic/OUTPUT_CLUSTER.tmp
Found broken examples in automatic/PAMM.tmp
Found broken examples in automatic/PCA.tmp
Found broken examples in automatic/PCAVARS.tmp
Found broken examples in automatic/PIV.tmp
Found broken examples in automatic/PLUMED.tmp
Found broken examples in automatic/PYCVINTERFACE.tmp
Found broken examples in automatic/PYTHONFUNCTION.tmp
Found broken examples in automatic/Q3.tmp
Found broken examples in automatic/Q4.tmp
Found broken examples in automatic/Q6.tmp
Found broken examples in automatic/QUATERNION.tmp
Found broken examples in automatic/SIZESHAPE_POSITION_LINEAR_PROJ.tmp
Found broken examples in automatic/SIZESHAPE_POSITION_MAHA_DIST.tmp
Found broken examples in automatic/SPRINT.tmp
Found broken examples in automatic/TETRAHEDRALPORE.tmp
Found broken examples in automatic/TORSIONS.tmp
Found broken examples in automatic/WHAM_WEIGHTS.tmp
Found broken examples in AnalysisPP.md
Found broken examples in CollectiveVariablesPP.md
Found broken examples in MiscelaneousPP.md

Please sign in to comment.