《跟随霄,LAMMPS源码学习05》Atom::new_avec()

Posted 非设限人生

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《跟随霄,LAMMPS源码学习05》Atom::new_avec()相关的知识,希望对你有一定的参考价值。

回忆到上次(04期)推文调用new_avec()的方式为:

avec = new_avec(style,trysuffix,sflag);

该函数接受三个参数,最主要的是第一个参数style,该参数表明了所要创建的原子类型;而trysuffix和sflag分别表示尝试加速和是否已经加速的标记,sflag全称为suffix flag,这里我们假设不用任何加速。

本部分代码用到了C++很多高级编程技巧如工厂模式,模板和STL。

伪代码如下[atom.cpp]:

AtomVec *Atom::new_avec(const char *style, int trysuffix, int &sflag)
{
  if (avec_map->find(style) != avec_map->end()) {
    AtomVecCreator avec_creator = (*avec_map)[style];
    return avec_creator(lmp);
  }
  error->all(FLERR,"Unknown atom style");
  return NULL;
}

代码详解:

  • new_avec()函数接受style参数,这里假设参数style=”atomic”。

  • ave_map定义为AtomVecCreatorMap类的一个实例,而其又为std::map

    类型的map。
  • ave_map通过find()来查找key=style即key=”atomic”的值是否存在,若存在,则进入if语句。

  • ave_map通过[“atomic”]进行索引查找,参数传递给AtomVecCreatorMap,即传递给std::map<”atomic”,AtomVecCreator>,在style_atom.h文件中寻找原子类型,找到后返回一个AtomVecAtomic实例并赋值给 avec_creator变量

  • lmp参数传递给avec_creator,并返回AtomVecAtomic类型的指针

  • new_avec()函数返回值为AtomVecAtomic指针,并且被avec变量接受。


ave_map定义如下:

ave_map = new AtomVecCreatorMap()

avec_creator()的定义如下:

template <typename T>
AtomVec *Atom::avec_creator(LAMMPS *lmp) {  
 return new T(lmp);
}

代码详解:

  • 工厂模式是一种实例化对象的模式,用来替代new操作。

  • map是STL的一个关联容器,可以进行快速查找工作。map对象是模板类,需要关键字和存储对象两个模板参数语法如std::map<int,string>


相关文章:




长按关注,获得更多相关内容!

感兴趣的可以研究atom.h文件中的代码加深理解:

  • 第一句:定义AtomVecCreator 为一种新的类型。这种类型可以定义一个指针,该指针可指向这样一个函数,函数的参数为LAMMPS类型的指针,函数的返回值为AtomVec类型的指针。

  • 第二句:定义AtomVecCreatorMap为一种新的类型。这种类型可以定义一个std map。map可以看成(key,value)这样键值一一对应的列表,这里定义的map的键为string类型,值为AtomVecCreator类型。

  • 第三句:定义一个指针avec_map指向AtomVecCreatorMap类型数据。

  • 第四、五句:定义一个函数avec_creator,该函数参数为LAMMPS类型的指针,返回值为AtomVec类型的指针。具体实现在上面代码中。

  class AtomVec *avec;
 typedef AtomVec *(*AtomVecCreator)(LAMMPS *);  typedef std::map<std::string,AtomVecCreator> AtomVecCreatorMap;  AtomVecCreatorMap *avec_map;  template <typename T>
 static AtomVec *avec_creator(LAMMPS *);

以上是关于《跟随霄,LAMMPS源码学习05》Atom::new_avec()的主要内容,如果未能解决你的问题,请参考以下文章

lammps 免费学习资料汇总

lammps该怎么入门?

lammps该怎么入门

请教下面l补充提问中lammps程序中参数代表啥?

如何在ubuntu上安装lammps

AMD二代霄龙实测:双路128核心256线程无情碾压