1 #include "FrictionExtendedForce.h"
2 #include "Vector3DBlock.h"
3 #include "GenericTopology.h"
4 #include "Parallel.h"
5 
6 using std::vector;
7 using std::string;
8 using namespace ProtoMol::Report;
9 
10 namespace ProtoMol {
11   //_________________________________________________________________ FrictionExtendedForce
12 
13 
14 
15   const string FrictionExtendedForce::keyword("Friction");
16 
FrictionExtendedForce()17   FrictionExtendedForce::FrictionExtendedForce():ExtendedForce(),myF(0.0), myRnd(Vector3D(0.0,0.0,0.0)){}
18 
19 
FrictionExtendedForce(Real f,const Vector3D & random)20   FrictionExtendedForce::FrictionExtendedForce(Real f, const Vector3D& random):ExtendedForce(),myF(f), myRnd(random){}
21 
22 
getParameters(vector<Parameter> & parameters) const23   void FrictionExtendedForce::getParameters(vector<Parameter>& parameters) const {
24     parameters.push_back(Parameter("-k",Value(myF),0.0));
25     parameters.push_back(Parameter("-rnd",Value(myRnd),Vector3D(0.0,0.0,0.0)));
26   }
27 
28 
doMake(string &,vector<Value> values) const29   Force* FrictionExtendedForce::doMake(string&, vector<Value> values) const {
30     return new FrictionExtendedForce(values[0],values[1]);
31   }
32 
evaluate(const GenericTopology * topo,const Vector3DBlock * positions,const Vector3DBlock * velocities,Vector3DBlock * forces,ScalarStructure * energies)33   void FrictionExtendedForce::evaluate(const GenericTopology* topo,
34 				       const Vector3DBlock* positions,
35 				       const Vector3DBlock* velocities,
36 				       Vector3DBlock* forces,
37 				       ScalarStructure* energies){
38     doEvaluate(topo,positions,velocities,forces,energies,0,positions->size());
39   }
40 
41 
parallelEvaluate(const GenericTopology * topo,const Vector3DBlock * positions,const Vector3DBlock * velocities,Vector3DBlock * forces,ScalarStructure * energies)42   void FrictionExtendedForce::parallelEvaluate(const GenericTopology* topo,
43 					       const Vector3DBlock* positions,
44 					       const Vector3DBlock* velocities,
45 					       Vector3DBlock* forces,
46 					       ScalarStructure* energies){
47     unsigned int n = positions->size();
48     unsigned int count = numberOfBlocks(topo,positions);
49 
50     for(unsigned int i = 0;i<count;i++){
51       if(Parallel::next()){
52 	int to = (n*(i+1))/count;
53 	if(to > (int)n)
54 	  to = n;
55 	int from = (n*i)/count;
56 	doEvaluate(topo,positions,velocities,forces,energies,from,to);
57       }
58     }
59   }
60 
61 
doEvaluate(const GenericTopology *,const Vector3DBlock *,const Vector3DBlock * velocities,Vector3DBlock * forces,ScalarStructure *,int from,int to)62   void FrictionExtendedForce::doEvaluate(const GenericTopology*,
63 					 const Vector3DBlock* /*positions*/,
64 					 const Vector3DBlock* velocities,
65 					 Vector3DBlock* forces,
66 					 ScalarStructure* ,
67 					 int from, int to){
68     for(int i=from;i<to;i++){
69       (*forces)[i].x += (*velocities)[i].x*myF + (randomNumber()-.5)*myRnd.x;
70       (*forces)[i].y += (*velocities)[i].y*myF + (randomNumber()-.5)*myRnd.y;
71       (*forces)[i].z += (*velocities)[i].z*myF + (randomNumber()-.5)*myRnd.z;
72     }
73   }
74 
75 
numberOfBlocks(const GenericTopology *,const Vector3DBlock * pos)76   unsigned int FrictionExtendedForce::numberOfBlocks(const GenericTopology*,
77 						     const Vector3DBlock* pos){
78     return std::min(static_cast<unsigned int>(Parallel::getAvailableNum()),static_cast<unsigned int>(pos->size()));
79   }
80 
81 }
82