PLUMED 学习( 1 )

来源:互联网 发布:win10打开软件 编辑:程序博客网 时间:2024/05/30 04:16

SimpleMD

这篇文章里,我们解析 simplemd 的源代码,以试图理解plumed如何工作的。作为练习加入leapfrog 迭代格式。文件位置为

plumed2/src/cltools/SimpleMD.cpp

整体的类的依赖关系可从下面代码片段看出,

namespace PLMD{namespace cltools{    class SimpleMD:public PLMD:CLTool{        ...    };PLUMED_REGISTER_CLTOOL(SimpleMD,"simplemd")}}

CLTool 是一个抽象类,用来继承和基于命令行的tool,simplemd就是一个例子。上面的代码中, PLUMED_REGISTER_CLTOOL 是用来定义该类对应的Register类,以用来指定调用 SimpleMD 的命令。此宏定义在

plumed2/src/core/CLToolRegister.h

其定义如下

#define PLUMED_REGISTER_CLTOOL(classname,directive) \  static class classname##RegisterMe{ \    static PLMD::CLTool* create(const PLMD::CLToolOptions&ao){return new classname(ao);} \  public: \    classname##RegisterMe(){PLMD::cltoolRegister().add(directive,create,classname::registerKeywords);} \    ~classname##RegisterMe(){PLMD::cltoolRegister().remove(create);} \  } classname##RegisterMeObject;

其中##表示连接左右的字符。这个类包含的成员method列表如下

string description()const;public:    static void registerKeywords(Keywords& keys);    SimpleMD(const CLToolOptions& co);    void input();    void read_natoms(const string&,int& natom);    void read_positions(...);    void randomize_velocities(...)    void pbc(...)    void check_list(...)    void compute_list(...)    void compute_forces(...)    void compute_engkin(...)    void thermostat(...)    void write_position(...)    void write_final_position(...)    void write_statistics(...)    virtual int main(FILE* in,FILE* out,PLMD:Communicator)

可见其中main函数是虚函数,所以如果我们自己加如新的算法的可以继承SimpleMD,重写 main即可。当然也可以直接修改SimpleMD.cpp的代码,但是前者更加简洁,同时不用修改原来的代码。 使用 integrator vv/leapfrog 去选择迭代格式

0 0