From d1d97b788aa110f517e4fef305205f0500abfcd3 Mon Sep 17 00:00:00 2001 From: Gareth Tribello <gareth.tribello@gmail.com> Date: Sun, 6 Dec 2015 16:01:56 +0000 Subject: [PATCH] Fixed cluster diameter business and added test --- regtest/adjmat/rt-dfg2/plumed.dat | 3 ++- regtest/adjmat/rt-dfg2/size.reference | 4 ++-- src/adjmat/ClusterAnalysisBase.cpp | 6 ------ src/adjmat/ClusterDiameter.cpp | 20 ++++---------------- src/adjmat/ClusterDistribution.cpp | 7 +++++-- src/adjmat/ClusterProperties.cpp | 7 +++++-- src/adjmat/ClusterSize.cpp | 5 ++++- 7 files changed, 22 insertions(+), 30 deletions(-) diff --git a/regtest/adjmat/rt-dfg2/plumed.dat b/regtest/adjmat/rt-dfg2/plumed.dat index 7ec486832..8cc97a833 100644 --- a/regtest/adjmat/rt-dfg2/plumed.dat +++ b/regtest/adjmat/rt-dfg2/plumed.dat @@ -12,6 +12,7 @@ OUTPUT_CLUSTER CLUSTERS=dfs CLUSTER=1 FILE=dfs.dat clust2a: CLUSTER_WITHSURFACE CLUSTERS=dfs RCUT_SURF=0.3 size2a: CLUSTER_NATOMS CLUSTERS=clust2a CLUSTER=2 +dia2a: CLUSTER_DIAMETER CLUSTERS=clust2a CLUSTER=2 OUTPUT_CLUSTER CLUSTERS=clust2a CLUSTER=2 FILE=dfs2.dat -PRINT ARG=size2a FILE=size +PRINT ARG=size2a,dia2a FILE=size FMT=%8.4f diff --git a/regtest/adjmat/rt-dfg2/size.reference b/regtest/adjmat/rt-dfg2/size.reference index 180f9d2e4..0ed52ef58 100644 --- a/regtest/adjmat/rt-dfg2/size.reference +++ b/regtest/adjmat/rt-dfg2/size.reference @@ -1,2 +1,2 @@ -#! FIELDS time size2a - 0.000000 78.000000 +#! FIELDS time size2a dia2a + 0.000000 78.0000 2.3294 diff --git a/src/adjmat/ClusterAnalysisBase.cpp b/src/adjmat/ClusterAnalysisBase.cpp index e92367e92..1b92aca9d 100644 --- a/src/adjmat/ClusterAnalysisBase.cpp +++ b/src/adjmat/ClusterAnalysisBase.cpp @@ -41,12 +41,6 @@ myclusters(NULL) if(!found_cluster) error("unable to interpret input clusters " + matname[0] ); myclusters = dynamic_cast<ClusteringBase*>( mybasemulticolvars[0] ); if( !myclusters ) error("input label is not that of a DFS object"); - - // Create all tasks by copying those from underlying DFS object (which is actually MultiColvar) - for(unsigned i=0;i<myclusters->getNumberOfNodes();++i) addTaskToList(i); - - // And now finish the setup of everything in the base - setupAtomLists(); } void ClusterAnalysisBase::turnOnDerivatives(){ diff --git a/src/adjmat/ClusterDiameter.cpp b/src/adjmat/ClusterDiameter.cpp index f250e0afb..af37292ec 100644 --- a/src/adjmat/ClusterDiameter.cpp +++ b/src/adjmat/ClusterDiameter.cpp @@ -72,7 +72,7 @@ ClusterAnalysisBase(ao) for(unsigned j=0;j<i;++j) addTaskToList( i*getNumberOfNodes() + j ); } // Now create a higest vessel - addVessel("HIGHEST", "", -1); readVesselKeywords(); + addVessel("HIGHEST", "", -1); setupAtomLists(); } void ClusterDiameter::turnOnDerivatives(){ @@ -93,22 +93,10 @@ void ClusterDiameter::calculate(){ } void ClusterDiameter::performTask( const unsigned& task_index, const unsigned& current, MultiValue& myvals ) const { - unsigned iatom=current/getNumberOfNodes(), jatom = current - iatom*getNumberOfNodes(); + unsigned iatom=std::floor(current/getNumberOfNodes()), jatom = current - iatom*getNumberOfNodes(); Vector distance=getSeparation( getPosition(iatom), getPosition(jatom) ); - double dd = distance.modulo(), inv = 1.0/dd ; myvals.setValue( 1, dd ); - if( !doNotCalculateDerivatives() ){ - myvals.addDerivative( 1, 3*iatom + 0, -inv*distance[0] ); - myvals.addDerivative( 1, 3*iatom + 1, -inv*distance[1] ); - myvals.addDerivative( 1, 3*iatom + 2, -inv*distance[2] ); - myvals.addDerivative( 1, 3*jatom + 0, +inv*distance[0] ); - myvals.addDerivative( 1, 3*jatom + 1, +inv*distance[1] ); - myvals.addDerivative( 1, 3*jatom + 2, +inv*distance[2] ); - Tensor vir = -inv*Tensor(distance,distance); - unsigned vbase = myvals.getNumberOfDerivatives() - 9; - for(unsigned i=0;i<3;++i){ - for(unsigned j=0;j<3;++j) myvals.addDerivative( 1, vbase+3*i+j, vir(i,j) ); - } - } + double dd = distance.modulo(), inv = 1.0/dd ; + myvals.setValue( 0, 1.0 ); myvals.setValue( 1, dd ); } } diff --git a/src/adjmat/ClusterDistribution.cpp b/src/adjmat/ClusterDistribution.cpp index 14810ede9..38f487095 100644 --- a/src/adjmat/ClusterDistribution.cpp +++ b/src/adjmat/ClusterDistribution.cpp @@ -78,8 +78,11 @@ nderivatives(0) parseFlag("INVERSE_TRANSFORM",inverse); if( inverse && !use_switch ) error("INVERSE_TRANSFORM option was specified but no TRANSOFRM switching function was given"); - // Setup the various things this will calculate - readVesselKeywords(); + // Create all tasks by copying those from underlying DFS object (which is actually MultiColvar) + for(unsigned i=0;i<getNumberOfNodes();++i) addTaskToList(i); + + // And now finish the setup of everything in the base + setupAtomLists(); } void ClusterDistribution::calculate(){ diff --git a/src/adjmat/ClusterProperties.cpp b/src/adjmat/ClusterProperties.cpp index c7a7f7c5c..5e8a889bb 100644 --- a/src/adjmat/ClusterProperties.cpp +++ b/src/adjmat/ClusterProperties.cpp @@ -165,8 +165,11 @@ ClusterAnalysisBase(ao) if( clustr<1 ) error("cannot look for a cluster larger than the largest cluster"); if( clustr>getNumberOfNodes() ) error("cluster selected is invalid - too few atoms in system"); - // Setup the various things this will calculate - readVesselKeywords(); + // Create all tasks by copying those from underlying DFS object (which is actually MultiColvar) + for(unsigned i=0;i<getNumberOfNodes();++i) addTaskToList(i); + + // And now finish the setup of everything in the base + setupAtomLists(); } void ClusterProperties::calculate(){ diff --git a/src/adjmat/ClusterSize.cpp b/src/adjmat/ClusterSize.cpp index 5ae3eb1f4..a636dce71 100644 --- a/src/adjmat/ClusterSize.cpp +++ b/src/adjmat/ClusterSize.cpp @@ -68,7 +68,10 @@ ClusterAnalysisBase(ao) if( clustr<1 ) error("cannot look for a cluster larger than the largest cluster"); if( clustr>getNumberOfNodes() ) error("cluster selected is invalid - too few atoms in system"); - addValue(); setNotPeriodic(); + // Create all tasks by copying those from underlying DFS object (which is actually MultiColvar) + for(unsigned i=0;i<getNumberOfNodes();++i) addTaskToList(i); + // And now finish the setup of everything in the base + setupAtomLists(); addValue(); setNotPeriodic(); } void ClusterSize::turnOnDerivatives(){ -- GitLab