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