From dcd82585c8c37562e6770bf9445063f82fcb1f59 Mon Sep 17 00:00:00 2001 From: Carlo Camilloni <carlo.camilloni@gmail.com> Date: Thu, 22 May 2014 15:56:18 +0200 Subject: [PATCH] CS2Backbone: small changes for better performacens (maybe) --- src/colvar/CS2Backbone.cpp | 57 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/src/colvar/CS2Backbone.cpp b/src/colvar/CS2Backbone.cpp index d21ad75f0..2d0084c78 100644 --- a/src/colvar/CS2Backbone.cpp +++ b/src/colvar/CS2Backbone.cpp @@ -141,15 +141,17 @@ PRINT ARG=cs class CS2Backbone : public Colvar { vector<CamShift2> cam_list; Molecules molecules; - int numResidues; - int pperiod; - int ens_dim; + unsigned numResidues; + unsigned pperiod; + unsigned ens_dim; bool ensemble; bool serial; double **sh; double ene_pl2alm; double len_pl2alm; double for_pl2alm; + Coor<double> coor; + Coor<double> csforces; public: CS2Backbone(const ActionOptions&); ~CS2Backbone(); @@ -200,7 +202,7 @@ PLUMED_COLVAR_INIT(ao) int neigh_f=10; parse("NEIGH_FREQ", neigh_f); - int w_period=0; + unsigned w_period=0; parse("WRITE_CS", w_period); pperiod=w_period; @@ -309,7 +311,7 @@ PLUMED_COLVAR_INIT(ao) if(stride>1) log.printf(" Parallelized over %u processors\n", stride); a.set_mpi(stride, rank); - if(ensemble) { log.printf(" ENSEMBLE averaging over %i replicas\n", ens_dim); } + if(ensemble) { log.printf(" ENSEMBLE averaging over %u replicas\n", ens_dim); } a.set_flat_bottom_const(grains); a.set_box_nupdate(neigh_f); @@ -318,7 +320,7 @@ PLUMED_COLVAR_INIT(ao) sh = new double*[numResidues]; sh[0] = new double[numResidues*6]; - for (int i=1; i<numResidues; i++) sh[i]=sh[i-1]+6; + for(unsigned i=1;i<numResidues;i++) sh[i]=sh[i-1]+6; /* Energy and Lenght conversion */ ene_pl2alm = 4.186/plumed.getAtoms().getUnits().getEnergy(); @@ -336,6 +338,10 @@ PLUMED_COLVAR_INIT(ao) <<plumed.cite("Kohlhoff K, Robustelli P, Cavalli A, Salvatella A, Vendruscolo M, J. Am. Chem. Soc. 131, 13894 (2009)") <<plumed.cite("Camilloni C, Robustelli P, De Simone A, Cavalli A, Vendruscolo M, J. Am. Chem. Soc. 134, 3968 (2012)") <<"\n"; + + coor.resize(atoms.size()); + csforces.resize(atoms.size()); + addValueWithDerivatives(); setNotPeriodic(); requestAtoms(atoms); @@ -348,23 +354,18 @@ CS2Backbone::~CS2Backbone() delete[] sh; } - void CS2Backbone::calculate() { double energy=0.; Tensor virial; - virial.zero(); vector<Vector> deriv(getNumberOfAtoms()); - int N = getNumberOfAtoms(); - Coor<double> coor(N); - Coor<double> forces(N); + unsigned N = getNumberOfAtoms(); - forces.clear(); - for(int i=0; i<numResidues; i++) for(unsigned j=0; j<6; j++) sh[i][j]=0.; + for(unsigned i=0;i<numResidues;i++) for(unsigned j=0;j<6;j++) sh[i][j]=0.; if(getExchangeStep()) cam_list[0].set_box_count(0); - for (int i = 0; i < N; i++) { - int ipos = 4 * i; + for (unsigned i=0;i<N;i++) { + unsigned ipos = 4*i; Vector Pos = getPosition(i); coor.coor[ipos] = len_pl2alm*Pos[0]; coor.coor[ipos+1] = len_pl2alm*Pos[1]; @@ -394,28 +395,28 @@ void CS2Backbone::calculate() if(comm.Get_rank()==0) { // I am the master of my replica // among replicas multi_sim_comm.Sum(&sh[0][0], numResidues*6); - multi_sim_comm.Barrier(); - for(unsigned i=0;i<6;i++) for(int j=0;j<numResidues;j++) sh[j][i] *= fact; - } else for(unsigned i=0;i<6;i++) for(int j=0;j<numResidues;j++) sh[j][i] = 0.; + for(unsigned i=0;i<6;i++) for(unsigned j=0;j<numResidues;j++) sh[j][i] *= fact; + } else for(unsigned i=0;i<6;i++) for(unsigned j=0;j<numResidues;j++) sh[j][i] = 0.; // inside each replica comm.Sum(&sh[0][0], numResidues*6); } - energy = cam_list[0].ens_energy_force(coor, forces, sh); - if(!serial) comm.Sum(&forces[0][0], N*4); + csforces.clear(); + energy = cam_list[0].ens_energy_force(coor, csforces, sh); + if(!serial) comm.Sum(&csforces[0][0], N*4); - for (int i = 0; i < N; i++) + virial.zero(); + for(unsigned i=0;i<N;i++) { - Vector For; - int ipos = 4 * i; - For[0] = forces.coor[ipos]; - For[1] = forces.coor[ipos+1]; - For[2] = forces.coor[ipos+2]; - deriv[i] = fact*for_pl2alm*For; + unsigned ipos=4*i; + double ff=fact*for_pl2alm; + deriv[i][0] = ff*csforces.coor[ipos]; + deriv[i][1] = ff*csforces.coor[ipos+1]; + deriv[i][2] = ff*csforces.coor[ipos+2]; + setAtomsDerivatives(i,deriv[i]); virial=virial+(-1.*Tensor(getPosition(i),deriv[i])); } - for(unsigned i=0;i<getNumberOfAtoms();++i) setAtomsDerivatives(i,deriv[i]); setValue (ene_pl2alm*energy); setBoxDerivatives (virial); } -- GitLab